stm32使用drv8833驱动电机

DRV8833电机驱动简介

DRV8833 是一款由德州仪器(Texas Instruments)生产的双 H 桥电机驱动芯片,主要用于驱动直流电机和步进电机。它的特点包括:

  1. 双 H 桥结构:能够驱动两个直流电机或者一个双极性步进电机。
  2. 电压范围广:支持2.7V 到 10.8V 的工作电压,非常适合便携式应用。
  3. 电流能力:每个通道能够提供最大 1.5A 的持续输出电流,峰值电流可达 2A(短时间内)。
  4. 保护功能:集成了欠压保护、过流保护、过热保护以及短路保护,确保驱动器在异常情况下能安全工作。
  5. 控制方式:可以通过简单的 PWM 信号进行速度和方向控制。

以下是DRV8833的真值表,如果要控制电机的速度和方向,我们可以使用两个PWM来作为输入

1、关于快速衰减(滑动)、慢速衰减(制动)

它们控制电机在断电后的响应方式,影响电机如何停止。

慢速衰减(制动):也称为制动模式,是在电机断电时迅速停止电机转动的方式。具体原理是,电机线圈会在停止时短路,这使得反电动势(电机旋转产生的电压)迅速被耗散掉,从而导致电机迅速停止。这种模式通常用于需要精确停止的位置或快速响应的应用。

快速衰减(滑动):也称为惯性运行自由运行,是当电机停止供电时,让电机继续自由旋转,直到最终由于摩擦和其他阻力自然停止。这种模式不短路电机线圈,而是让它们处于开路状态,因此电机没有额外的制动作用。

STM32连接DRV8833

VM连接3.3V,GND—->GND,AO1和AO2连接电机的两端,STBY—->3.3V,

AIN1—–>PA0,AIN2——>PA1

程序设计

MOtor.c

#include "stm32f10x.h"                  // Device header

/*DRV8833电机驱动*/
#define Motor_Mode    1			//电机驱动模式设置,1为滑动(快速衰减),2为制动(慢速衰减)

void Motor_Init(void)
{
	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;				//将引脚初始化为复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	/*配置时钟源*/
	TIM_InternalClockConfig(TIM2);
	
	/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 1000 - 1;		    //ARR 自动重装载值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;			//PSC 预分频器
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	/*输出比较初始化*/ 
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;				//PWM模式1,定时器计数小于 TIM_Pulse时,输出有效电平
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR 初始值
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);						//定时器通道1使能
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);						//定时器通道2使能
	
	/*TIM使能*/
	TIM_Cmd(TIM2, ENABLE);
}

void Motor_SetSpeed(int16_t Speed)
{
	if(Motor_Mode == 1)        									//滑动模式下,占空比越大电机越快
	{
		if (Speed >= 0)		
		{
			TIM_SetCompare1(TIM2,Speed);
			TIM_SetCompare2(TIM2,0);
		}
		else if(Speed < 0)	
		{
			TIM_SetCompare1(TIM2,0);
			TIM_SetCompare2(TIM2,-Speed);	
		}
		
	}
	if(Motor_Mode == 2)        									//制动模式下,占空比越小电机越快
	{
		if (Speed >= 0)		
		{
			TIM_SetCompare1(TIM2,1000);
			TIM_SetCompare2(TIM2,1000-Speed);

		}
		else
		{
			TIM_SetCompare1(TIM2,1000+Speed);
			TIM_SetCompare2(TIM2,1000);
		}
		
	}
}

Motor.h

#ifndef __MOTOR_H__
#define __MOTOR_H__

void Motor_Init(void);
void Motor_SetSpeed(int16_t Speed);

#endif

更改arr和psc的时候注意把占空比也改一下,这里我是用PWM100%来模拟逻辑1,0占空比模拟逻辑0

DRV8833电机驱动,制动模式和滑动模式比较

作者:A-pezer

物联沃分享整理
物联沃-IOTWORD物联网 » stm32使用drv8833驱动电机

发表回复