使用TB6612和AT8236驱动直流减速电机
本文对比了TB6612和AT8236两种电机驱动模块的使用方法。TB6612需要7个控制引脚,通过PWMA/PWMB调节速度,AIN1/AIN2控制方向;而AT8236仅需4个引脚,支持两种控制模式:电平控制或PWM调速,并具有快/慢衰减模式可选。文章提供了基于STM32F103C8T6的代码实现,包括PWM参数配置和驱动函数编写。AT8236作为国产芯片,具有5.5-36V宽电压、6A峰值电流的
一、使用TB6612驱动电机

如上图为TB6612双路驱动模块,对于TB6612驱动模块而言,我们的重点在控制信号输入引脚部分。其中PWMA,AIN1,AIN2为控制一路电机,PWMB,BIN1,BIN2为控制另一路电机。
- PWMA,PWMB:PWM的输出引脚,通过输出PWM值来驱动改变电机的速度。
- AIN1,AIN2:电机一的GPIO控制引脚,通过改变两个引脚的电平状态,可以实现电机的正转、反转以及停转。
- BIN1,BIN2:电机二的GPIO控制引脚。
- AO1,AO2,BO1,BO2:电机驱动的输出端,一般不用管。
- STBY:,高电平的情况下驱动器才可以正常工作,当STBY为低电平的时候,整个驱动器停止工作,接3.3V和5V都可以。
简单来说,对于TB6612电机驱动模块,PWMA控制电机的速度,AIN1和AIN2用来控制电机转动的方向。
二、使用AT8236驱动电机

如果我们仔细观察,会发现TB6612和AT8236驱动模块的差别在于电机控制信号的输入引脚。TB6612的控制信号输入引脚加上STBY一共有7个,而AT8236仅有四个。下面简单叙述AT8236的四个控制输入引脚的功能。
不同于TB6612控制驱动电机,AT8236有两种控制方式,第一种是通过给对应的GPIO口高低电平实现电机的驱动。下面则是官方文件中的通过IN1和IN2来控制输出的状态真值表。

(注:本人未使用这种方式驱动电机,因此不太清楚这种方式是否可以改变电机的转速,重点关注的是通过PWM来控制电机,感兴趣的朋友可以自行尝试,官方的文件将放置文章最后。)
第二种即是通过PWM来控制电机,并且可以进行电机调速。AT8236驱动芯片是通过控制H桥来实现电机转速控制的(不懂H桥也没关系),并且H桥可以操作在两种不同的状态,快衰减和慢衰减。在快衰减模式下,H桥是被禁止的,续流电流流经二极管;在慢衰减模式下,输出H桥的两个下管都是打开的。
简单来说,快衰减就是电机响应的速度会更快,瞬间产生的电动势会更大;慢衰减模式下电机响应速度会较慢,但对电机的保护会更好一些,根据自己个人需要进行选择即可。下面就是PWM控制的功能逻辑表和驱动衰减模式图:


三、代码编写(基于STM32F103C8T6芯片)
使用TB6612控制电机:
1、使用cube-MX打开对应的GPIO口,我们这里选择TIM2的通道一作为PWM输出通道,PA4和PA5作为GPIO控制引脚。


2、配置PWM功能的相关参数,这里我们选择分频系数为72,自动重装载值为1000。其他参数保持不变。即在程序中给的CCR的值为1000时,电机以最大速度转动;给0时,电机停止转动(给的值太小,驱动不够,电机也不会转动,建议初始值给500即可)

对应的电机控制代码:
#define AIN1_UP HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET)
#define AIN1_DOWN HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET)
#define AIN2_UP HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET)
#define AIN2_DOWN HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET)
void MotorInit(void)//电机初始化函数
{
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);//开启定时器二通道1的PWM功能
}
void SetPWM(int16_t motorpwm)
{
if(motorpwm>0)//电机正转
{
AIN1_UP;
AIN2_DOWN;//一个引脚高电平,另一个引脚低电平 注:实际电机转动方向可能与此相反,只需要翻转两个引脚的电平即可,根据实际情况来设置引脚电平状态
__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,motorpwm);
}
else if(motorpwm<0)//电机反转
{
AIN1_DOWN;
AIN2_UP;
__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,-motorpwm);
}
else if(motorpwm==0)//电机停转
{
__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,0);
}
}
使用AT8236控制电机:
与TB8812不同的是,AT8236控制电机只需要两个PWM输出的引脚即可,配置如下:


(将两个定时器输出的引脚命名为AIN1和AIN2)
对应的电机控制代码(采用快衰减模式)
//直接改变定时器的CCR的值
#define AIN1 TIM2->CCR1
#define AIN2 TIM2->CCR2
void MotorInit(void)//电机初始化函数
{
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);//开启定时器二通道1的PWM功能
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);//开启定时器二通道2的PWM功能
}
//采用的是快衰减的模式
void SetPWM(int16_t motorpwm)
{
if(motorpwm>0)//电机正转
{
AIN1=motorpwm;
AIN2=0;// 注:实际电机转动方向可能与此相反,只需要给改变两个PWM通道的CCR值即可,一个是0,另一个是自己要填的motorpwm值
}
else if(motorpwm<0)//电机反转
{
AIN1=0;
AIN2=motorpwm;
}
else if(motorpwm==0)//电机停转
{
AIN1=0;
AIN2=0;
}
}
四、总结
AT8236是一款国产芯片,其电压范围在5.5V~36V,可以达到6A的峰值电流,其官方手册网站链接为:https://offer-product.oss-cn-beijing.aliyuncs.com/product/offer/attachment/null/file/subPdf_143103_65242_20211117-164925002.pdf
本人之前一直使用TB6612驱动电机,偶然一次买错了发现是AT8236驱动模块。自己搜索教程,发现AT8236的教程非常少,故简单做了本次的内容。由于这是本人第一次使用AT8236,自己的理解也不是特别深刻,现在也只是可以使用。上述内容如有错误,还望可以批评指正。
更多推荐



所有评论(0)