当前位置:   article > 正文

【PID】直流电机速度环PID算法的实现_pid 直流电机

pid 直流电机

一、自定义PID结构体

  1. //首先定义PID结构体用于存放一个PID的数据
  2. typedef struct
  3. {
  4. float kp,ki,kd;//三个系数
  5. float error,lastError;//误差、上次误差
  6. float integral,maxIntegral;//积分、积分限幅
  7. float output,maxOutput;//输出、输出限幅
  8. }PID
  9. //用于初始化pid参数的函数
  10. void PID_Init(PID *pid,float p,float i,float d,float maxI,float maxOut)
  11. {
  12. pid->kp=p;
  13. pid->ki=i;
  14. pid->kd=d;
  15. pid->maxIntegral=maxI;
  16. pid->maxOutput=maxOut;
  17. }

二、进行PID计算

  1. //进行一次pid计算
  2. //参数为(pid结构体,目标值,反馈值),计算结果放在pid结构体的output成员中
  3. void PID_Calc(PID *pid,float reference,float feedback)
  4. {
  5. //更新数据
  6. pid->lastError=pid->error;//将旧error存起来
  7. pid->error=reference-feedback;//计算新error
  8. //计算微分
  9. float dout=(pid->error-pid->lastError)*pid->kd;
  10. //计算比例
  11. float pout=pid->error*pid->kp;
  12. //计算积分
  13. pid->integral+=pid->error*pid->ki;
  14. //积分限幅
  15. if(pid->integral > pid->maxIntegral) pid->integral=pid->maxIntegral;
  16. else if(pid->integral < -pid->maxIntegral) pid->integral=-pid->maxIntegral;
  17. //计算输出
  18. pid->output=pout+dout+pid->integral;
  19. //输出限幅
  20. if(pid->output > pid->maxOutput) pid->output=pid->maxOutput;
  21. else if(pid->output <-pid->maxOutput) pid->output=-pid->maxOutput;
  22. }

三、周期调用PID计算

  1. void TIM2_IRQHandler(void) //
  2. {
  3. if(TIM_GetITStatus(TIM2,TIM_IT_Update))
  4. {
  5. /*读取编码器测量的速度值*/
  6. gspeed=Read_EncoderB()*60/(SampleCircle_100*0.01*4*50);
  7. /*周期调用PID计算,得到PWM输出值*/
  8. PID_Calc(&mypid,TargetVelocity,gspeed);
  9. /*根据PWM值控制电机转动*/
  10. carry_pid(mypid.output);
  11. }
  12. TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
  13. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/963161
推荐阅读
相关标签
  

闽ICP备14008679号