赞
踩
增量式PI控制器的C语言描述:
/* ******************************************************************************************* ** 函数功能: 电机增量式速度PI控制器,根据编码器的值来不断矫正电机的速度 //左电机 ** 参 数: left_encoder:左电机编码器的值 ** left_target :左电机目标速度 ** K : 电机PID参数 ** 返 回 值: 给电机的PWM ******************************************************************************************** */ int Speed_PI_Left(int16 left_encoder,int16 left_target,MotorPID K) { static int bias,last_bias,PWM; bias=left_target-left_encoder; //求出当前偏差 PWM+=(int)(K.P*(bias-last_bias)+K.I*bias); //增量式PID,并把结果直接叠加在上一次的PWM上 last_bias=bias; //保存这一次偏差 return PWM; //返回可以直接赋值给电机的PWM }
从上面的程序可以看出,增量式PI控制器有两个特点:
一是积分项没有积分累积,其优点是只需要当前时刻和上一时刻的偏差即可计算,不需要存储每一时刻的偏差,因此占用的内存空间小,计算更快,也不需要对积分项作出限幅。直流电机的速度环控制需要频繁进行计算才能保证最大程度的匀速,且速度环目标速度一般不会有大幅度变化,和增量式PI控制器的优点完美契合;
二是保留了积分项但是抛弃了微分项,保留积分项的原因是电机是一个需要持续输出的系统(电机需要无时无刻地转动),如果没有积分项,当电机到达目标速度后,由于此时误差=0,控制器将不会再有任何输出。而电机没有了输入其速度将开始下降,当电机速度开始下降时,控制器的误差又≠0,此时控制器又开始输出控制量。这样往复振荡最终停下的速度≠目标速度,也就是产生了静差。而消除静差的方法就是加入积分项,积分项拥有“记忆”,主要用于持续跟踪过去,当稳态静差产生后,积分项将负责弥补这之间的误差。相比之下微分项的作用微乎其微,可以忽略。
Simulink是MATLAB中的一种可视化仿真工具,Simulink提供了多种仿真模块供我们选择、自主拼接。
PID Tuner是Simulink中用于自动调节PID参数的一个工具,我们可以通过直接修改波形输出曲线的形式来调节、选取PID参数。
使用PID Tuner方便快捷调参
在Simulink中搭建好上述框架后,双击PID Controller模块,点击自动调节按钮(英文版则是PID Tuner)
自动打开PID Tuner界面,简单介绍一下这个界面
System Identification(系统辨识),可以通过系统输入、输出的数据来建立动态系统数学模型。
上面介绍了如何在Simulink中搭建整个控制系统框架,以及如何使用PID Tuner自动调节控制器参数,那么还剩下最重要的——对于控制对象的仿真。在这里,我们的控制对象是直流电机,我们可以把直流电机看成一个黑匣子,不去关心其内部构造,只关心其输入与输出,而一旦我们有了其输入与输出的数据,就可以使用System Identification工具对电机进行系统辨识,得到电机的数学模型——一个传递函数。
在APP中打开System Identification
在Import data中选择Time Domain Signals,并在Input和Output中分别选择我们刚导入MATLAB工作区的PWM占空比和编码器数值两个列向量。然后在下方Sample time一项中,选择数据采集时间间隔,即定时器定时长度。最后点击Import
关闭Import Data窗口后可以看到Data Views和Working Data处都有了一条曲线,这就是我们导入的数据(如果Working Data处空白,则直接将Import Data处的曲线拖拽到Working Data处)。然后在Estimate中选择Transfer Function Models,在跳转出来的窗口中保持默认参数,点击Estimate
稍等片刻关闭Estimate Transfer Functions窗口后可以看到Model Views处有一条曲线,这就是我们系统辨识后的传递函数,我们直接将其拖拽到To Workspace,导入MATLAB的工作空间
关闭System Identification,打开MATLAB的工作区,双击刚生成的传递函数,查看参数。这里我们只需要关注前两行的参数,这两行参数就是我们Simulink仿真中传递函数需要的参数
将参数导入Simulink中,双击Transfer Fcn,将这两行参数分别复制粘贴到此处,至此,整个仿真系统就搭建完成了
参考文章:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。