赞
踩
本设计是基于ESP—WROOM—32,用TB6612FNG驱动12V直流电机来控制电机的正反转及速度。通过IO14、12输出逻辑控制电机A转向,IO27、26输出逻辑控制电机B转向,IO25与IO33输出PWM控制电机A、B的转速。
TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速与方向,输入电压在3V~12V,因此在集成化、小型化的电机控制系统中,它可以作为理想的电机驱动器件。
引脚 | 定义 |
VM | 驱动电压输入端(3-12V) |
VCC | 逻辑电平输入端(2.7-5.5) |
GND | 电源地端 |
STBY | 正常工作/待机状态控制输入端 |
PWMA | PWM信号输入端 |
AIN1 | 电机A控制模式输入端 |
AIN2 | |
A01 | 电机A驱动输入端 |
A02 | |
PWMB | PWM信号输入端 |
BIN1 | 电机B控制模式输入端 |
BIN2 | |
B01 | 电机B驱动输出端 |
B02 |
在本设计中,VM接12V电源,STBY接3.3V电压,VCC接3.3V电压,GND接电源GND(只需接一个GND接口即可)。
ESP32—WROOM—32功能强大,用途广泛,可以用于低功耗传感器网络要求极高的任务,此款模组的核心是ESP32芯片,具有可拓展、自适应的特点。集成了丰富的外设,包括电容式触摸传感器、霍尔传感器等等。可以实现最大范围的无线通信。此设计选用ESP32作为主控,可拓展性较高。
- #include <Arduino.h>
- #include <Ticker.h>
-
- Ticker timer_control;
-
- //TB6612FNG驱动模块控制信号 共6个
- #define IN1 14 //控制电机1的方向A,01为正转,10为反转
- #define IN2 12 //控制电机1的方向B,01为正转,10为反转
- #define IN3 27 //控制电机2的方向A,01为正转,10为反转
- #define IN4 26 //控制电机2的方向B,01为正转,10为反转
-
- #define PWMA 25 //控制电机1 PWM控制引脚
- #define PWMB 33 //控制电机2 PWM控制引脚
-
- #define freq 50000 //PWM波形频率5KHZ
- #define pwm_Channel_1 0 //使用PWM的通道0
- #define pwm_Channel_2 1 //使用PWM的通道1
-
- #define resolution 8 //使用PWM占空比的分辨率,占空比最大可写2^8-1=255
- #define interrupt_time_control 15//定时器15ms中断控制时间
-
- int pwmA1=0,pwmB1=0;
- void Set_Pwm(int moto1, int moto2)
- {
- int Amplitude = 255; //===PWM满幅是256 限制在255
- Serial.println(moto1);
- Serial.println(moto2);
- if (moto1 > 0) digitalWrite(IN1, HIGH), digitalWrite(IN2, LOW); //TB6612的电平控制
- if (moto1 < 0) digitalWrite(IN1, LOW), digitalWrite(IN2, HIGH); //TB6612的电平控制
-
- if (moto2 > 0) digitalWrite(IN3, HIGH), digitalWrite(IN4, LOW); //TB6612的电平控制
- if (moto1 < 0) digitalWrite(IN3, LOW), digitalWrite(IN4, HIGH); //TB6612的电平控制
-
- //限制PWM
- if (moto1 < -Amplitude) moto1 = -Amplitude;
- if (moto1 > Amplitude) moto1 = Amplitude;
- if (moto2 < -Amplitude) moto2 = -Amplitude;
- if (moto2 > Amplitude) moto2 = Amplitude;
-
- ledcWrite(pwm_Channel_1,abs(moto1));
- ledcWrite(pwm_Channel_2,abs(moto2));
- }
-
- void control()
- {
- Set_Pwm(pwmA1,pwmB1);
- }
- void serial_debug()
- {
- if(Serial.available()>0)
- {
- delay(5);
- char DATA=Serial.read();
- switch(DATA)
- {
- case'1':
- pwmA1++;
- pwmB1++;
- Serial.print("pwmA_B:");
- Serial.println(pwmA1);
- Serial.println(pwmB1);
-
- break;
- case'2':
- pwmA1--;
- pwmB1--;
- Serial.print("pwmA_B:");
- Serial.println(pwmA1);
- Serial.println(pwmB1);
- break;
- }
- }
- }
-
- /*********************************setup**********************************/
- void setup()
- {
- pinMode(IN1, OUTPUT); //TB6612控制引脚,控制电机1的方向,01为正转,10为反转
- pinMode(IN2, OUTPUT); //TB6612控制引脚,
- pinMode(IN3, OUTPUT); //TB6612控制引脚,控制电机2的方向,01为正转,10为反转
- pinMode(IN4, OUTPUT); //TB6612控制引脚,
- pinMode(PWMA, OUTPUT); //TB6612控制引脚,电机PWM
- pinMode(PWMB, OUTPUT); //TB6612控制引脚,电机PWM
-
- digitalWrite(IN1, LOW);
- digitalWrite(IN2, LOW);
- digitalWrite(IN3, LOW);
- digitalWrite(IN4, LOW);
-
- Serial.begin(115200);
-
- ledcSetup(pwm_Channel_1, freq, resolution); //PWM通道一开启设置
- ledcAttachPin(PWMA, pwm_Channel_1); //PWM通道一和引脚PWMA关联
- ledcWrite(pwm_Channel_1, pwmA1); //PWM通道一占空比设置为零
-
- ledcSetup(pwm_Channel_2, freq, resolution); //PWM通道二开启设置
- ledcAttachPin(PWMB, pwm_Channel_2); //PWM通道二和引脚PWMB关联
- ledcWrite(pwm_Channel_2, pwmB1); //PWM通道二占空比设置为零
-
- timer_control.attach_ms(interrupt_time_control, control); //定时器中断开启
- }
-
- /************************************loop************************************/
- void loop()
- {
- Set_Pwm(pwmA1,pwmB1);
- serial_debug();
- control();
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。