STM32 CubeMax直流电机速度环控制
STM32 CubeMax直流电机速度环控制
本例基于STM32F103C8T6与CubeMax
1. 速度环控制的思路
要对直流电机进行速度环控制,首先先给电机输出一个初始占空比的PWM信号,然后适用编码器读取电机的实时转速,观察电机是转得快了还是慢了,如果转得快了就减小占空比,转的快了就增大占空比,直到达到目标转速。
算法的具体思路看之前讲PID原理的那一篇
2. CubeMax配置
3. 接线
4. 代码编写
pid.c的内容如下
#ifndef _PID_H_
#define _PID_H_
#include "stm32f1xx.h"
#include "encoder.h"
#include <stdio.h>
//PID三个参数的值
#define KP1 27 //便于以后写多个pid算法并行,这里加序号1
#define KI1 25
#define KD1 2
typedef struct _PID//PID参数结构体
{
float kp,ki,kd;
float err,lastErr;
float integral,maxIntegral; //积分值
float output,maxOutput;
}PID;
void PID_Init(void);
void PID_SingleCal(PID* pid,float target,float feedback);//一次PID计算
#endif
pid.c内容如下
#include "pid.h"
PID pid1;
void PID_Init(void)//PID参数初始化
{
pid1.err = 0;
pid1.integral = 0;
pid1.maxIntegral = 2000;
pid1.maxOutput = __HAL_TIM_GetAutoreload(&PWM_TIM);
pid1.lastErr = 0;
pid1.output = 0;
pid1.kp = KP1;
pid1.ki = KI1;
pid1.kd = KD1;
}
/****************************************
* 作用:进行一次PID计算
* 参数:PID参数结构体地址;目标值;反馈值
* 返回值:无
* ****************************************/
void PID_SingleCal(PID* pid,float target,float feedback)//一次PID计算
{
pid->err = target - feedback;
//printf("pid->err = %f
",pid->err);
pid->integral += pid->err;
//printf("pid->integral = %f
",pid->integral);
if(pid->integral < -pid1.maxIntegral) pid->integral = -pid1.maxIntegral;//限制积分值
else if(pid->integral > pid1.maxIntegral) pid->integral = pid1.maxIntegral;
//pid->output = pid->err * pid->kp ;
pid->output = (pid->kp * pid->err) + (pid->ki * pid->integral) + (pid1.kd * (pid->err - pid->lastErr));//全量式PID
if(pid->output < 0) pid->output = 0;//限制积分值
else if(pid->output > pid1.maxOutput) pid->output = pid1.maxOutput;
pid->lastErr = pid->err;
}
此外要在编码器测速函数中增加对输出PWM占空比的控制,encoder,c文件如下
5. 结果
设置目标速度为200,最后还是能比较稳定地维持在200,只是过程比较曲折,说明参数没有调得足够好,还有改进空间
参数整定可以参考野火的教程
