如何实现STM32F103直流有刷电机速度闭环控制算法优化?
摘要:在《基于直流有刷电机的速度闭环控制以及matlab仿真》我们介绍了速度闭环控制的实现,其采用的是PID控制算法,本节我们就基于STM32F103来实现直流电机的增量式PID速度闭环控制。 一、软件实现 我们需要将PID控制器应用于STM32
在《基于直流有刷电机的速度闭环控制以及matlab仿真》我们介绍了速度闭环控制的实现,其采用的是PID控制算法,本节我们就基于STM32F103来实现直流电机的增量式PID速度闭环控制。
一、软件实现
我们需要将PID控制器应用于STM32F103的速度闭环电机控制,以下是接下来的步骤:
电机速度测量:使用编码器来测量电机的实际转速,需要配置定时器的编码器模式来读取编码器脉冲,从而计算速度;具体参考《STM32F103霍尔编码器测速》;
电机驱动:通常使用PWM驱动电机,需要配置定时器的PWM输出模式,并设置占空比来控制电机速度;具体参考《基于直流有刷电机的开环调速控制以及matlab仿真》;
PID周期调控:PID计算需要定期执行,因此需要配置一个定时器中断,在中断服务函数中执行PID计算和更新PWM输出;
主程序初始化:初始化所有外设(比如电机初始化、编码器初始化、中断定时器等)和PID参数;
主循环:通常主循环可以处理一些非实时任务,比如接收用户指令(例如通过串口改变目标速度)等。
1.1 PID算法实现
1.1.1 自定义PID结构体
在control目录下新建pid.h文件,自定义PID结构体;
/******************************************************************************************************/
#ifndef _STM32f10x_PID__H
#define _STM32f10x_PID__H
#include "encoder.h"
#include <stdio.h>
#define MAX_HISTORY 300 // 最多保存300次数据
typedef struct {
float Kp, Ki, Kd; // 比例、积分、微分系数
float Ts; // 调控周期 (秒)
float prev_error; // e(k-1)
float prev_error2; // e(k-2)
float out_max; // 输出的最大值(占空比)
float out_min; // 输出的最小值(占空比)
float output; // 当前总输出 u(k)(占空比)
float target_val; // 目标转速值 (RPM)
// 历史记录
float measure_history[MAX_HISTORY]; // 测量转速记录
float output_history[MAX_HISTORY]; // 输出占空比记录
int record_count; // 已记录次数
int is_full; // 是否已存满
int has_output; // 标记是否已输出过
float raw_measure; // 当前测量转速值 r(k)
} PID;
extern PID g_pid; // 全局PID参数
extern void pid_param_init(void); // 初始化PID参数
extern void set_pid_params(float kp, float ki, float kd, int ts, int target_val); // 设置PID相关参数
extern float pid_compute(void); // PID计算
extern void print_measure_record(void); // 输出测量转速记录
#endif
在PID结构体中除了PID算法用到的一些参数外,我们还存储了当前测量的转速值、PID输出的占空比记录值。
1.1.2 PID参数初始化
在control目录下新建pid.c文件。pid_param_init函数用于初始化g_pid参数,比如:
将目标值g_pid.target_val设置为1500.00;
将实际值、上一次偏差值和上上次偏差值等初始化为0。
此外,我们将PID算法调控周期设置为10ms,这个在后面我们会单独介绍。
