当前位置:   article > 正文

智能车的电机驱动DRV8833、DRV8833驱动直流电机、DRV8833接线图、DRV8833 PWM、DRV8833驱动代码

drv8833

STM32F103C8T6为主控芯片,通过使用DRV8833来驱动直流电机,并用PWM来调节速度。

本文讲了DRV8833的接线、如何输出PWM、以及提供了相关的代码。

相关代码我放最后面了。

最近在用DRV8833这个驱动,但是没用过,不太懂,于是就去网上找相关资料,根据自己的理解发了本文,希望对大家有所帮助。(PS:本人能力有限,如有不对请指出)

前排提醒:

由于驱动直流电机需要的电流很大,单片机I/O的驱动能力是远远达不到的。因此需要使用专用的电机驱动芯片。此款电机驱动芯片即是基于上述的H桥电路。芯片中共有两个全H桥。因此最多可以同时驱动两个直流电机或一个步进电机。(详细的可以看这个佬的:(8条消息) 【电机驱动芯片(H桥、直流电机驱动方式)——DRV8833、TB6612、A4950、L298N的详解与比较】_h桥驱动芯片_默默无闻小菜鸡的博客-CSDN博客

这里我们只讲直流电机

1.引脚问题

电机驱动如上图。

本文用到的引脚及其功能如下图。

 

DRV8833的接线分两种情况:

一共有4个IN。(1)可以四个IN全接输出PWM的引脚                (2)四个IN可以两个接输出PWM的引脚,两个接普通引脚(不需要输出PWM)(文章下面的 2.PWM 里面我举的有例子,不懂可以先去看看),具体用哪个看实际情况。

4个PWM 接线:

        IN4和3  接PA2/PA3(TIM2的通道3和4,可输出PWM)

(只要可以输出PWM的引脚都可以,我自己用的是TIM2和3的通道3和4。请注意,C8T6只有TIM1到TIM4这4个定时器,大家用的时候注意一下,不要用到不存在的定时器)

         GND  接地

         VCC  范围在2.7V到11.8V

         IN2和1  接PB0/PB1(TIM3的通道3和4,可输出PWM)

         EEP  为保护输出,默认不用

         OUT1和2  接一个电机

(如果是霍尔编码器电机接M+和M-,顺序无所谓,到时候可以通过写程序判断正反转,并通过程序来控制正反转)

         OUT3和4  接另一个电机

(如果是霍尔编码器电机接M+和M-,顺序无所谓,到时候可以通过写程序判断正反转,并通过程序来控制正反转)

        ULT  不接

2个PWM+2个IO口接线:

        IN4和3  接PA5/PB0(PA5为IO口,不用于输出PWM;PB0为TIM3的通道3,输出PWM)

         GND  接地

         VCC  范围在2.7V到11.8V(最好大一点,毕竟要驱动电机。但不能超过最大值,会烧驱动的)

         IN2和1  接PA4/PB1(PA4为IO口,不用于输出PWM;PB1为TIM3的通道4,输出PWM)

         EEP  为保护输出,默认不用

         OUT1和2  接一个电机

(如果是霍尔编码器电机接M+和M-,顺序无所谓,到时候可以通过写程序判断正反转,并通过程序来控制正反转)

         OUT3和4  接另一个电机

(如果是霍尔编码器电机接M+和M-,顺序无所谓,到时候可以通过写程序判断正反转,并通过程序来控制正反转)

        ULT  不接

2.PWM波

这个驱动没有专门给输出PWM的引脚,它的PWM直接通过IN1/2/3/4进行输出,也可以一个输出PWM一个不输出,而是用普通IO。

(这里只拿IN1/2做例子了,IN3/4同理)

一个普通IO口和一个PWM:

当IN1接PA4作为普通IO,IN2接PB1作为输出PWM的IO口时:

PA4为低电平时(假设此时电机正转),随着IN2即PB1输出的PWM的占空比增大,电机转速增大。

PA4为高电平时(此时电机反转,和上面方向相反),随着IN2即PB1输出的PWM的占空比减小,电机转速正增大。

另一个电机也同理,只是引脚变了。

两个都是PWM:

当IN1的PWM波的占空比为零,IN2的PWM波的占空比不为零(有数值)时,电机向一个方向旋转,且转速随IN2的占空比增大而增大。

当IN1的PWM波的占空比不为零(有数值),IN2的PWM波的占空比为零,电机向相反的方向旋转,且转速随IN1的占空比增大而增大。

当IN1/2都有PWM波时,IN1/2的PWM波的两个占空比同时减去最小的那个占空比,这样就又回到了上面两种情况。

另一个电机也同理,只是引脚变了。

3.相关代码

本人是在江科大是代码上进行更改的,真正用到的只有PWM文件(输出PWM波)Motor文件(配置普通IO)和main.c。

PS:代码连接在最后面。

PWM

  1. #include "stm32f10x.h" // Device header
  2. void PWM_Init(void)
  3. {
  4. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3, ENABLE);
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
  9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  10. GPIO_Init(GPIOA, &GPIO_InitStructure);
  11. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  12. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
  13. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  14. GPIO_Init(GPIOB, &GPIO_InitStructure);
  15. TIM_InternalClockConfig(TIM2);
  16. TIM_InternalClockConfig(TIM3);
  17. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  18. TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  19. TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  20. TIM_TimeBaseInitStructure.TIM_Period = 100 - 1; //ARR
  21. TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1; //PSC
  22. TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
  23. TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
  24. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
  25. TIM_OCInitTypeDef TIM_OCInitStructure;
  26. TIM_OCStructInit(&TIM_OCInitStructure);//用默认值填充每个TIM_OCInitStruct成员
  27. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  28. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  29. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  30. TIM_OCInitStructure.TIM_Pulse = 0; //CCR
  31. TIM_OC3Init(TIM2, &TIM_OCInitStructure);
  32. TIM_OC4Init(TIM2, &TIM_OCInitStructure);
  33. TIM_OC3Init(TIM3, &TIM_OCInitStructure);
  34. TIM_OC4Init(TIM3, &TIM_OCInitStructure);
  35. //TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
  36. //TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
  37. TIM_Cmd(TIM2, ENABLE);
  38. TIM_Cmd(TIM3, ENABLE);
  39. }


                                                                        main

  1. #include "stm32f10x.h" // Device header
  2. #include "Motor.h"
  3. //void PWM_SetCompare3(uint16_t Compare);
  4. //int8_t Speed;
  5. int main(void)
  6. {
  7. Motor_Init();
  8. while (1)
  9. {
  10. //2个普通IO,2个PWM
  11. // GPIO_SetBits(GPIOA, GPIO_Pin_5);
  12. // GPIO_ResetBits(GPIOA, GPIO_Pin_5);
  13. //TIM_SetCompare3(TIM3, 100);//PB0
  14. // GPIO_SetBits(GPIOA, GPIO_Pin_4);//PWM的占空比越小电机转的越快
  15. // GPIO_ResetBits(GPIOA, GPIO_Pin_4);//PWM占空比越大,电机转的越快
  16. // TIM_SetCompare4(TIM3, 10);//PB1
  17. // 4个PWM
  18. TIM_SetCompare3(TIM2, 90);//PA2
  19. TIM_SetCompare4(TIM2, 100);//PA3
  20. TIM_SetCompare3(TIM3, 100);//PB0
  21. TIM_SetCompare4(TIM3, 10);//PB1
  22. }
  23. }

Motor

  1. #include "stm32f10x.h" // Device header
  2. #include "PWM.h"
  3. void Motor_Init(void)
  4. {
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
  9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  10. GPIO_Init(GPIOA, &GPIO_InitStructure);
  11. PWM_Init();
  12. }

4.代码连接 

用的百度网盘

链接:百度网盘 请输入提取码
提取码:CSDN

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/599675
推荐阅读
相关标签
  

闽ICP备14008679号