TI MSPM0G3507开发板驱动TB6612FNG电机模块实战从引脚配置到PWM调速移植最近在准备一个小车项目需要用到直流电机对比了几款驱动芯片后最终选了TB6612FNG。这模块确实比经典的L298N强不少效率高、发热小体积也小巧。但好东西往往也比较“娇贵”接线时正负极搞反了可能瞬间就烧了所以咱们操作时一定要细心。今天我就以TI的MSPM0G3507开发板为例手把手带你完成TB6612电机驱动的代码移植和PWM调速。整个过程会涉及到硬件连接、SysConfig图形化配置、代码编写和功能验证。如果你正在做电赛或者智能小车这篇教程应该能帮你省下不少折腾的时间。1. 认识TB6612FNG电机驱动模块在动手接线和写代码之前咱们先花几分钟了解一下要驱动的对象——TB6612FNG模块。这能帮你更好地理解后续的配置逻辑。TB6612FNG是一个双路直流电机驱动芯片。说“双路”意思是它能独立控制两个直流电机。相比以前常用的L298N它的驱动效率更高功耗和发热都小很多特别适合用电池供电的移动平台比如小车。模块有几个关键的电气参数需要牢记接线和供电时绝对不能超电机驱动电压 (VM)最高不能超过12V。给你的电机供电就用这个引脚。芯片逻辑电压 (VCC)范围是2.7V到5.5V。这个电压用来给芯片内部的逻辑电路供电我们通常直接接单片机的3.3V或5V。单路输出电流持续电流最大1A瞬间峰值电流能到3A。驱动一般的微型减速电机足够了。模块的控制核心是几个数字引脚STBY (Standby)待机控制引脚。给它高电平比如3.3V芯片才进入工作状态给低电平所有电机输出立即停止进入低功耗待机模式。这是一个总开关。AIN1, AIN2这两引脚控制A路电机的输出状态AO1和AO2。BIN1, BIN2这两引脚控制B路电机的输出状态BO1和BO2。PWMA, PWMB分别是A路和B路电机的PWM速度控制引脚。通过给这两个引脚输入不同占空比的PWM波就能控制电机的转速。电机正反转的逻辑其实就是控制AIN1/AIN2或BIN1/BIN2这两根线的电平组合。你可以把它想象成一个H桥电路正转AIN10, AIN21反转AIN11, AIN20刹车AIN11, AIN21停止AIN10, AIN20而电机的快慢则由PWMA引脚输入的PWM信号的占空比来决定。占空比越大平均电压越高电机转得就越快。2. 硬件连接与引脚规划理解了原理接下来就把模块和MSPM0G3507开发板连起来。接线是硬件开发的基础务必仔细。首先确保供电正确将TB6612模块的VCC引脚连接到开发板的3.3V电源引脚给驱动芯片逻辑部分供电。将TB6612模块的GND引脚连接到开发板的GND确保共地。将电机的电源比如电池盒的正负极接到TB6612模块的VM和GND上。注意电机电压不要超过12V。将电机的两根线分别接到模块的AO1和AO2以控制A路电机为例。注意VM和VCC的GND是内部连通的在外部接线时确保所有GND开发板、模块、电机电源都可靠连接在一起这是保证信号正常的基础。然后是信号线的连接。我们需要为MSPM0G3507开发板上的GPIO引脚分配功能。这里我规划一下你可以根据自己板子的实际情况调整MSPM0G3507引脚功能连接至TB6612引脚作用说明某个GPIO (如P0.0)STBY控制芯片待机/工作本例中我们直接接3.3V常开启某个GPIO (如P0.1)AIN1控制A路电机方向位1某个GPIO (如P0.2)AIN2控制A路电机方向位2某个支持PWM输出的引脚 (如P0.3)PWMA输出PWM波控制A路电机速度为了简化本教程我们将STBY引脚直接接3.3V让芯片一直处于工作状态。电机的启停完全通过AIN1/AIN2和PWMA来控制。这样我们就只需要在MCU上配置3个引脚。3. 使用SysConfig图形化配置引脚TI为MSPM0系列提供了非常方便的SysConfig图形化配置工具咱们不用再手动去查寄存器了。下面跟着我一步步操作。打开工程在你的CCS或IAR工程里找到并双击empty.syscfg文件或其他你工程中的.syscfg文件它会打开SysConfig配置界面。添加GPIO配置在界面左侧的“Software”或“Peripherals”栏里找到并点击GPIO。然后点击Add按钮为我们的AIN1和AIN2添加两个GPIO输出配置。在新增的GPIO实例配置中首先在Pin下拉菜单里选择你计划使用的具体引脚比如P0.1。将Direction设置为Output。Initial Output Value可以先设为Low。给这个配置起个易懂的名字比如AIN1。重复以上步骤为AIN2再添加一个GPIO输出配置比如使用P0.2命名为AIN2。添加PWM配置接下来配置PWM引脚。在左侧找到Timer或PWM相关的配置项MSPM0中PWM通常由通用定时器产生。添加一个定时器配置。选择支持PWM输出的定时器实例例如TIMER0。在Operating Mode中选择PWM模式。在Channel配置中选择你计划输出PWM的引脚比如P0.3并将其功能映射到定时器的某个比较输出通道上例如Channel 0。配置PWM频率。在Period或相关选项里设置定时器的周期值。这个值决定了PWM的频率。频率太高电机可能不转太低可能会有噪音对于直流电机通常1kHz到20kHz都是常见范围。你可以先设一个值比如1000Hz。同样给这个PWM配置起个名字比如MOTOR_PWM。保存并生成代码所有配置完成后点击右上角的Save按钮保存配置。提示保存时如果弹出对话框询问是否生成代码一定要选择Yes to All这样工具才会自动根据你的图形化配置更新底层的驱动代码文件。处理生成的文件保存后SysConfig工具会自动生成或更新ti_msp_dl_config.h和ti_msp_dl_config.c等文件。在这些文件里你刚才定义的AIN1、AIN2、MOTOR_PWM都会以宏定义或常量的形式存在。我们的工程通常已经包含了board.h头文件而board.h又会包含ti_msp_dl_config.h。所以在后续自己的代码里我们只需要#include “board.h”就可以使用那些引脚定义了。4. 编写电机驱动代码硬件和底层配置好了现在来写咱们自己的应用层驱动代码。我们会创建两个文件bsp_tb6612.h和bsp_tb6612.c。首先看头文件bsp_tb6612.h它主要进行宏定义和函数声明#ifndef _BSP_TB6612_H #define _BSP_TB6612_H #include board.h // 包含所有通过SysConfig生成的引脚定义 /* 控制AIN1引脚输出的宏函数 * 参数X: 1-输出高电平0-输出低电平 */ #define AIN1_OUT(X) ( (X) ? (DL_GPIO_setPins(GPIO_PORT_AIN1, GPIO_PIN_AIN1)) : (DL_GPIO_clearPins(GPIO_PORT_AIN1, GPIO_PIN_AIN1)) ) /* 控制AIN2引脚输出的宏函数 */ #define AIN2_OUT(X) ( (X) ? (DL_GPIO_setPins(GPIO_PORT_AIN2, GPIO_PIN_AIN2)) : (DL_GPIO_clearPins(GPIO_PORT_AIN2, GPIO_PIN_AIN2)) ) /* 函数声明控制A端口电机 * 参数dir: 方向1-正转0-反转 * 参数speed: 速度值对应PWM比较寄存器的值范围(0 ~ Period-1) */ void AO_Control(uint8_t dir, uint32_t speed); #endif /* _BSP_TB6612_H */这里用了宏函数来操作GPIO好处是代码简洁直观。GPIO_PORT_AIN1、GPIO_PIN_AIN1这些标识符就是你在SysConfig里为引脚起的名字工具会自动生成。然后是源文件bsp_tb6612.c这里实现了核心的控制函数#include bsp_tb6612.h /****************************************************************** * 函数名称AO_Control * 函数说明A端口电机控制函数 * 函数形参dir-旋转方向 (1正转0反转)speed-PWM比较值决定速度 * 函数返回无 * 作 者LC * 备 注speed值不能大于或等于PWM定时器的周期值(Period) ******************************************************************/ void AO_Control(uint8_t dir, uint32_t speed) { // 根据方向参数dir设置AIN1和AIN2的电平 if( dir 1 ) // 正转 { AIN1_OUT(0); // AIN1 0 AIN2_OUT(1); // AIN2 1 } else // 反转 { AIN1_OUT(1); // AIN1 1 AIN2_OUT(0); // AIN2 0 } // 更新PWM通道的比较值改变输出占空比从而调节速度 // PWM_INST 是定时器实例GPIO_PWM_C0_IDX 是通道索引这些都在SysConfig中定义好了 DL_TimerG_setCaptureCompareValue(PWM_INST, speed, GPIO_PWM_C0_IDX); }这个函数逻辑很清晰先根据方向dir设置好两个方向控制引脚的电平组合形成正转或反转的驱动状态然后通过DL_TimerG_setCaptureCompareValue这个库函数修改PWM通道的比较值。比较值speed相对于定时器周期Period的比例就是PWM的占空比。speed越大高电平时间越长电机转速越快。当speed为0时占空比0%电机停止当speed等于Period-1时占空比接近100%电机全速运行。5. 功能验证与调速测试代码写好了最后一步就是烧录到板子上看看电机能不能听话地转起来。我们在主函数main.c里写一个简单的测试程序。#include board.h #include bsp_tb6612.h // 假设有一个简单的毫秒延时函数你需要根据你的SDK实现或替换 extern void delay_ms(uint32_t ms); int main(void) { // 开发板初始化包括时钟、GPIO、PWM等外设的初始化 board_init(); // 初始化后PWM已经开始以设定的频率运行占空比由初始比较值决定 while(1) { // 测试加速正转速度值从200逐步增加到800 for(int i 200; i 800; i 100) { AO_Control(1, i); // 控制A端电机正转速度递增 delay_ms(500); // 每个速度维持500毫秒 } // 测试减速反转速度值从800逐步减少到200 for(int j 800; j 200; j - 100) { AO_Control(0, j); // 控制A端电机反转速度递减 delay_ms(500); // 每个速度维持500毫秒 } // 循环执行电机将交替进行正转加速和反转减速 } }把程序编译下载到MSPM0G3507开发板并确保所有硬件连接正确再次检查电源和地线。上电后你应该能看到电机按照以下顺序运行开始以较低速度正转。每过半秒正转速度提升一档。达到较高速度后开始反转并且初始反转速度较高。每过半秒反转速度降低一档。回到较低速度后重新开始正转加速如此循环。这就说明我们的GPIO方向控制和PWM调速功能都移植成功了你可以尝试修改for循环里的速度值i和j它们的有效范围是0到PWM周期值-1。通过调整这个值就能实现对电机的无级调速。在实际项目里你可以把速度控制放在中断里或者根据传感器反馈来动态调整speed值实现更复杂的功能比如巡线小车的差速控制。希望这篇教程能帮你顺利搞定MSPM0和TB6612的搭配如果调试中遇到问题首先检查硬件连接然后是SysConfig里的引脚分配是否正确最后再排查代码逻辑。