速度闭环
image.png

主要过程:

单片机定时器得到脉冲->得到速度->PID算法->得到速度->控制占空比输出PWM->车轮转速

代码:

  1. /**************************增量式PI************************************************
  2. 函数功能:增量PI控制器
  3. 入口参数:编码器测量值,目标速度 //这里可能要更改,因为编码器的测量值和速度可能需要转换
  4. 返回 值:电机PWM
  5. 根据增量式离散PID公式
  6. pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
  7. e(k)代表本次偏差
  8. e(k-1)代表上一次的偏差 以此类推
  9. pwm代表增量输出
  10. 在我们的速度控制闭环系统里面,只使用PI控制
  11. pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)
  12. **************************************************************************/
  13. int Incremental_PI (int Encoder,int Target)
  14. {
  15. float Kp=20,Ki=30; //参数不知道可不可以
  16. static int Bias,Pwm,Last_bias; //相关内部变量的定义。
  17. Bias=Encoder-Target; //求出速度偏差,由测量值减去目标值。
  18. Pwm+=Kp*(Bias-Last_bias)+Ki*Bias; //使用增量 PI 控制器求出电机 PWM。
  19. Last_bias=Bias; //保存上一次偏差
  20. return Pwm; //增量输出
  21. }

主程序:

  1. int main(void)
  2. {
  3. Stm32_Clock_Init(9); //系统时钟设置
  4. ...
  5. MiniBalance_PWM_Init(7199,0); //=====初始化PWM 10KHZ 高频可以防止电机低频时的尖叫声
  6. Encoder_Init_TIM2(); //初始化编码器
  7. Timer3_Init(99,7199); //=====10MS进一次中断服务函数,中断服务函数在control.c
  8. while(1);
  9. }

其他代码:

  1. /**************************************************************************
  2. 函数功能:赋值给PWM寄存器
  3. 入口参数:PWM
  4. 返回 值:无
  5. **************************************************************************/
  6. void Set_Pwm(int moto1)
  7. {
  8. if(moto1>0) AIN2=1, AIN1=0;
  9. else AIN2=0, AIN1=1;
  10. PWMA=myabs(moto1);
  11. }
  1. /**************************************************************************
  2. 函数功能:限制PWM赋值 //限制在多少范围内
  3. 入口参数:无
  4. 返回 值:无
  5. **************************************************************************/
  6. void Xianfu_Pwm(void)
  7. {
  8. int Amplitude=7100; //===PWM满幅是7200 限制在7100
  9. if(Moto1<-Amplitude) Moto1=-Amplitude;
  10. if(Moto1>Amplitude) Moto1=Amplitude;
  11. }
  12. /**************************************************************************
  13. 函数功能:绝对值函数
  14. 入口参数:int
  15. 返回 值:unsigned int
  16. **************************************************************************/
  17. int myabs(int a)
  18. {
  19. int temp;
  20. if(a<0) temp=-a;
  21. else temp=a;
  22. return temp;
  23. }