一、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 = 0Motor_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