对于版上已经集成MCU-Link的恩智浦开发板FRDM-MCXA153,使用官方的开发工具MCUXpresso IDE(最新版v25.6.136)即可,同时从https://mcuxpresso.nxp.com/zh制作改开发板专用的SDK开发包,将用到的参考例程导入到MCUXpresso IDE即可。此处略去导入处理过程。初次使用开发板,当从熟悉GPIO的输入输出处理开始,也就是LED亮灭程序开始学习,

连接开发板到计算机上,导入frdmmcxa153_gpio_led_output项目,为了证明是自己修改过的程序在运行,修改LED亮灭时间间隔,从800000改成12800000,其他什么都不改,Build项目并Debug运行,

看到右边那个红色的LED闪烁,说明程序烧录正常,运行正常。
接下来测试TB6612FN驱动板。

TB6612FN可以用来驱动两个独立的直流电机,或者一个双极步进电机。,每个通道最大支持1.2A的电流输出。芯片内部有两个完成的H桥。它内置了反冲二极管,这样就不用担心磁性感应信号的冲击会损坏器件。每个H桥有两个数字输入(桥的两半一个),每个单元还有一个PWM输入,可以控制电机转速。逻辑电压为2.7V-5V。电机电压与逻辑电压是分开的。适用于4.5V到13.5V的电机电压。
一、引脚信号
1、逻辑电平控制信号
※ Vcc、GND:逻辑控制端的电源和地
※ INA1、INA2:逻辑电平信号,电机A的H桥输入
※ PWMA:电机A的H桥的PWM输入,如果不需要PWM控制,可以接到逻辑高。
※ INB1、INB2:逻辑电平信号,电机B的H桥输入端
※ PWMB:电机B的H桥的PWM输入,如果不需要PWM控制,可以接到逻辑高电平。
※ STBY:这是用来快速关闭两个电机的备用引脚,通过10K电阻拉到Vcc。接地时表示禁止使用。
2、马达端信号
※ VM:马达电源
※ “+ ”逻辑电源
※ “-”:马达地、逻辑地,与逻辑控制端的GND是导通的。
※ Motor.A的两个端子给直流马达A使用
※ Motor.B的两个端子给直流马达B使用
如果是用的双极性步进电机,Motor.A对应一个极性绕组,Motor.B对应另一个极性绕组。
二、测试
根据TB6612的用户手册说明,按照以下接法,接到ESP8266上去。
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 ====================================
为了实现动态改变PWM,加入ADC处理,使用可调电阻模块。
可调电阻 ESP8266 ==================================== 调整端 ADC GND GND VCC VCC ====================================
接线图:

实拍:

测试代码:
#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);
}运行效果:

调节电位器,改变ADC输入电压,变换为PWM波,就会改变电机转速。至此TB6612测试完毕。其中的STBY没有测试,因为觉得有信号控制输入端只要是全1或者全0就能停止电机转动,所以没必要再测试STBY所起的作用了。
我要赚赏金
