当前位置:   article > 正文

ESP32—TB6612FNG直流电机驱动(arduion串口通信控制电机转速)_tb6612fng电机驱动模块

tb6612fng电机驱动模块

设计简介

本设计是基于ESP—WROOM—32,用TB6612FNG驱动12V直流电机来控制电机的正反转及速度。通过IO14、12输出逻辑控制电机A转向,IO27、26输出逻辑控制电机B转向,IO25与IO33输出PWM控制电机A、B的转速。

TB6612FNG简介 

TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速与方向,输入电压在3V~12V,因此在集成化、小型化的电机控制系统中,它可以作为理想的电机驱动器件。

引脚定义
VM驱动电压输入端(3-12V)
VCC逻辑电平输入端(2.7-5.5)
GND电源地端
STBY正常工作/待机状态控制输入端
PWMAPWM信号输入端
AIN1电机A控制模式输入端
AIN2
A01电机A驱动输入端
A02
PWMBPWM信号输入端
BIN1电机B控制模式输入端
BIN2
B01电机B驱动输出端
B02

在本设计中,VM接12V电源,STBY接3.3V电压,VCC接3.3V电压,GND接电源GND(只需接一个GND接口即可)。

ESP32简介

ESP32—WROOM—32功能强大,用途广泛,可以用于低功耗传感器网络要求极高的任务,此款模组的核心是ESP32芯片,具有可拓展、自适应的特点。集成了丰富的外设,包括电容式触摸传感器、霍尔传感器等等。可以实现最大范围的无线通信。此设计选用ESP32作为主控,可拓展性较高。

设计代码——通过串口通信实现对电机速度的控制

  1. #include <Arduino.h>
  2. #include <Ticker.h>
  3. Ticker timer_control;
  4. //TB6612FNG驱动模块控制信号 共6个
  5. #define IN1 14 //控制电机1的方向A,01为正转,10为反转
  6. #define IN2 12 //控制电机1的方向B,01为正转,10为反转
  7. #define IN3 27 //控制电机2的方向A,01为正转,10为反转
  8. #define IN4 26 //控制电机2的方向B,01为正转,10为反转
  9. #define PWMA 25 //控制电机1 PWM控制引脚
  10. #define PWMB 33 //控制电机2 PWM控制引脚
  11. #define freq 50000 //PWM波形频率5KHZ
  12. #define pwm_Channel_1 0 //使用PWM的通道0
  13. #define pwm_Channel_2 1 //使用PWM的通道1
  14. #define resolution 8 //使用PWM占空比的分辨率,占空比最大可写2^8-1=255
  15. #define interrupt_time_control 15//定时器15ms中断控制时间
  16. int pwmA1=0,pwmB1=0;
  17. void Set_Pwm(int moto1, int moto2)
  18. {
  19. int Amplitude = 255; //===PWM满幅是256 限制在255
  20. Serial.println(moto1);
  21. Serial.println(moto2);
  22. if (moto1 > 0) digitalWrite(IN1, HIGH), digitalWrite(IN2, LOW); //TB6612的电平控制
  23. if (moto1 < 0) digitalWrite(IN1, LOW), digitalWrite(IN2, HIGH); //TB6612的电平控制
  24. if (moto2 > 0) digitalWrite(IN3, HIGH), digitalWrite(IN4, LOW); //TB6612的电平控制
  25. if (moto1 < 0) digitalWrite(IN3, LOW), digitalWrite(IN4, HIGH); //TB6612的电平控制
  26. //限制PWM
  27. if (moto1 < -Amplitude) moto1 = -Amplitude;
  28. if (moto1 > Amplitude) moto1 = Amplitude;
  29. if (moto2 < -Amplitude) moto2 = -Amplitude;
  30. if (moto2 > Amplitude) moto2 = Amplitude;
  31. ledcWrite(pwm_Channel_1,abs(moto1));
  32. ledcWrite(pwm_Channel_2,abs(moto2));
  33. }
  34. void control()
  35. {
  36. Set_Pwm(pwmA1,pwmB1);
  37. }
  38. void serial_debug()
  39. {
  40. if(Serial.available()>0)
  41. {
  42. delay(5);
  43. char DATA=Serial.read();
  44. switch(DATA)
  45. {
  46. case'1':
  47. pwmA1++;
  48. pwmB1++;
  49. Serial.print("pwmA_B:");
  50. Serial.println(pwmA1);
  51. Serial.println(pwmB1);
  52. break;
  53. case'2':
  54. pwmA1--;
  55. pwmB1--;
  56. Serial.print("pwmA_B:");
  57. Serial.println(pwmA1);
  58. Serial.println(pwmB1);
  59. break;
  60. }
  61. }
  62. }
  63. /*********************************setup**********************************/
  64. void setup()
  65. {
  66. pinMode(IN1, OUTPUT); //TB6612控制引脚,控制电机1的方向,01为正转,10为反转
  67. pinMode(IN2, OUTPUT); //TB6612控制引脚,
  68. pinMode(IN3, OUTPUT); //TB6612控制引脚,控制电机2的方向,01为正转,10为反转
  69. pinMode(IN4, OUTPUT); //TB6612控制引脚,
  70. pinMode(PWMA, OUTPUT); //TB6612控制引脚,电机PWM
  71. pinMode(PWMB, OUTPUT); //TB6612控制引脚,电机PWM
  72. digitalWrite(IN1, LOW);
  73. digitalWrite(IN2, LOW);
  74. digitalWrite(IN3, LOW);
  75. digitalWrite(IN4, LOW);
  76. Serial.begin(115200);
  77. ledcSetup(pwm_Channel_1, freq, resolution); //PWM通道一开启设置
  78. ledcAttachPin(PWMA, pwm_Channel_1); //PWM通道一和引脚PWMA关联
  79. ledcWrite(pwm_Channel_1, pwmA1); //PWM通道一占空比设置为零
  80. ledcSetup(pwm_Channel_2, freq, resolution); //PWM通道二开启设置
  81. ledcAttachPin(PWMB, pwm_Channel_2); //PWM通道二和引脚PWMB关联
  82. ledcWrite(pwm_Channel_2, pwmB1); //PWM通道二占空比设置为零
  83. timer_control.attach_ms(interrupt_time_control, control); //定时器中断开启
  84. }
  85. /************************************loop************************************/
  86. void loop()
  87. {
  88. Set_Pwm(pwmA1,pwmB1);
  89. serial_debug();
  90. control();
  91. }

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

闽ICP备14008679号