增量式
float SpeedInnerControl(char k,int temp)
{
PIDpulse_add[k] = Kp * (temp - Error_Last[k]) +
Ki * temp +
Kd * (temp - 2.0 * Error_Last[k] + Error_Prev[k]); //这个位置减去2.0是通式增量式pid都需要减去这个2.0
PIDpulse[k] += PIDpulse_add[k]; //增量PID
Error_Prev[k] = Error_Last[k];// Error_Prev上上次误差
Error_Last[k] = temp; //Error_Last上次误差
if(PIDpulse[k] < 0 ) PIDpulse[k] = -PIDpulse[k];
if(PIDpulse[k] > 7200) PIDpulse[k] = 7200;
printf("Error_Prev[%d]=%d\r\n",k,Error_Prev[k]);
printf("Error_Last[%d]=%d\r\n",k,Error_Last[k]);
printf("temp=%d\r\n",temp);
printf("PIDpulse[%d]=%d\r\n",k,PIDpulse[k]);
return PIDpulse[k];
}
位置式
int SpeedInnerControl_pos(char k, int temp)
{
//printf("SpeedInnerControl_pos!\r\n");
sum_temp[k]+=temp;
PIDpulse[k] = Kp * temp +
Ki * sum_temp[k] +
Kd * (temp - Error_Last[k]); //
//PIDpulse[k] =5000;
Error_Last[k] = temp; //Error_Last上次误差
if(PIDpulse[k] < 0 ) PIDpulse[k] = -PIDpulse[k];
if(PIDpulse[k] > 7200 ) PIDpulse[k] = 7200;
printf("sum_temp[%d]=%d\r\n",k,sum_temp[k]);
printf("temp=%d\r\n",temp);
printf("PIDpulse[%d]=%d\r\n",k,PIDpulse[k]);
return PIDpulse[k];
}
void RefreshPWM(char k,int temp)//计算并刷新PWM
{
if(0==k)
{
PID_POS[k]=SpeedInnerControl_pos(k,temp); //PA8
printf("PID_POS[%d]=%d\r\n",k,PID_POS[k]);
TIM_SetCompare1(TIM1,PID_POS[k]);
}
if(1==k)
{
PID_POS[k]=SpeedInnerControl_pos(k,temp); PA11
printf("PID_POS[%d]=%d\r\n",k,PID_POS[k]);
TIM_SetCompare4(TIM1,PID_POS[k]);
}
}
stm32 利用PID调整PWM值
于 2023-08-16 20:00:35 首次发布