使用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软件可以绘制出串口的数值,观察控制曲线

参数为0.5,0.3,0
参数为1,0.3,0
参数为1.5,0.3,0

参数为1.5,0.3,0.5

 

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

作者:TAoTAo丶丶丶

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32和PID调节器实现速度闭环控制

发表回复