STM32CubeMx DRV8833驱动
一、DRV8833驱动原理
STBY口接单片机的IO口,STBY置0电机全部停止,置1才能工作。STBY置1后通过AIN1、AIN2、BIN1、BIN2 来控制正反转。
AIN1 | AIN2 | 电机状态 |
0 | 0 | 停止 |
1 | speed | 反转 |
speed | 1 | 正转 |
1 | 1 | 停止 |
其中A端(AIN1与AIN2)只能控制AO1与AO2端。B端(BIN1与BIN2)只能控制BO1与BO2端。因此是双路电机驱动。speed为PWM控制的占空比,通过占空比控制电机速度。
DRV8833控制电机速度的方式,是通过将IN1与IN2接入PWM,直接通过调整PWM的占空比进行速度控制。因此要求AIN1/AIN2/BIN1/BIN2都要使用PWM功能。
二、cubemx配置
选c6t6
打开串口调试
选择外部高速晶振
打开串口一
开启串口一接收中断
配置输出引脚10KHZ
配置时钟
生成代码
三、keil代码
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
void SystemClock_Config(void);
//set dir1
void Motor_SetDirectionL(uint8_t dir)
{
if (dir == 1) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // IN1 = 1(f)
} else {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // IN1 = 0(b)
}
}
void Motor_SetSpeedL(uint16_t speed)
{
if (speed > 100) speed = 100;
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, speed);
}
//set dir2
void Motor_SetDirectionR(uint8_t dir)
{
if (dir == 1) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET); // IN1 = 1(f)
} else {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET); // IN1 = 0(b)
}
}
void Motor_SetSpeedR(uint16_t speed)
{
if (speed > 100) speed = 100;
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3, speed);
}
// ֹͣstop
void Motor_Stop()
{
Motor_SetSpeedL(0); // PWM = 0
Motor_SetSpeedR(0); // PWM = 0
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM2_Init();
MX_USART1_UART_Init();
while (1)
{
Motor_Stop();
HAL_Delay(1000);
Motor_SetDirectionL(1);
Motor_Stop();
Motor_SetSpeedL(90); //慢速衰减 可以跑的很慢(反比关系占比是100-90)
HAL_Delay(3000);
Motor_SetDirectionL(0);
Motor_Stop();
HAL_Delay(1000);
Motor_SetDirectionL(0);
Motor_Stop();
Motor_SetSpeedL(60); //快速衰减 跑得快(正比)
HAL_Delay(3000);
Motor_Stop();
HAL_Delay(1000);
}
}
用的是上面中间的两组跑,实际使用需要换引脚pwm输出
chem4111 2025-03-03 23.13.27