《鸿蒙智能互联设备开发(微课版)》 课件 8.2.7 PID调速功能开发_第1页
《鸿蒙智能互联设备开发(微课版)》 课件 8.2.7 PID调速功能开发_第2页
《鸿蒙智能互联设备开发(微课版)》 课件 8.2.7 PID调速功能开发_第3页
《鸿蒙智能互联设备开发(微课版)》 课件 8.2.7 PID调速功能开发_第4页
《鸿蒙智能互联设备开发(微课版)》 课件 8.2.7 PID调速功能开发_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

8.2.7PID调速功能开发通过本节学习,您可以:了解PID调速功能的开发PID调速功能开发由于机械结构、阻力等诸多问题会导致实际的电机转速与预设的电机转速存在一定的误差值,要想消除该误差值就需要用到PID控制算法。PID控制算法是结合比例、积分和微分三种环节于一体的自动控制算法,它是连续系统中技术最为成熟,应用最为广泛的一种控制算法。PID控制组件的实质就是根据输入的偏差值,按照比例、积分、微分的函数关系进行运算,再将运算的结果控制输出,从而达到电机的实际转速与预设的转速相等。PID调速功能开发PID控制算法中比例、积分和微分的各自作用如下:比例算法:通过计算出电机实际转速与预设值的误差值,乘以对应的比例系数,再加上前一次PID计算的输出值即可使得实际转速趋近于预设值。积分算法:通过计算前五次误差的和再乘以对应的积分系数,再加上前一次PID计算的输出值即可使得实际转速等于预设值。微分算法:通过计算本次误差与上次误差的差值再乘以对应的微分系数,再加上前一次PID计算的输出值即可防止转速波动过大,能够平稳的使实际转速到达预设转速。PID调速功能开发(1)对PID结构体进行定义。定义PID算法所需要用到的变量及数组。

typedef

struct

{

pid_ykp;//比例参数

pid_yki;//积分参数

pid_ykd;//差分参数

pid_yinput;//输入值

pid_yset_point;//设定的期望值

pid_youtput;//计算得出的值

pid_youtput_speed;//实际输出的值

pid_yLast_output;//上次实际输出的值

pid_ypid_output;//PID计算值

pid_yerror;//误差值

pid_yLast_error;//上次误差值

interror_data;//误差值次数

pid_yerror_i[5];//前五次误差值

pid_yintegral;//内部的积分值

pid_ydifferential;//内部的微分值

pid_yproportion;//内部的比例值

}pid_struct;PID调速功能开发(2)对PID参数初始化。对比例、积分、微分系数赋值,上次误差值、误差值次数与前误差的误差值均赋0,初始输出给电机的转速为20。

voidpid_init(pid_struct*pid)

{

pid->kp=0.5;//比例系数

pid->ki=0.02;//积分系数

pid->kd=0.05;//微分系数

pid->Last_error=0;//上次误差值

pid->Last_output=20;//初始输出给电机的转速

pid->error_data=0;//误差值次数

/**前五次误差值**/

for(intj=0;j<5;j++)

{

pid->error_i[j]=0;

}}PID调速功能开发(3)PID算法综合了比例算法、积分算法和微分算法这三种算法。比例算法:将采集到的实际速度与预设的目标速度相减得到误差值,再乘以比例系数得到比例值。积分算法:计算前五次误差的和再乘以对应的积分系数得到积分值。pid->error=pid->set_point-pid->input;//误差

pid->proportion=pid->kp*pid->error;//比例计算

/**积分算法**/

pid->error_i[pid->error_data]=pid->error;//记录5次误差用于积分计算

for(intj=0;j<5;j++)

{

pid->integral+=pid->error_i[j];/*误差积累*/

}

pid->integral=pid->integral*pid->ki;//积分计算

pid->error_data++;//数组地址加一,方便下次误差存入

/**更新数组地址**/

if(pid->error_data==5)

{

pid->error_data=0;}PID调速功能开发微分算法:将本次的误差值减去上次的误差值得到差值,再乘以微分系数得到微分值。pid->differential=pid->kd*(pid->error-pid->Last_error);//微分计算PID运算:将比例值、积分值与微分值相加得到PID值。为了防止PID算法跑飞,PID的最大值设置为10,最小值设置为-10,如果计算得出的PID值超过此范围则PID值等于最大或者最小值。再将PID值加上前一次输出电机的转速,得到经过PID运算后需要输出给电机的转速。

/**PID算法**/

pid->pid_output=pid->proportion+pid->differential+pid->integral;

/**防止PID过大**/

if(pid->pid_output>10)

{

pid->pid_output=10;

}PID调速功能开发

if(pid->pid_output<(-10))

{

pid->pid_output=-10;

}

pid->output=pid->Last_output+pid->pid_output;//输出值

/**输出值超出正常则过滤**/

if((pid->output<0)||(pid->output>110))

{

pid->output=pid->Last_output;}PID调速功能开发根据输出的电机转速乘10得到占空比,并将此次的误差值及输出值赋值到变量中给下次PID计算使用。

pid_ypid_runing(pid_struct*pid)

{

/**实际速度在正常范围**/

if((pid->input>0)&&(pid->input<101))

{

/**比例算法**/

/**积分算法**/

/**微分算法**/

/**PID运算**/

pid->output_speed=pid->output*10;//占空比精度为0.1,所以需要乘10

pid->Last_output=pid->output;//赋值给下次计算使用

pid->Last_error=pid->error;//赋值给下次计算使用

}

returnpid->output_speed;

}PID调速功能开发(4)封装PID参数初始化函数。(5)调用PID运算函数。先将传入的目标值与电机实际值赋值给结构体,再调用PID运算函数,通过PID运算函数返回的占空比输出PWM波控制电机转速。

voidEncoder_Motor_PIDInit(void)

{

pid_init(&motor_pid);//PID参数初始化赋值

}

voidEncoder_Motor_PIDRuning(uint8_tspeed,intcruise)

{

pid_ypid_duty=0;

motor_pid.set_po

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论