一、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