stm32使用drv8833驱动电机
DRV8833电机驱动简介
DRV8833 是一款由德州仪器(Texas Instruments)生产的双 H 桥电机驱动芯片,主要用于驱动直流电机和步进电机。它的特点包括:
- 双 H 桥结构:能够驱动两个直流电机或者一个双极性步进电机。
- 电压范围广:支持2.7V 到 10.8V 的工作电压,非常适合便携式应用。
- 电流能力:每个通道能够提供最大 1.5A 的持续输出电流,峰值电流可达 2A(短时间内)。
- 保护功能:集成了欠压保护、过流保护、过热保护以及短路保护,确保驱动器在异常情况下能安全工作。
- 控制方式:可以通过简单的 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