使用STM32和PID调节器实现速度闭环控制
采用stm32使用PID控制器实现对步进电机转速的控制。
一、课题概括
1、该课题主要使用了正点原子的探索者开发板,42步进电机,步进电机驱动器,编码器、电源等。
2、课题完成功能。实现通过按键KEY0启动系统开环控制,KEY2实现PID闭环控制。
二、实物接线
接线图如图,步进电机采用驱动器驱动,并且采用了通用定时器TIM3的通道1(PA6),输出PWM信号,用来驱动步进电机。编码器用来检测电机的转速,并用联轴器连接,采用的定时器TIM4的编码器模式(PD12、PD13)检测编码器信号。
三、程序代码
一、转速测量代码
计算出电机转速的代码,每20ms采集一次代码编码器的值,并计算出转速
编码器采集代码为:
encoderValue_old = __HAL_TIM_GET_COUNTER(&htim4);
HAL_Delay(20);
encoderValue_new = __HAL_TIM_GET_COUNTER(&htim4);
encoder_speed = calculateEncoderSpeed(encoderValue_old,encoderValue_new);
采集完成后计算速度的函数为:
float calculateEncoderSpeed(uint16_t encoderValue_old , uint16_t encoderValue_new)
{
float speed;
float econder_value;
//获得编码器数值
if(encoderValue_new >= encoderValue_old)
{
econder_value = encoderValue_new - encoderValue_old;
}
else
{
econder_value = 65535 - encoderValue_old + encoderValue_new;
}
//计算出当前转速
if(econder_value)
{
speed = (50*econder_value)/4096;
}
return speed;
}
转速知道了,那怎么和PWM频率对应起来呢,我们选择的驱动器挡位是3200个脉冲/圈,通过改变频率,不断增加频率,采集的PWM和速度的对应关系计算函数是
uint16_t count_pwm(float speed)
{
return (uint16_t)(275.79*(pow(speed,-1.026)));
}
二、PID调节函数
PID调节主要是通过PID控制代码调节
if(pid_con == 1)
{
if(sys_state == SYSTEM_RUN)
{
PID_Update_speed = PID_Update(&PID_Init_value,set_speed,encoder_speed);
speed_pwm = count_pwm(PID_Update_speed);
ModifyPWMFrequency(speed_pwm);
}
}
通过PID_Update计算处PID的值
float PID_Update(PIDController* pid, float setpoint, float process_variable) {
// 计算误差
float error = setpoint - process_variable;
// 计算积分项
if(error<1.0)
{
pid->integral += error;
}
// 计算微分项
float derivative = error - pid->prev_error;
// 计算控制输出
float output = pid->Kp * error + pid->Ki * pid->integral + pid->Kd * derivative;
// 更新上一次误差
pid->prev_error = error;
return output;
}
计算出输出后,然后修改PWM的值
void ModifyPWMFrequency(uint16_t frequency)
{
HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
htim3.Init.Period = frequency;
HAL_TIM_PWM_Init(&htim3);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, frequency/2);
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
}
四、实验效果
通过SerialPlot软件可以绘制出串口的数值,观察控制曲线




可以看出,P参数影响系统的调节速度,I可以减小系统的静态误差,D参数可以减少系统的上升时的震荡。
作者:TAoTAo丶丶丶