增量式PID的算法实现,带详细注释
单片机源程序如下:
- #include "control.h"
- int Target_velocity=1; //设定速度控制的目标速度为50个脉冲每10ms
- int TIM3_IRQHandler(void)
- {
- if(TIM3->SR&0X0001)//10ms定时中断
- {
- TIM3->SR&=~(1<<0); //===清除定时器1中断标志位
- Encoder=Read_Encoder(2); //===读取编码器的值,M法测速,输出为每10ms的脉冲数
- // Led_Flash(100); //===LED闪烁;指示单片机正常运行
- Motor=Incremental_PI(Encoder*100,Target_velocity); //===速度PI控制器
- Xianfu_Pwm(); //===PWM限幅
- Set_Pwm(Motor); //===赋值给PWM寄存器
- }
- return 0;
- }
- /**************************************************************************
- 函数功能:赋值给PWM寄存器
- 入口参数:PWM
- 返回 值:无
- **************************************************************************/
- void Set_Pwm(int motor)
- {
- if(motor>0) AIN2=1, AIN1=0;
- else AIN2=0, AIN1=1;
- PWMA=myabs(motor);
- }
- /**************************************************************************
- 函数功能:限制PWM赋值
- 入口参数:无
- 返回 值:无
- **************************************************************************/
- void Xianfu_Pwm(void)
- {
- int Amplitude=7100; //===PWM满幅是7200 限制在7100
- if(Motor<-Amplitude) Motor=-Amplitude;
- if(Motor>Amplitude) Motor=Amplitude;
- }
- /**************************************************************************
- 函数功能:绝对值函数
- 入口参数:int
- 返回 值:unsigned int
- **************************************************************************/
- int myabs(int a)
- {
- int temp;
- if(a<0) temp=-a;
- else temp=a;
- return temp;
- }
- /**************************************************************************
- 函数功能:增量PI控制器
- 入口参数:编码器测量值,目标速度
- 返回 值:电机PWM
- 根据增量式离散PID公式
- pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
- e(k)代表本次偏差
- e(k-1)代表上一次的偏差 以此类推
- pwm代表增量输出
- 在我们的速度控制闭环系统里面,只使用PI控制
- pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)
- **************************************************************************/
- int Incremental_PI (int Encoder,int Target)
- {
- float Kp=20,Ki=30;
- static int Bias,Pwm,Last_bias;
- Bias=Encoder-Target; //计算偏差
- Pwm+=Kp*(Bias-Last_bias)+Ki*Bias; //增量式PI控制器
- Last_bias=Bias; //保存上一次偏差
- return Pwm; //增量输出
- }
复制代码
所有资料51hei提供下载:
电机速度闭环控制V1.7z
(188.4 KB, 下载次数: 330)
|