STM32应用(十)经典控制算法PID(单级和串级)原理与代码实现_第1页
STM32应用(十)经典控制算法PID(单级和串级)原理与代码实现_第2页
全文预览已结束

下载本文档

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

文档简介

1、 STM32应()经典控制算法PID(单级和串级)原理与代码实现章录P(例): 简单来说,P就是凉了加热,热了加凉。标值,我就增加点,标值,我就减点。(现在)P可能出现的问题: 1.P太,达到标值需要花费很长的时间,且会有稳态误差。2.P太,达到标值时可能会直震荡。I(微分): 将段时间内的误差累积起来加到输出上,可以消除历史误差对当前实际曲线的影响,提系统的稳定性。 (过去)I可能出现的问题: 1.I太,可以消除稳态误差,但太慢了,对于某些需要很快响应的系统,显然不能满要求。2.I太,累计误差占过,就会出现抖动现象,难以收敛。后调D,将最超调量降到最低。PI:响应速度要求不那么的系统。PD:

2、惯性系统。超调量太。PID:都可以。上将PID原理太多太多了,我的理解也都是参见上的内容。认真看肯定有收获。这个理解就是,单机PID就是稳定速度。需要带位置和度的就要串级PID了。常于平衡车,板球系统等。转速闭环称为串级PID的内环,位置 (度) 闭环称为串级PID的外环。其实也很好理解,位移是速度的积分,只有速度慢慢稳定,位置才能确定。 typedef struct _PIDfloat kp,ki,kd;float error,lastError;/误差、上次误差float integral,maxIntegral;/积分、积分限幅float output,maxOutput;/输出、输出限

3、幅PID;3.1.2 单级PID计算#define LIMIT(x,min,max) (x)=(x)=(max)?(max):(x)/单级pid计算void PID_SingleCalc(PID *pid,float reference,float feedback)/更新数据pid-lastError=pid-error;pid-error=reference-feedback;/计算微分pid-output=(pid-error-pid-lastError)*pid-kd;/计算例pid-output+=pid-error*pid-kp;/计算积分pid-integral+=pid-err

4、or*pid-ki;LIMIT(pid-integral,-pid-maxIntegral,pid-maxIntegral);/积分限幅pid-output+=pid-integral;/输出限幅LIMIT(pid-output,-pid-maxOutput,pid-maxOutput);3.1.3PID初始化void PID_Init(PID *pid,float p,float i,float d,float maxI,float maxOut)pid-kp=p;pid-ki=i;pid-kd=d;pid-maxIntegral=maxI;pid-maxOutput=maxOut;3.1.

5、4 清空PID/清空个pid的历史数据void PID_Clear(PID *pid)pid-error=0;pid-lastError=0;pid-integral=0;pid-output=0;3.2 串级PID3.2.1 初始化串级PID结构体typedef struct _CascadePIDPID inner;/内环PID outer;/外环float output;/串级输出,等于inner.outputCascadePID;3.2.2 串级PID计算 /串级pid计算void PID_CascadeCalc(CascadePID *pid,float angleRef,float

6、 angleFdb,float speedFdb)PID_SingleCalc(&pid-outer,angleRef,angleFdb);/计算外环(度环)PID_SingleCalc(&pid-inner,pid-outer.output,speedFdb);/计算内环(速度环)pid-output=pid-inner.output;4.PID的使在这篇博客的配置下,只需要修改部分代码。以单级PID为例。4.1 定义PID结构体并初始化PID pid;void Motor_Init(void)PID_Init(&pid,10,0,0,1000,1000);HAL_TIM_Encoder_S

7、tart (&htim1, TIM_CHANNEL_ALL);_HAL_TIM_ENABLE_IT(&htim1,TIM_IT_UPDATE);/开启编码器定时器/开启编码器定时器更新中断,防溢出处理HAL_TIM_Base_Start_IT (&htim6);/开启10ms定时器中断HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);_HAL_TIM_SET_COUNTER(&htim1, 10000);/开 启PWM/编码器定时器初始值设定为10000motor.loopNum = 0;/防溢出4.2 定义电机速度函数void Motor_Send()floa

8、t output = 0;PID_SingleCalc(&pid, motor.targetSpeed, motor.speed);output = pid.output;if(output 0) /正转_HAL_TIM_SetCompare (&htim2, TIM_CHANNEL_1, (uint32_t)output);IN1(1);IN2(0);else/反转_HAL_TIM_SetCompare (&htim2, TIM_CHANNEL_1, (uint32_t)(-output);IN1(0);IN2(1);4.3 在检测霍尔码盘时发送速度给电机if(htim-Instance=htim6.Instance)/10ms中断int16_t pluse = COUNTERNUM - RELOADVALUE/2;motor.totalAngle = pluse + motor.loopNum * RELOADVALUE/2;motor.speed = (float)(motor.totalAngle - motor.lastAngle

温馨提示

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

评论

0/150

提交评论