PID参数整定

  • 背景介绍
  • 硬件平台
    • 直流减速电机
    • STM32F103控制器及其外围电路
  • 软件平台
    • 虚拟示波器(平衡小车之家开发)
  • 算法简介
    • 增量式PID
    • C代码实现
  • 参数整定
    • 整定步骤
      • STEP0:整定kpkpkp
        • S0.0 测试判断kpkpkp的极性
        • S0.1 确定kpkpkp取值
      • STEP1:整定kikiki
        • S1.0 确定kikiki取值
      • STEP2:整定kdkdkd
        • S2.0 确定kdkdkd取值
  • 总结
  • 致谢

背景介绍

线控底盘作为移动机器人的重要组成部分,显得尤为重要。对于线控底盘而言,其重要技术有二。其一是底盘控制技术,其二是底盘通信技术。对于底盘控制技术而言,主要是通过对底盘的运动学建模,运用一定的算法实现对底盘的基本运动控制。常见的移动底盘的运动学模型大多为差速运动模型,即底盘通过左右轮的差速实现基本的线速度(以一定的线速度进行前后运动)、角速度(以一定的角速度进行顺时针、逆时针旋转)运动。通过对不同模型的运动学求解,可以分别得出每个驱动电机的转速值,在运动中,只要保证每个电机按照给定的转速旋转,就能实现底盘的精准运动控制。故而,电机转速精准控制就显得尤为重要。在此,主要分享一下近来我在电机转速控制方面的一点心得,愿与大家共同学习,同时也是记录自己的技术成长之路。刚开始写博客,望诸位大神多多关照!!!

硬件平台

直流减速电机

在某宝上买了一款直流减速电机,该电机自带霍尔编码器编码器,其分辨率为260线,通过4倍频处理后可将分辨率提升至1040线,该值是对于减速电机的输出轴而言,即减速电机的输出轴旋转一周,编码器产生1040个脉冲,该电机的工作电压7~13V。电机及编码器实物如下图所示:
电机及编码器实物:

STM32F103控制器及其外围电路

电机的控制器使用stm32f103的最小系统搭建,其控制电路图及控制电路实物图如下所示:
控制电路图:

控制电路实物图:

软件平台

虚拟示波器(平衡小车之家开发)

为了方便调试,使用串口通信将电机的目标转速与实际转速对应的编码器值发送至PC端(发送周期设为10ms@100Hz10ms@100Hz10ms@100Hz),并使用一个虚拟示波器(平衡小车之家开发)实时显示,使得调试变得简单、直观。虚拟示波器如下图所示:
虚拟示波器:

算法简介

增量式PID

为了实现对电机速度的控制,采用M法测速,控制周期设为10ms@100Hz,使用增量式PID算法。关于PID算法的理论,网上有很多,大家可以自行搜索。这里直接上增量式PID算法的数学离散表达式:
out=out+kp∗[e(k)−e(k−1)]+ki∗e(k)+kd∗[e(k)−2∗e(k−1)+e(k−2)]\ out = out + kp*[e(k)-e(k-1)]+ki*e(k)+kd*[e(k)-2*e(k-1)+e(k-2)] out=out+kp∗[e(k)−e(k−1)]+ki∗e(k)+kd∗[e(k)−2∗e(k−1)+e(k−2)]

C代码实现

//out += kp*[e(k)-e(k-1)]+ki*e(k)+kd*[e(k)-2*e(k-1)+e(k-2)]
int increacementPID(const int val_tar, const int val_rel)
{const float kp = 62.5; //set kp as 62.5const float ki = 5.5; //set ki as 5.5const float kd = 48; //set kd as 48static float err, err_last, err_last2 , val_cal; //define varables:err->当前偏差(e(k)), err_last->上一次偏差e(k-1), err_last2->上上次偏差(e(k-2)), val_cal->计算结果(out) err = val_rel - val_tar; //renew errval_cal += kp*(err- err_last) + ki*err+ kd*(err-2*err_last+err_last2); //calculate val_calerr_last2 = err_last; //renew err_last2err_last = err; //renew err_last//encoder varable magnitude limitedif(val_cal > enc_dc_max) val_cal = enc_dc_max; else if(val_cal < -enc_dc_max)    val_cal = -enc_dc_max;else ;return val_cal; //return result->val_cal
}

参数整定

整定思路,按照参数的整定顺序,主要分成3步:kpkpkp->kikiki->kdkdkd。即先整定kpkpkp,使系统的响应在目标值50%附近振荡;然后加入积分作用,调整kikiki,使系统的响应静差为0,此时,系统的响应仍然存在较大的超调量;最后加入微分作用,调整kdkdkd,降低系统的超调量,使系统的响应振荡消失,增强系统的抗干扰性能,平滑整个响应。

整定步骤

通过设定定时器定时10ms@100Hz10ms@100Hz10ms@100Hz,定时调用我们的增量式PID控制函数increacementPID(const int val_tar, const int val_rel),实现100Hz的控制频率。这里,我们将所有的目标转速编码值val_tar统一设为35,之后的控制都是根据这个目标值进行控制、调节。同时为了滤掉编码器测得值的噪声,我们设计了一个10阶的FIR低通滤波器对编码器的值进行数字滤波处理。

int CNT_TAR[2] = {30, 30}; //define target encoder cnt and init as 30
int CNT_REAL[2]; //define real encoder cnt
void TIM1_IRQHandler(void)  //T = 10ms@100Hz
{ static int dc;    //define the if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET){                  TIM_ClearITPendingBit(TIM1, TIM_IT_Update); //ctrl moudleCNT_REAL[0] = filter_FIR(Read_Encoder(2)); //use FIR filter to filter and renew the encoder value//pid controller->velocity loop(cnt/10ms)dc = increacementPID(CNT_TAR[0], CNT_REAL[0]); //calculate the control valuepwmSetting(dc); //set the control value to the PWM generating moudle}
}

STEP0:整定kpkpkp

在一个控制系统中,对于kpkpkp,其通常起关键作用,调好了kpkpkp,整个系统就成功了一大半。我们的目标是调整kpkpkp使得系统的响应曲线在目标值的50%处振荡。

S0.0 测试判断kpkpkp的极性

首先,我们需要测试判断kpkpkp的极性,可以先取kp=−100kp = -100kp=−100, ki=0ki = 0ki=0, kd=0kd = 0kd=0,通过虚拟示波器查看系统的响应曲线如下(注:图中黄线为目标曲线,紫线为系统响应曲线,以下响应曲线相同):
系统响应曲线图[kp=−100kp = -100kp=−100 ki=0ki = 0ki=0 kd=0kd = 0kd=0]:

通过响应曲线我们可以看出,编码器的反馈值远远偏离目标值,初始响应方向与目标值相反,且整个响应在目标值附近大幅度振荡,故而kp的极性反了,因此,我们再取kp=100kp = 100kp=100, ki=0ki = 0ki=0, kd=0kd = 0kd=0,通过虚拟示波器查看系统的响应曲线如下:
系统响应曲线图[kp=100kp = 100kp=100 ki=0ki = 0ki=0 kd=0kd = 0kd=0]:

通过响应曲线我们可以看出,编码器的反馈值与目标值方向一致,因此,kpkpkp的极性为正。

S0.1 确定kpkpkp取值

以上的kpkpkp虽然保证了其值的极性,但系统的响应存在较大的振荡。我们可以继续增大、减小kpkpkp,查看系统的响应,体会kpkpkp的作用,这里我们直接取最后的kp=62.5kp = 62.5kp=62.5, ki=0ki = 0ki=0, kd=0kd = 0kd=0,该值使得系统的响应在目标值50% 以下振荡,其响应曲线如下:
系统响应曲线图[kp=62.5kp = 62.5kp=62.5 ki=0ki = 0ki=0 kd=0kd = 0kd=0]:

至此,我们的kpkpkp算调整得差不多了,一般不需要再修改。

STEP1:整定kikiki

积分环节主要作用是消除系统的静差,通过前面的调节,我们的系统仍然存在较大的静差,因此,我们的目标就是调整kikiki,消除系统存在的静差,使系统的响应曲线与理想的目标曲线重合。

S1.0 确定kikiki取值

调整方法仍然是试凑,通过先找到kikiki的范围,然后再微调,使得系统出现最佳效果。这里,我们直接给出最终的ki=5.5ki = 5.5ki=5.5,即最终参数为kp=62.5kp = 62.5kp=62.5, ki=5.5ki = 5.5ki=5.5, kd=0kd = 0kd=0,此时的系统响应曲线如下图所示:
系统响应曲线图[kp=62.5kp = 62.5kp=62.5 ki=5.5ki = 5.5ki=5.5 kd=0kd = 0kd=0]:

通过响应曲线可以看出,加入积分作用的系统基本消除了静差,但系统仍然存在较大的超调量和轻微振荡。

STEP2:整定kdkdkd

为了降低系统的超调和振荡同时增强系统的抗干扰能力,我们加入微分环节。

S2.0 确定kdkdkd取值

在kp=62.5kp = 62.5kp=62.5, ki=5.5ki = 5.5ki=5.5的基础上,我们加入kdkdkd,使得系统的响应曲线逐渐趋向平滑,还是使用试凑的方法,先确定kdkdkd的范围,然后再逐渐微调,使得系统的响应曲线出现一个最佳的平滑效果。这里我们直接取最后的kd=48,kd = 48,kd=48,,即最终参数为kp=62.5kp = 62.5kp=62.5, ki=5.5ki = 5.5ki=5.5, kd=48kd = 48kd=48,此时的系统响应曲线如下图所示:
系统响应曲线图[kp=62.5kp = 62.5kp=62.5 ki=5.5ki = 5.5ki=5.5 kd=48kd = 48kd=48]:

通过响应曲线可以看出,整个系统的响应效果还是挺不错的。为了验证系统的抗干扰性能,我们可以给电机的输出轴(车轮)施加一定的阻力,给系统造成干扰,然后再观察系统的响应曲线如下:
加入干扰的系统响应曲线图[kp=62.5kp = 62.5kp=62.5 ki=5.5ki = 5.5ki=5.5 kd=48kd = 48kd=48]:

从该响应曲线可以看出,系统受到外界干扰后,很快又恢复到理想状态,说明系统的抗扰性能也还不错。大家可以自己计算系统的相关指标(上升时间、峰值时间、调整时间、超调量),对系统的性能(快速性、准确性、稳定性)进行评估。

总结

通过本次对直流电机转速的PID参数整定,最大的体会就是借助理论知识对实际操作进行指导,要想对理论知识有更加深刻的体会,就必须通过亲手实验。在调参过程中,我们要善于改变参数,观察系统的响应,通过系统的不同表现来体会每个参数的作用。当然,拥有一定的理论知识,更加有利于我们对参数作用的理解。通过本次调参,对于PID算法我的理解如下:比例环节决定系统响应的快速性,积分环节能够消除系统的静差,微分环节能够降低系统的超调,增强系统的抗干扰性能。

致谢

特别感谢平衡小车之家开发的虚拟示波器上位机,有了它,以后调参都会变得得心应手!
也特别感谢网上诸多关于PID调参大神的博客分享!

基于直流电机调速平台的PID参数整定心得相关推荐

  1. 基于入门级粒子群算法的PID参数整定(MATLAB2016b-simulink)(超详细01)

    PID算法作为工业或日常生活中常用的控制算法,想必大家都不陌生,依靠误差反馈来消除误差,关于PID的原理部分相比看这篇博客的同学应该都十分清楚,有不清楚的同学可以百度或知网搜索.PID算法的应用程度很 ...

  2. 基于MATLAB的数字PID直流电机调速系统

    摘要 电机的主要作用是产生驱动转矩,通常是作为电器或各种机械的动力源.直流电动机具有良好的启.制动性能,在轧钢机及流水线.电梯.汽车等领域得到了广泛应用.本文首先根据直流电机工作原理建立直流电机的数学 ...

  3. matlab数字量转电气量,基于MATLAB的数字PID直流电机调速系统.doc

    电力拖动课程设计 作 者 段发鑫 系 (院) 信息工程学院 专 业 电气工程及其自动化 年 级 2010级 学 号 K031041513 指导教师 耿东山 日 期 2013.5.5 基于MATLAB的 ...

  4. matlab直流电机pid调速仿真,基于MATLAB的数字PID直流电机调速系统的实现

    Computer Knowledge and Technology 电脑知识与技术计算机工程应用技术 本栏目责任编辑:梁书 第6卷第22期(2010年8月)基于MATLAB 的数字PID 直流电机调速 ...

  5. 嵌入式基于Linux电机控制,基于嵌入式arm+linux平台的直流电机调速控制系统.pdf

    2012--2013 学年第 二 学期 物电 学院期末考试卷 嵌入式系统与应用 学号 : 姓名 : 班级 : 成绩: 评语: 装 订 (考试题目及要求) 嵌入式大作: 采用实验箱上的电位器作为信号输入 ...

  6. 计算机控制直流电机闭环调速实验报告,电气工程及其自动化电力系统实训报告-基于PLC的直流电机调速实验.pdf...

    电气工程及其自动化电力系统实训报告-基于PLC的直流电机调速实验.pdf 华南理工大学广州汽车学院华南理工大学广州汽车学院 电力系统实训电力系统实训报告报告 设计题目设计题目基于基于 PLCPLC 的 ...

  7. 基于STM32F103的直流电机调速系统

    一.引言 电动机作为当前最主要的驱动部件,应用范围已遍及国民经济的各个领域,随着微处理器.电力电子.控制等技术的发展,电机控制技术以电力半导体变流器件的应用为基础,以电动机为控制对象,以自动控制理论为 ...

  8. matlab仿真限幅发散,基于模糊控制的直流电机调速系统MATLAB仿真_贾东耀

    基于模糊控制的直流电机调速系统MATLAB 仿真 贾东耀,曾智刚 (广东工业大学,广州市 510090) 摘 要:采用Fuzzy-PI 控制策略进行直流电机的调速系统设计,它克服了简单模糊控制和传统P ...

  9. 基于51单片机的L298N直流电机调速系统Proteus仿真程序

    基于51单片机的L298N直流电机调速系统Proteus仿真程序 本此设计选择STC89C52单片机作为主控芯片,选取带有光电编码器的直流电机作为被控对象,利用单片机的T0定时器产生PWM信号并送到直 ...

  10. 基于扰动观测器的直流电机调速系统,(售出不退慎拍!) 有计算公式,仿真模型

    基于扰动观测器的直流电机调速系统,(售出不退慎拍!) 有计算公式,仿真模型,仿真结果,ad电路图,程序 YID:69149648154053996月黑风高好办事儿

最新文章

  1. CodeMirror 5.26.0 发布,在线代码编辑器
  2. Scott Mitchell 的ASP.NET 2.0数据教程之一: 创建一个数据访问层
  3. Jzoj4209 已经没有什么好害怕的了
  4. python抓包教程_Python爬虫入门技能:教你通过 Fiddler 进行手机抓包!
  5. spring+cxf
  6. 049、准备overlay网络实验环境(2019-03-14 周四)
  7. linux 文件名带特殊符号,Linux删除含有特殊符号文件名的文件
  8. matlab 调整灰度,matlab灰度图像调整及imadjust函数的用法详解
  9. Oracle中别名长度也限得这么死!!!
  10. python安装sklearn_让机器学习自动帮我们建模,这4个Python库能让你大开眼界!
  11. 计算机仿真的特点,计算机仿真的基本特点与基本流程.doc
  12. dos下c语言读取扇区的函数,C语言编程读取主导扇区.doc
  13. JDBC驱动与MySQL版本不兼容的问题
  14. 鸿蒙内核阅读笔记-任务管理(los_task.c)
  15. 最优化方法1——各类拓扑空间与强弱紧集、下半收敛问题
  16. 2021年10月-精品总结汇报PPT模板-15套
  17. Go 青年团聚召集令,2050,我们来了
  18. CVE-2022-0847 Linux内核提权漏洞分析
  19. python求级数的值_如何在Numpy中计算Fourier级数?
  20. 介绍西西弗斯伪原创系统

热门文章

  1. 修改mysql密码后wordpress_修改数据库密码后,wordpress网站打不开
  2. WGS84 坐标系转到J2000坐标系
  3. 生物特征识别:小面积指纹识别算法(二)
  4. 服务器IO测试(Iozone使用)
  5. cad打印样式ctb丢失,CAD打印样式表如何设置?CTB和STB有何区别?
  6. 网管必用的10款软件系统
  7. 快速入门 | 篇十九:正运动技术运动控制器多轴同步与电子凸轮指令简介
  8. 再见beycond comapre,适合程序员使用的免费文件对比工具——CCompare1.14
  9. 红米7pro支持html不,可以畅快的刷机了,红米Note 7 Pro等机型适配 TWRP
  10. Unity一键自动将多个FBX文件生成AB包+又一些小玩意