如何实现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,这个在后面我们会单独介绍。
阅读全文