锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

玩转电机驱动——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

相关文章