【STM32】DRV8833驱动电机

张春  论坛元老 | 2025-2-16 06:47:21 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1031|帖子 1031|积分 3093

1.电机如何转动

只须要给电机两个端子加一正一负的极性就会转起来了,但是要留意的是不要将电机两端直接接在5v和gnd之间,这种电机一样寻常要提供几百毫安的电流,而GPIO口只能提供几毫安,所以我们使用一个DRV8833来驱动

DRV8833输入口要接PA0,PA1,并且供电,通过OUT1,OUT2毗连电机

IN1,IN2对应PA0,PA1。
如果要使电机转速发生改变,我们可以将通入DRV8833的IN1,IN2接PWM即可。通过改变高电平时间实现转速的快慢

2.DRV8833


由于有两对输出口,则一个DRV8833可以驱动两个电机,对应SLEEP引脚是如果开启,则驱动芯片克制工作,实现低功耗,FAULT引脚是出现控制错误时提示单片机
3.DRV8833驱动代码

drv8833.h
  1. #ifndef __DRV8833_H_
  2. #define __DRV8833_H_
  3. #include <stdint.h>
  4. /**
  5. * @brief 衰减模式枚举
  6. */
  7. typedef enum {
  8.     SLOW_DECAY,  /**< 慢衰减模式 */
  9.     FAST_DECAY   /**< 快衰减模式 */
  10. } DecayMode;
  11. /**
  12. * @brief 初始化DRV8833
  13. */
  14. void DRV8833_Init(void);
  15. /**
  16. * @brief 设置衰减模式
  17. * @param mode 衰减模式
  18. */
  19. void DRV8833_SetDecayMode(DecayMode mode);
  20. /**
  21. * @brief 控制电机前进
  22. * @param speed 速度值(0-100)
  23. */
  24. void DRV8833_Forward(uint8_t speed);
  25. /**
  26. * @brief 控制电机后退
  27. * @param speed 速度值(0-100)
  28. */
  29. void DRV8833_Backward(uint8_t speed);
  30. /**
  31. * @brief 电机刹车
  32. */
  33. void DRV8833_Brake(void);
  34. /**
  35. * @brief 电机滑行
  36. */
  37. void DRV8833_Coast(void);
  38. #endif /* __DRV8833_H_ */
复制代码
drv8833.c
  1. /**
  2. * @file drv8833.c
  3. * @brief DRV8833双H桥电机驱动器控制实现
  4. */
  5. #include "drv8833.h"
  6. #include "tim.h"
  7. /** @brief IN1引脚的定时器 */
  8. #define IN1_TIM &htim2
  9. /** @brief IN2引脚的定时器 */
  10. #define IN2_TIM &htim2
  11. /** @brief IN1引脚的定时器通道 */
  12. #define IN1_CH TIM_CHANNEL_1
  13. /** @brief IN2引脚的定时器通道 */
  14. #define IN2_CH TIM_CHANNEL_2
  15. /** @brief 最大速度值 */
  16. #define MAX_SPEED 100
  17. /** @brief 当前衰减模式 */
  18. static DecayMode currentDecayMode = SLOW_DECAY;
  19. /**
  20. * @brief 设置IN1引脚的PWM占空比
  21. * @param duty 占空比值
  22. */
  23. static inline void __SetIn1PWM(uint8_t duty)
  24. {
  25.     __HAL_TIM_SET_COMPARE(IN1_TIM, IN1_CH, duty);
  26. }
  27. /**
  28. * @brief 设置IN2引脚的PWM占空比
  29. * @param duty 占空比值
  30. */
  31. static inline void __SetIn2PWM(uint8_t duty)
  32. {
  33.     __HAL_TIM_SET_COMPARE(IN2_TIM, IN2_CH, duty);
  34. }
  35. /**
  36. * @brief 初始化DRV8833
  37. */
  38. void DRV8833_Init(void)
  39. {
  40.     HAL_TIM_PWM_Start(IN1_TIM, IN1_CH);
  41.     HAL_TIM_PWM_Start(IN2_TIM, IN2_CH);
  42. }
  43. /**
  44. * @brief 设置衰减模式
  45. * @param mode 衰减模式
  46. */
  47. void DRV8833_SetDecayMode(DecayMode mode)
  48. {
  49.     currentDecayMode = mode;
  50. }
  51. /**
  52. * @brief 控制电机前进
  53. * @param speed 速度值(0-100)
  54. */
  55. void DRV8833_Forward(uint8_t speed)
  56. {
  57.     if (speed > MAX_SPEED)
  58.         speed = MAX_SPEED;
  59.    
  60.     if (currentDecayMode == FAST_DECAY) {
  61.         __SetIn1PWM(speed);
  62.         __SetIn2PWM(0);
  63.     } else {
  64.         __SetIn1PWM(MAX_SPEED);
  65.         __SetIn2PWM(MAX_SPEED - speed);
  66.     }
  67. }
  68. /**
  69. * @brief 控制电机后退
  70. * @param speed 速度值(0-100)
  71. */
  72. void DRV8833_Backward(uint8_t speed)
  73. {
  74.     if (speed > MAX_SPEED)
  75.         speed = MAX_SPEED;
  76.    
  77.     if (currentDecayMode == FAST_DECAY) {
  78.         __SetIn1PWM(0);
  79.         __SetIn2PWM(speed);
  80.     } else {
  81.         __SetIn1PWM(MAX_SPEED - speed);
  82.         __SetIn2PWM(MAX_SPEED);
  83.     }
  84. }
  85. /**
  86. * @brief 电机刹车
  87. */
  88. void DRV8833_Brake(void)
  89. {
  90.     __SetIn1PWM(MAX_SPEED);
  91.     __SetIn2PWM(MAX_SPEED);
  92. }
  93. /**
  94. * @brief 电机滑行
  95. */
  96. void DRV8833_Coast(void)
  97. {
  98.     __SetIn1PWM(0);
  99.     __SetIn2PWM(0);
  100. }
复制代码
4.使用

使用旋转编码器控制电机转动,旋转编码器顺时针转实现电机正转,并且越转越快。
旋转编码器逆时针转实现电机反转并且越转越快



PA0,PA1刚好是定时器2的1通道和2通道



使用屏幕配置i2c
5.代码

  1. #include "drv8833.h"
  2. #include "oled.h"
  3. #include <stdio.h>
  4. #define MAX_COUNT 20
  5. int main(void)
  6. {
  7.   MX_GPIO_Init();
  8.   MX_I2C1_Init();
  9.   MX_TIM1_Init();
  10.   MX_TIM2_Init();
  11.   /* USER CODE BEGIN 2 */
  12.   OLED_Init();
  13.   HAL_TIM_Encoder_Start(&htim1,TIM_CHANNEL_ALL);//打开编码器计数
  14.   DRV8833_Init();//打开PWM通道
  15.   int count;
  16.   char message[50]="";
  17.   int speed;//电机的占空比0~100
  18.   __HAL_TIM_SET_COUNTER(&htim1,MAX_COUNT);//先设置为20,让电机不转
  19.   
  20.   while (1)
  21.   {
  22.           count=__HAL_TIM_GET_COUNTER(&htim1);//获取编码器计数
  23.           if(count>60000)//逆时针转      //保证编码器计数在0~40
  24.           {
  25.                   count=0;
  26.                   __HAL_TIM_SET_COUNTER(&htim1,0);
  27.           }
  28.           else if(count>MAX_COUNT*2)
  29.           {
  30.                   count=MAX_COUNT*2;
  31.                  __HAL_TIM_SET_COUNTER(&htim1,MAX_COUNT*2);
  32.           }
  33.           if(count<MAX_COUNT)//反转,count越接近0,越快
  34.           {
  35.                   speed=(MAX_COUNT-count)*100/MAX_COUNT;//speed在0~100,先×100,如果0~20数/20会为0
  36.                   DRV8833_Forward(speed);
  37.           }
  38.           else//正转,count越接近40,越快,count为20,speed为0,不转
  39.           {
  40.                   speed=(count-MAX_COUNT)*100/MAX_COUNT;
  41.                   DRV8833_Backward(speed);
  42.           }
  43.            OLED_NewFrame();
  44.            sprintf(message,"count:%d",count);//显示编码器计数
  45.            OLED_PrintString(10,0,message,&font16x16, OLED_COLOR_NORMAL);
  46.            sprintf(message,"speed:%d",speed);//显示速度
  47.            OLED_PrintString(10,20,message,&font16x16, OLED_COLOR_NORMAL);
  48.            if(count<20)
  49.                    OLED_PrintString(10,40,"反转",&font16x16, OLED_COLOR_NORMAL);
  50.            else if(count>20)
  51.                    OLED_PrintString(10,40,"正转",&font16x16, OLED_COLOR_NORMAL);
  52.            OLED_ShowFrame();
  53.            HAL_Delay(10);
  54.   }
  55. }
复制代码
  1. DRV8833_Forward(speed);
  2. DRV8833_Forward(speed);//操作定时器2的1,2通道通过设置比较寄存器的值来改变占空比,控制转速
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张春

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表