设计简介
本设计是基于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 | 正常工作/待机状态控制输入端 |
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简介
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();
}