/**************************************************************************函数功能:位置式PID控制器入口参数:编码器测量位置信息,目标位置返回 值:电机PWM根据位置式离散PID公式pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]e(k)代表本次偏差e(k-1)代表上一次的偏差∑e(k)代表e(k)以及之前的偏差的累积和;其中k为1,2,,k;pwm代表输出**************************************************************************/int Position_PID (int Encoder,int Target){float Position_KP=80,Position_KI=0.1,Position_KD=500; //这里的PID参数需要调整static float Bias,Pwm,Integral_bias,Last_Bias;Bias=Encoder-Target; //求出速度偏差,由测量值减去目标值。Integral_bias+=Bias; //求出偏差的积分Pwm=Position_KP*Bias+Position_KI*Integral_bias+Position_KD*(Bias-Last_Bias); //位置式PID控制器Last_Bias=Bias; //保存上一次偏差return Pwm; //增量输出}
其他函数:
int Target_position=11000; //初始值是10000,目标值是11000int TIM3_IRQHandler(void){if(TIM3->SR&0X0001)//10ms定时中断{TIM3->SR&=~(1<<0); //===清除定时器1中断标志位Encoder=Read_Encoder(2); //===读取编码器的位置数据 初始值是10000Led_Flash(100); //===LED闪烁;指示单片机正常运行Moto1=Position_PID(Encoder,Target_position); //===位置PID控制器Xianfu_Pwm(); //===PWM限幅Set_Pwm(Moto1); //===赋值给PWM寄存器}return 0;}
