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

设计简介

本设计是基于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();
}

相关推荐

  1. stm32学习探究:利用TB6612驱动直流电

    2024-02-09 10:00:01       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-09 10:00:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-09 10:00:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-09 10:00:01       87 阅读
  4. Python语言-面向对象

    2024-02-09 10:00:01       96 阅读

热门阅读

  1. AcWing 829. 模拟队列

    2024-02-09 10:00:01       54 阅读
  2. 深入挖掘AI应用场景的存储架构

    2024-02-09 10:00:01       60 阅读
  3. Python中数字和字符串的最佳实践(下)

    2024-02-09 10:00:01       51 阅读
  4. CDN缓存404、403状态码

    2024-02-09 10:00:01       42 阅读
  5. 数据结构之基数排序

    2024-02-09 10:00:01       55 阅读
  6. servlet和cgi区别

    2024-02-09 10:00:01       55 阅读