一、使用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,自己的理解也不是特别深刻,现在也只是可以使用。上述内容如有错误,还望可以批评指正。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐