目录
两款芯片的简要说明:
DRV8870是德州仪器的,AT8870是台湾厂商的,都是直流有刷电机驱动器,它们的引脚定义是一样的,驱动代码也是一样的。
价格方面AT8870稍微贵一点。
引脚定义:
![]()
这里供电我给12V,参考电压给VDD(3.3V)
电路:
根据手册给出的典型电路,绘制出自己的电路图![]()
![]()
1.直流电机在电刷换向时会产生杂乱的尖峰噪声,在马达两端接一个电容起消除噪声的作用。2.IN1和IN2通过一个100欧姆的电阻接在单片机的定时器PWM输出引脚,这个100欧姆的电阻起阻抗匹配的作用。
控制简要:
我这里使用需要实现基础的调速功能,所以采用PWM控制,采用慢衰减,(快衰减停止后会滑行一段距离)。对于H桥快衰减和慢衰减的知识这里引用一下这个博主的文章:http://t.csdnimg.cn/ziMEa
MX配置:
我这里用的是STM32G0B1的主控,HAL库开发。这里把IN1配置成PWM,IN2配置成普通IO输出,输出低电平时为正转快衰减,输出高电平时为反转慢衰减;当然,如果想要正反转和衰减模式都可以自由配置,那就把IN2用另一个定时器PWM通道引脚代替,这样可以随时把IN1的PWM关闭并配置成IO输出,再把IN2的PWM打开即可。
配置这两个地方,时钟源选择,通道二配置成PWM模式
这里的系统频率为64M,把定时器配置成1ms,这里不会配置定时器的同学可以去看一下我的这篇文章:http://t.csdnimg.cn/q7ZPc
配置DMA:
这里搞不懂循环模式和正常模式的同学可以去看一下我的这篇文章:
代码:
DrvAT8870.c#include "DrvAT8870.h" /********************************************************* 说明: PWM+DMA驱动AT8870/DRV8870的驱动层文件 *********************************************************/ //AT8870的DC_IN2输出 #define SetIn2Low() HAL_GPIO_WritePin(DC_IN2_GPIO_Port, DC_IN2_Pin, GPIO_PIN_RESET) #define SetIn2High() HAL_GPIO_WritePin(DC_IN2_GPIO_Port, DC_IN2_Pin, GPIO_PIN_SET) static u32 AT8870Data[AT8870_ONCE_PWM];//发送区缓存 /******************************* 设置衰减模式 0快衰减1慢衰减 *******************************/ void SetAt8870Mode(u8 mode) { if(mode) SetIn2High(); else SetIn2Low(); } /******************************* 设置占空比 *******************************/ void SetAt8870PWMDuty(u16 duty) { u16 i; for(i=0; i<AT8870_ONCE_PWM; i++) { AT8870Data[i] = duty; } } /******************************* 开始发送pwm,DMA模式 *******************************/ void At8870PWMStart() { //HAL库函数,打开DMA传输 //第三个参数为要发送的数据的起始地址,第四个参数是要发送的个数 HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_2, AT8870Data, AT8870_ONCE_PWM); } /******************************* 停止发送pwm,DMA模式 *******************************/ void At8870PWMStop(void) { HAL_TIM_PWM_Stop_DMA(&htim1, TIM_CHANNEL_2); }
主要介绍一下HAL_TIM_PWM_Start_DMA函数的第三个参数的意思,这是一个数组,里面存放了控制PWM占空比的数据,那这个数据怎么设置勒,很简单,我们这里的定时器是1ms,即1秒计数1000次,占空比50%时就把这个值设置成500,占空比10%时就是100,总之就是有效电平(这里是高电平)所占一个计数周期的比列乘以一个周期的计数次数。同时,我们这里是不用改变每个PWM的占空比,只要在调速的时候把数组里的100个数据改变掉即可,至于为什么是一次性发送100个,这是因为如果要用到回调来精确控制PWM的个数,100是一个比较合适的数字,这个以后再说。
DrvAT8870.h
#ifndef _DRV_AT8870_H_ #define _DRV_AT8870_H_ #include "DrvSys.h" #define AT8870_ONCE_PWM 100 //一次传送的pwm个数 void SetAt8870Mode(u8 mode); void SetAt8870PWMDuty(u16 duty); void At8870PWMStart(void); void At8870PWMStop(void); #endif
测试:
上机可以运行,能实现变速和正反转