当前位置: 首页 > article >正文

STM32CubeMx DRV8833驱动

一、DRV8833驱动原理

STBY口接单片机的IO口,STBY置0电机全部停止,置1才能工作。STBY置1后通过AIN1、AIN2、BIN1、BIN2 来控制正反转。

AIN1AIN2电机状态
00停止
1speed反转
speed1正转
11停止

其中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


http://www.kler.cn/a/567962.html

相关文章:

  • C++里面四种强制类型转换
  • ES如何打印DSL
  • Oracle 认证为有哪几个技术方向
  • Java基础语法练习34(抽象类-abstract)(抽象类最佳实践-模版设计模式)
  • 数据挖掘中特征发现与特征提取的数学原理
  • 十、Spring Boot:Spring Security(用户认证与授权深度解析)
  • Cherry Studio + 火山引擎 构建个人AI智能知识库
  • 智慧园区后勤单位消防安全管理:安全运营和安全巡检
  • Postgresql高可用之Pacemaker+Corosync
  • 【前端基础】Day 2 CSS层叠样式表
  • Spring Boot 中 @Repository 注解全析
  • 文件上传漏洞绕过WAF
  • 【docker好用系列】llama-factory环境配置
  • Qt中如果槽函数运行时间久,避免阻塞主线程的做法
  • GPT-4.5 怎么样?如何升级使用ChatGPTPlus/Pro? GPT-4.5设计目标是成为一款非推理型模型的巅峰之作
  • 【nextjs官方demo】Chapter 6连接数据库报错
  • 深入解析React性能优化三剑客:React.memo、useMemo与useCallback
  • Go语言学习笔记(七)——标准库
  • 从指数族到混合模型的全新视角
  • 面试问题——如何解决移动端1px 边框问题?