直流电机驱动--DRV8870/AT8870【STM32CubeMX,含驱动代码】【PWM+DMA可调速】

目录

两款芯片的简要说明:

引脚定义:

电路:

控制简要:

MX配置:

代码:

测试:


两款芯片的简要说明:

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
 
  

 

测试:

上机可以运行,能实现变速和正反转

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值