玩转电机驱动——A4950闭环驱动直流减速电机(Arduino)
时间:2023-05-27 06:07:00
玩电机驱动——A4950闭环驱动直流减速电机(Arduino)
前言
闭环控制是通过编码器获取电机转速,然后使用PI控制电机转速保持在设定值的控制方法。不使用速度闭环D微分项。
提示:本文参考平衡车之家https://blog.csdn.net/chrnhao/article/details部分内容/11263953
一、PWM信号
PWM(Pulse Width Modulation)脉冲宽度调制,PWM波形是一个低电平组成的数字输出信号。在惯性系统中,通过调节一系列脉冲的宽度,可以有效地获得所需的模拟参数,通常用于电机控速等领域。
使用PWM波形等效地实现模拟信号输出。PWM秘诀是世界武功只快不破,只要闪得快,就找不到是闪187亮,还是亮度正常稳定。PWM应用程序需要惯性系统,LED熄灭时,由于余晖和人眼视觉暂留,LED它不会立即熄灭,但有一定的惯性,短时间后会熄灭;当电机断电时,电机不会立即停止,而是有一定的惯性,一段时间后停止。
从下图可以看出,高低电平跳变的数字信号可以等效为中间虚线所表示的模拟量。当上电平时间长,下电平时间短时,等效模拟量偏高,反之亦然。
PWM重要参数:
频率 = 1 / TS
占空比 = TON / TS
分辨率 = 占空比变化步距 (占空比变化1%2%3%,以1%的步距跳变,分辨率1%,分辨率就是占空比变化的精细程度)
二、PID控制简介
控制直流减速电机PID一般分为两种,一种叫位置式PID,一种称为增量式(速度)PID。
位置式PID一般用于倒立摆、平衡车等,使参数准确到达指定的静态状态,如使电机准确转动90度。
增量式PID用于使动态变量尽可能稳定地保持在设定的目标值中。如果你想让汽车以准确的匀速行驶,那就是让每个车轮的速度稳定在设定的目标值中。
对于直流减速电机,如果你想启动电机并调整电机的速度,你需要让单片机生成PWM脉冲输入电机驱动器(L298N、DRV8848、TB6612、A4950等)。而PWM一个极其重要的参数是占空比。不同的占空比对应电机的不同速度,占空比100%,电机全速旋转,占空比0%,电机停止。例如,我们的电机全速为333 RPM(转每分)我们希望电机以半速运动,即166.5 RPM,我们的PWM占空比设置为50%,但实际操作时,转速难以达到并保持166.5 RPM,150或170 RPM,无论如何,它不会维持166.5 RPM,此时需要使用闭环算法(增量式)PID)。
三、增量式(速度)PID控制流程
带编码器的直流减速电机具有不同的电机转速,编码器输出不同的脉冲。单片机通过读取编码器输出的脉冲边缘(上升、下降、上升和下降)来获得转速。
循环:
(1)单片机通过直流减速电机的编码器获得电机的实际转速,计算实际转速与设定的目标转速之间的误差;
(2)根据误差,PI控制器将计算一个用于将直流减速电机调整到目标速度的控制器PWM值;
(3)计算PWM将值输出直流电机,调整直流电机转速;
(4)再读取直流电机转速,传递给单片机。
四、PI控制器
所讲的PI控制器是一个函数,输入当前速度和目标速度的误差,输出是调整速度所需的PWM值。
PID公式如下:
PWM =Kp×[e(k)-e(k-1)] Ki×e(k) Kd×[e(k)-2e(k-1) e(k-2)]
PWM: 输出增量,即输出值;
Kp、Ki、Kd: 我们需要调整这三个参数,并根据不断的测试调整得到一组最佳值;
e(k) :这个误差
e(k-1):上次误差
e(k-2):上上次误差
增量式(速度)PID我们只需要Kp、Ki两个参数,所以公式可简化为:
PWM =Kp×[e(k)-e(k-1)] Ki×e(k)
Arduino中PI实现控制器代码:
///定义一回值为整形手术的函Incremental_PI,输入是两个整形变量 Encoder,Target (Encoder代表编码器测量的当前速度,Target代表目标速度)int Incremental_PI (int Encoder, int Target){ float Bias; //浮点变量Bias (本次偏差) static float PWM, Last_bias; // 两个全球浮点静态变量:PWM(输出增量),Last_bias(上次误差) Bias = Encoder - Target; //计算偏差,当前值-目标值 PWM = Velocity_KP * (Bias - Last_bias) Velocity_KI * Bias; //增量式PI控制器 if (PWM > 155)PWM = 155; //限幅,给小车限速 if (PWM < -155)PWM = -155; //限幅,给小车限速 Last_bias = Bias; //保存上一次偏差 return PWM; //增量输出}
五、Arduino实现
1. 硬件
(1)Arduino mega 2560
(2)12V航模电源
(3)直流电机驱动A4950T
(4)带编码器的直流减速电机
2. 电路图
电机驱动电路图:
接线电路图:
3. 编码器相关知识
如下图所示,编码器直接附在电机后面,这种是霍尔传感器形式的编码器,中间是一个圆形磁铁,边上有两个位置错开的霍尔传感器,当磁铁旋转时,通过霍尔传感器,就可以输出正交的方波信号。
编码器的A相和B相输出给单片机的是有相位差的两个脉冲(正交的方波信号)。如果设置计数器是通过A相输出方波的上升沿计数,当检测到A相输出方波的上升沿时,B相输出的是高电平则判断电机正转,B相输出的是低电平则判断电机反转。
通过计算确定时间内的脉冲个数得到转速的为M测速法。针对A、B相上升沿和下降沿都进行检测,检测精度可达四倍精度(四倍频测速)。本文只对A相的上升沿和下降沿进行检测并计数。
4. 定时内部中断
我们做四轮驱动车,需使用四个中断IO口,每一个中断IO口对应一个电机的编码器,一般来说我们都是采用Mega2560 ,下面是arduino系列单片机对应引脚号和中断号:
Arduino mega 2560 只有6个中断IO口,其中还有和I2C通信口和Serial1串口共用的IO口,所以可用的只有2、3、18、19四个引脚。
为了对设定时间内的脉冲的上升沿和下降沿计数,MEGA2560我们使用FlexiTimer2.h库进入定时内部中断,其他型号的arduino的板使用的是MsTimer2.h库。
使用时,在setup()函数里加上:
FlexiTimer2::set(20, control); //20毫秒定时中断函数,每20毫秒执行一次control函数 FlexiTimer2::start (); //中断使能
总结
具体控制程序可以通过这里下载,也可以联系我
https://download.csdn.net/download/weixin_43002939/85438995