直流有刷电机多环控制(PID闭环死区和积分分离)
直流有刷电机多环控制
提高部分-第8讲 直流有刷电机多环控制实现(1)_哔哩哔哩_bilibili
PID模型
外环的输出作为内环的输入,外环是最主要控制的效果,主要控制电机的位置。改变位置可以改变速度,改变速度是受电流控制。
实验环境
【 !】功能简介:
按下KEY1使能电机,按下KEY2禁用电机,按下KEY3\KEY4可以调整目标值,以到达控制的效果.
可以通过上位机<野火多功能调试助手>----PID调试助手,查看现象或进行调试.
在PID调试助手中,打开开发板对应的串口,单击下方启动即可.
注意,部分例程中,上位机设置PID目标值时,未做幅值限制,若出现积分饱和为正常现象.
在电机未停止时重新开启电机,可能出现PID调整不准确的问题,电机会因为惯性保持运行,定时器会捕获不该捕获的脉冲.
F103性能相对有限,程序中处理的任务较多,使用上位机调试时可能出现指令不执行的情况,多发几次即可.
【 !】实验操作:
接线:
电机驱动板 5V\GND <----> 开发板 5V\GND
电机驱动板 PWM1\PWM2 <----> 开发板 PE9\PE11
电机驱动板 SD <----> 开发板 PD15
电机驱动板 编码器输出A\B <----> 开发板 PD12\PD13
电机驱动板 电压\电流检测 <----> 开发板 PC1\PC0注意:必须使用跳冒连接 J33 和 J34
下载本程序,复位开发板即可。
/********************************************************************************/【*】 引脚分配
定时器TIM1输出PWM信号:
两路PWM输出到PE9\PE11上连接到驱动板上的PWM信号输入.
电机驱动板 PWM1\PWM2 <----> 开发板 PE9\PE11电机使能引脚:
电机驱动板 SD <----> 开发板 PD15编码器信号:
用于对电机进行测速
电机驱动板 编码器输出A\B <----> 开发板 PC7\PC6电压电流采集:
电机驱动板 信号检测 电压\电流 <----> 开发板 PD12\PD13/************************************************************************************/
【*】 时钟
A.晶振:
-外部高速晶振:25MHz
-RTC晶振:32.768KHzB.各总线运行时钟:
-系统时钟 = SYCCLK = AHB1 = 72MHz
-APB2 = 72MHz
-APB1 = 36MHzC.浮点运算单元:不使用
定时器定时执行PID电机控制
定时器6,时钟72MHz,预分频因子1440,重装载值2500
定时器周期:
72000000 / 1440 / 2500 = 20
1 / 20 = 50ms 进入一次中断,计算一次PID
#ifndef __BASIC_TIM_H
#define __BASIC_TIM_H#include "stm32f1xx.h"#define BASIC_TIM TIM6
#define BASIC_TIM_CLK_ENABLE() __HAL_RCC_TIM6_CLK_ENABLE()#define BASIC_TIM_IRQn TIM6_DAC_IRQn
#define BASIC_TIM_IRQHandler TIM6_DAC_IRQHandler/* 累计 TIM_Period个后产生一个更新或者中断*/
//当定时器从0计数到BASIC_PERIOD_COUNT-1,即为BASIC_PERIOD_COUNT次,为一个定时周期
#define BASIC_PERIOD_COUNT (50*50)//定时器时钟源TIMxCLK = 2 * APB1_CLK
// 如果APB1_CLK = 72MHz = TIMxCLK
// 否则TIMxCLK=APB1_CLK * 2
// 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)
#define BASIC_PRESCALER_COUNT (1440)/* 获取定时器的周期,单位ms */
//#define __HAL_TIM_GET_PRESCALER(__HANDLE__) ((__HANDLE__)->Instance->PSC) // Get TIM Prescaler.
//#define GET_BASIC_TIM_PERIOD(__HANDLE__) (1.0/(HAL_RCC_GetPCLK2Freq()/(__HAL_TIM_GET_PRESCALER(__HANDLE__)+1)/(__HAL_TIM_GET_AUTORELOAD(__HANDLE__)+1))*1000)/* 以下两宏仅适用于定时器时钟源TIMxCLK=72MHz,预分频器为:1440-1 的情况 */
#de