这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 学习使用TB6612驱动双直流电机

共1条 1/1 1 跳转至

学习使用TB6612驱动双直流电机

专家
2025-12-30 19:09:56     打赏

本帖为测试参加活动获得的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的极性别搞反了,否则会导致在同样的逻辑控制下两个电机的正反转表现相反。

四、运行结果

电机转速.gif

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





关键词: 懒猫的学习笔记     TB6612    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]