本帖为测试参加活动获得的Adafruit TB6612电机驱动板。使用ESP8266作为控制主板,测试如何驱动直流电机。
一、与直流电机的接线方式
1、接线如下:
TB6612 ESP8266
====================================
AIN1 GPIO5 // D1 - GPIO5
AIN2 GPIO4 // D2 - GPIO4
BIN1 GPIO0 // D3 - GPIO0
BIN2 GPIO2 // D4 - GPIO2
PWMA GPIO14 // D5 - GPIO14
PWMB GPIO12 // D6 - GPIO12
STBY GPIO13 // D7 - GPIO13
GND GND
VCC VCC
====================================

2、电机的选择
TB6612电机驱动板的马达电压范围为4.5V到13.5V,出于安全考虑,本次测试使用的是9V电压,电机是从废弃的扫地机上得到的两个直流电机。
3、关于PWMA和PWMB的测试
测试中,为了测试TB6612的PWMA和PWMB的作用,加入可调电阻模块,供ESP8266的ADC端采集可变电压,并转换为PWM波,输出给PWMA和PWMB。表现为测试中旋转可调电阻,改变电机的转速。
二、程序代码
1、代码
本程序使用Arduino开发,代码如下:
#include <ESP8266WiFi.h>
#include <Ticker.h>
// TB6612引脚定义
#define AIN1 5 // D1 - GPIO5
#define AIN2 4 // D2 - GPIO4
#define BIN1 0 // D3 - GPIO0
#define BIN2 2 // D4 - GPIO2
#define PWMA 14 // D5 - GPIO14
#define PWMB 12 // D6 - GPIO12
#define STBY 13 // D7 - GPIO13
// 定义ADC输入引脚
const int analogPin = A0; // ADC输入引脚
// PWM参数
const int pwmFrequency = 1000; // PWM频率 1kHz
const int pwmResolution = 10; // PWM分辨率 10位 (0-1023)
Ticker timer; // 创建定时器对象
// 中断处理函数
void timerISR() {
// 读取ADC值 (0-1023)
int adcValue = analogRead(analogPin);
// 计算电压值 (ESP8266 ADC参考电压约1.0V)
float voltage = (adcValue / 1023.0) * 1.0;
// 直接映射ADC值到PWM输出
// 如果需要不同的映射关系,可以在这里修改
int pwmValue = adcValue;
// // 串口输出调试信息(定时器中断中尽量不能用)
// Serial.print("ADC: ");
// Serial.print(adcValue);
// Serial.print(" | 电压: ");
// Serial.print(voltage, 3);
// Serial.print("V | PWM: ");
// Serial.println(pwmValue);
// 输出PWM
analogWrite(PWMA, pwmValue);
analogWrite(PWMB, pwmValue);
}
void setup() {
Serial.begin(115200);
// 初始化定时器(100mS采集一次ADC)
// 设置定时器中断,每10ms触发一次
timer.attach_ms(10, timerISR);
Serial.println("\nESP8266 TB6612电机驱动测试");
// 初始化
// 设置引脚模式
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);
pinMode(STBY, OUTPUT);
pinMode(PWMA, OUTPUT);
pinMode(PWMB, OUTPUT);
// 设置PWM引脚和频率
analogWriteFreq(pwmFrequency); // 设置PWM频率
analogWriteRange(1023); // 设置PWM范围 (0-1023)
// 使能驱动器
digitalWrite(STBY, HIGH);
// 等待串口准备就绪
delay(1000);
}
void loop() {
// 电机A:正转
Serial.println("测试电机A:正转");
digitalWrite(AIN1, HIGH);
digitalWrite(AIN2, LOW);
digitalWrite(BIN1, HIGH);
digitalWrite(BIN2, HIGH);
delay(3000);
// 电机A:反转
Serial.println("测试电机A:反转");
digitalWrite(AIN1, LOW);
digitalWrite(AIN2, HIGH);
digitalWrite(BIN1, HIGH);
digitalWrite(BIN2, HIGH);
delay(3000);
// 电机B:正转
Serial.println("测试电机B:正转");
digitalWrite(AIN1, HIGH);
digitalWrite(AIN2, HIGH);
digitalWrite(BIN1, HIGH);
digitalWrite(BIN2, LOW);
delay(3000);
// 电机B:反转
Serial.println("测试电机B:反转");
digitalWrite(AIN1, HIGH);
digitalWrite(AIN2, HIGH);
digitalWrite(BIN1, LOW);
digitalWrite(BIN2, HIGH);
delay(3000);
}2、处理逻辑说明
测试中为了能明确看到马达转动,需要加上一定的延时,为了能直观观察PWMA和PWMB在转动中起到的调速作用,程序中加入定时中断。在定时中断中检测ADC端子的输入电压,并将该电压转换为不同占空比的PWM波提供给PWMA和PWMB,使马达的转速即时发生变化。
三、装置实图

接线时注意电机接入TB6612的极性别搞反了,否则会导致在同样的逻辑控制下两个电机的正反转表现相反。
四、运行结果

可以看到,随着可调电阻的调整,电机转速会发生变化。这就是PWMA和PWMB所起到的作用。
我要赚赏金
