news 2026/8/27 4:51:20

TI电赛开发板实战:TB6612FNG电机驱动模块移植与PWM调速控制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
TI电赛开发板实战:TB6612FNG电机驱动模块移植与PWM调速控制

TI电赛开发板实战:TB6612FNG电机驱动模块移植与PWM调速控制

很多参加电赛或者刚开始学电机控制的朋友,可能还在用L298N模块。说实话,L298N发热大、效率低,做个演示还行,真要放到对功耗和体积有要求的比赛项目里,就有点力不从心了。最近我在用TI的电赛开发板(比如MSP430系列)做一个小车项目,就换上了TB6612FNG这个驱动模块,效果提升非常明显。

今天,我就手把手带你把这个高性能的TB6612FNG电机驱动模块,移植到你的TI开发板上,实现精准的PWM调速和正反转控制。整个过程从看芯片手册、配置引脚,到写驱动代码、调试,咱们一步步来。只要你跟着做,保证能让你的电机转起来!

1. 认识你的新武器:TB6612FNG模块

在动手接线写代码之前,咱们先得搞清楚手里这个“新武器”到底是个啥,比老旧的L298N强在哪。

TB6612FNG是一个双通道的直流电机驱动芯片。简单说,就是一颗芯片能独立控制两个直流电机。它最大的优点就是效率高、发热小。在额定工作范围内,芯片几乎不烫手,这意味着更多的电能被用来驱动电机,而不是白白浪费在发热上,特别适合电池供电的小车或机器人。

当然,性能强的同时,它也比L298N要“娇贵”一些。引脚更密集,接线时需要格外细心,正负极千万不能接反,否则芯片瞬间就可能损坏。所以,咱们接线时一定要“细心细心再细心”。

为了方便大家采购和查看官方资料,模块通常可以在电商平台找到。这里列出它的几个核心参数,你拿到模块后最好再核对一下:

参数规格说明
VM(电机电压)< 12V接电机的电源电压,不要超过12V。
VCC(逻辑电压)2.7V ~ 5.5V接单片机IO口的电压,为芯片内部逻辑供电。
输出电流1A (持续)每个通道能持续输出的电流大小。
控制方式PWM支持PWM信号进行调速控制。

2. 模块怎么工作?看懂引脚是第一步

要控制它,得先明白它身上这些引脚都是干嘛的。咱们结合数据手册来理解,这是工程师的必修课。

模块核心的控制逻辑其实很简单,主要靠两组信号:

  1. STBY (Standby) 引脚: 这是总使能引脚。它接单片机的某个GPIO口。当STBY为低电平(0)时,无论其他引脚怎么变化,两个电机都会强制停止,进入待机状态。当STBY为高电平(1)时,电机才能正常工作。在咱们的教程里,为了简化,直接把它接到开发板的3.3V电源上,让它一直处于使能状态。电机的启停我们通过另外的引脚来控制。
  2. AIN1/AIN2 和 BIN1/BIN2 引脚: 这是两路电机的方向控制引脚。A组(AIN1, AIN2)控制连接在AO1和AO2上的电机A;B组同理,控制电机B。它们俩的电平组合,决定了电机的转动方向。

具体的真值表是这么回事(以A路电机为例):

AIN1AIN2电机A状态
00停止/刹车
10正转
01反转
11停止/刹车
  1. PWMA/PWMB 引脚: 这是两路电机的速度控制引脚。分别接单片机产生的PWM信号。PWM占空比的大小,直接决定了电机的平均电压,从而控制转速。占空比越大,转速越快。

所以,控制一个电机的基本流程就是:STBY置高 -> 用AIN1/AIN2设定方向 -> 用PWMA输入PWM波设定速度。

3. 实战移植:从配置到代码

理论懂了,接下来就是实战。咱们的目标是在TI开发板的工程里,添加对TB6612FNG的驱动代码,实现电机的PWM调速。

3.1 硬件连接规划

首先,你得决定把模块的引脚接到开发板的哪个IO口上。这完全取决于你的开发板型号和你的布线方便。这里我假设一个连接方案,你需要根据实际情况调整:

  • STBY: 接开发板3.3V电源(常开)。
  • AIN1: 接 GPIO P1.0 (用于控制电机A方向)
  • AIN2: 接 GPIO P1.1 (用于控制电机A方向)
  • PWMA: 接 定时器PWM输出引脚 P2.0 (用于控制电机A速度)

注意:务必查阅你的TI开发板原理图,确保你选择的引脚没有被其他功能占用,并且支持GPIO输出和PWM输出功能。

3.2 使用SysConfig图形化工具配置引脚

TI的SDK通常提供了SysConfig工具,用图形化界面配置引脚和功能超级方便,能自动生成底层代码,避免手动写寄存器出错。

  1. 打开工程: 在你的CCS或IAR工程里,找到并双击empty.syscfg文件(或者类似名称的syscfg文件)。
  2. 启动SysConfig: 文件打开后,在界面里找到并点击Tools菜单,然后选择SYSCONFIG工具。一个图形化的配置界面就会弹出来。
  3. 添加配置: 点击ADD按钮,开始为我们的模块添加引脚配置。

    提示:如果工程里已经有其他示例代码(比如LED的配置),你可能需要先删除那些用不到的GPIO配置,保持工程干净。

  4. 配置GPIO: 在添加的配置项中,选择GPIO。然后根据你之前的硬件连接规划,分别找到P1.0P1.1引脚,将它们的功能设置为GPIO Output(GPIO输出)。你可以给它们起个易懂的名字,比如GPIO_AIN1_PINGPIO_AIN2_PIN
  5. 配置PWM: 同样地,添加一个定时器/PWM的配置。选择支持PWM输出的定时器(例如Timer_A),并将其对应的输出通道(例如P2.0)配置为PWM输出模式。给它起名GPIO_PWM_C0_IDX或类似的名字。
  6. 保存并生成代码: 所有配置完成后,点击保存按钮。

    警告:保存时,如果弹出对话框询问是否生成代码,一定要选择Yes to All,确保所有配置更新到代码中。

  7. 处理编译警告: 点击编译工程。可能会遇到一些警告,先不用管它,这通常是工具链自动调整过程中的正常现象。
  8. 查看生成结果: 配置完成后,SysConfig工具会自动在工程里生成或更新一个配置文件,通常是ti_msp_dl_config.h。这个文件里就定义了我们刚才配置的GPIO_AIN1_PINPWM_INST这些宏。因为我们的工程主文件board.h已经包含了这个配置文件,所以后续我们只需要#include “board.h”就能使用这些定义好的引脚了。

3.3 编写驱动层代码

图形化配置搞定底层硬件关联,现在我们来写真正控制电机的驱动代码。我们需要创建两个文件:bsp_tb6612.cbsp_tb6612.h(bsp意为板级支持包)。

第一步:创建头文件 (bsp_tb6612.h)这个文件主要做宏定义和函数声明。

#ifndef _BSP_TB6612_H #define _BSP_TB6612_H #include "board.h" // 包含SysConfig生成的引脚定义 /* 宏定义:方便控制AIN1和AIN2引脚电平 */ #define AIN1_OUT(X) ( (X) ? (DL_GPIO_setPins(GPIO_PORT, GPIO_AIN1_PIN)) : (DL_GPIO_clearPins(GPIO_PORT, GPIO_AIN1_PIN)) ) #define AIN2_OUT(X) ( (X) ? (DL_GPIO_setPins(GPIO_PORT, GPIO_AIN2_PIN)) : (DL_GPIO_clearPins(GPIO_PORT, GPIO_AIN2_PIN)) ) /* 函数声明 */ void AIN_GPIO_INIT(void); // 初始化方向控制GPIO void TB6612_Init(uint16_t pre, uint16_t per); // 初始化PWM定时器 void AO_Control(uint8_t dir, uint32_t speed); // 控制A路电机 #endif /* _BSP_TB6612_H */

第二步:创建源文件 (bsp_tb6612.c)这里是函数的具体实现,是驱动模块的核心。

#include "bsp_tb6612.h" /****************************************************************** * 函数名称:AIN_GPIO_INIT * 函数说明:初始化控制电机方向的GPIO引脚(AIN1, AIN2) * 函数形参:无 * 函数返回:无 ******************************************************************/ void AIN_GPIO_INIT(void) { // 这些DL_GPIO_initPin等函数的具体参数,通常由SysConfig在board.h或相关文件里提供 // 这里假设已经配置好,我们直接使用。 // 实际项目中,你可能需要调用类似 DL_GPIO_initPin(GPIO_PORT, GPIO_AIN1_PIN) 的函数。 // 由于SysConfig已配置,引脚初始化可能在board_init()中完成了。 // 此函数可作为预留或放置额外的GPIO配置。 } /****************************************************************** * 函数名称:TB6612_Init * 函数说明:初始化产生PWM的定时器 * 函数形参:pre-预分频器值, per-周期值(决定PWM频率) * 函数返回:无 * 备注:PWM频率 = 定时器时钟源 / (pre * per) ******************************************************************/ void TB6612_Init(uint16_t pre, uint16_t per) { // 初始化定时器,配置为PWM模式 // 以下为示例代码,具体函数名和参数请参照你的TI SDK文档 DL_TimerG_init(PWM_INST); DL_TimerG_setPrescaler(PWM_INST, pre); DL_TimerG_setPeriod(PWM_INST, per); DL_TimerG_enable(PWM_INST); // 配置PWM输出通道 DL_TimerG_startCounter(PWM_INST); } /****************************************************************** * 函数名称:AO_Control * 函数说明:A端口电机控制 * 函数形参:dir-旋转方向 (1:正转, 0:反转), speed-旋转速度 (0 ~ per-1) * 函数返回:无 ******************************************************************/ void AO_Control(uint8_t dir, uint32_t speed) { // 1. 首先控制方向 if( dir == 1 ) // 正转 { AIN1_OUT(0); // AIN1 = 0 AIN2_OUT(1); // AIN2 = 1 } else // 反转 { AIN1_OUT(1); // AIN1 = 1 AIN2_OUT(0); // AIN2 = 0 } // 2. 然后设置PWM比较值,控制速度 // speed值越大,高电平时间越长,电机越快。speed范围应在0到(周期值-1)之间。 DL_TimerG_setCaptureCompareValue(PWM_INST, speed, GPIO_PWM_C0_IDX); }

代码关键点解析:

  • AO_Control函数是控制的核心。它先根据dir参数设置AIN1/AIN2的电平组合,决定电机转向。
  • 然后通过DL_TimerG_setCaptureCompareValue函数设置PWM的占空比。speed参数就是比较值,它和定时器周期值的比例决定了占空比。speed为0时占空比0%,电机停止;speed接近周期值时占空比接近100%,电机全速。

4. 上机验证:让电机转起来!

驱动代码写好了,最后一步就是在主函数里调用它,看看电机能不能听话地转起来。

打开你的主程序文件(例如main.cempty.c),编写如下测试代码:

#include "board.h" #include <stdio.h> #include "bsp_tb6612.h" int main(void) { // 开发板初始化,包括时钟、SysConfig配置的GPIO等 board_init(); // 初始化TB6612驱动:预分频设为48,周期设为1000,决定PWM频率 // 假设系统时钟为48MHz,则PWM频率 = 48MHz / (48 * 1000) = 1kHz TB6612_Init(48, 1000); while(1) { // 测试正转5秒,速度设为500(占空比50%) for(int i = 0; i < 10; i++) { AO_Control(1, 500); // A端电机正转,速度值500 delay_ms(500); // 延时500ms } // 测试反转5秒,速度设为500(占空比50%) for(int j = 0; j < 10; j++) { AO_Control(0, 500); // A端电机反转,速度值500 delay_ms(500); // 延时500ms } // 你可以在这里添加更多测试,比如改变speed值(0-999)来调整速度 // AO_Control(1, 200); // 低速正转 // AO_Control(1, 800); // 高速正转 } }

上电效果:如果一切顺利,你应该能看到电机先正转5秒,然后反转5秒,如此循环。通过修改AO_Control函数中的speed参数(范围在0到999之间),你可以轻松调节电机的转速。

最后再叮嘱几句

  1. 电源是关键:确保给TB6612FNG的VM(电机电源)和VCC(逻辑电源)供电稳定且电压在规格范围内。最好电机电源和单片机电源共地。
  2. 接线要仔细:对照模块和开发板的引脚,一根一根接,接完再检查一遍,防止短路或接错。
  3. PWM频率选择:对于普通直流电机,PWM频率在1kHz到20kHz之间比较合适。频率太低电机会有噪音,太高了可能驱动芯片响应不过来。教程里设置的1kHz是个常用的起点。
  4. 进阶玩法:掌握了基础控制后,你可以尝试用开发板的定时器中断产生更复杂的调速曲线,或者结合编码器实现闭环速度控制,那才是真正发挥TI开发板和TB6612FNG实力的地方。

希望这篇教程能帮你顺利搞定TB6612FNG的驱动移植。在实际电赛项目中,稳定的电机驱动是成功的基础,这块高性能模块绝对能成为你的得力助手。如果调试中遇到问题,不妨多用示波器看看PWM波形和方向控制引脚的电平变化,硬件调试往往就是靠这些基本功。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 17:01:20

零基础入门安卓开发:借助快马ai轻松搞定android studio安装与初体验

对于很多想学安卓开发的朋友来说&#xff0c;第一步往往就卡在了安装和配置环境上。Android Studio、SDK、JDK、Gradle……这些名词听起来就让人头大&#xff0c;更别提那些复杂的下载、安装和配置步骤了。我自己刚开始学的时候&#xff0c;也是折腾了好久&#xff0c;踩了不少…

作者头像 李华
网站建设 2026/7/14 17:01:18

AI辅助开发:让快马智能生成并优化mac安装OpenClaw的个性化方案

最近在折腾mac上安装OpenClaw&#xff0c;这玩意儿是个挺有意思的工具&#xff0c;但安装过程遇到不少坑&#xff0c;尤其是不同mac系统版本和芯片架构&#xff08;比如Intel和M1/M2/M3&#xff09;带来的兼容性问题。以前得自己查各种教程&#xff0c;手动调整命令&#xff0c…

作者头像 李华
网站建设 2026/7/14 17:01:21

卡证检测矫正模型一文详解:透视矫正后图像DPI与OCR引擎兼容性说明

卡证检测矫正模型一文详解&#xff1a;透视矫正后图像DPI与OCR引擎兼容性说明 1. 引言&#xff1a;从检测到识别的最后一公里 在日常业务中&#xff0c;我们经常遇到这样的场景&#xff1a;用户上传了一张随手拍的身份证照片&#xff0c;背景杂乱&#xff0c;角度倾斜。我们的…

作者头像 李华
网站建设 2026/7/14 17:01:20

戴尔R750服务器H755N RAID卡直通模式配置指南

1. 为什么你需要直通模式&#xff1f;从RAID到“裸盘”的转变 如果你正在使用戴尔PowerEdge R750这款性能强劲的服务器&#xff0c;并且配备了H755N这款高性能的RAID卡&#xff0c;那么你很可能正享受着RAID&#xff08;冗余磁盘阵列&#xff09;带来的数据安全和读写加速的好处…

作者头像 李华
网站建设 2026/7/14 17:01:22

SQL数据迁移实战:跨表与跨库的高效插入技巧

1. 从零开始&#xff1a;理解SQL数据迁移的核心场景 大家好&#xff0c;我是老张&#xff0c;在数据这行摸爬滚打十几年&#xff0c;处理过无数次数据搬家的事儿。今天咱们不聊那些高大上的概念&#xff0c;就聊聊最实在的&#xff1a;怎么把数据从一个表“搬”到另一个表&…

作者头像 李华
网站建设 2026/7/14 17:01:22

爬虫进阶:解密黑猫投诉平台JS加密参数实战

1. 从抓包到定位&#xff1a;找到加密参数的“老巢” 做爬虫的朋友都知道&#xff0c;最头疼的不是写解析代码&#xff0c;而是当你信心满满地发起请求时&#xff0c;服务器冷冷地回你一个“参数错误”。黑猫投诉平台的搜索接口就属于这种“硬骨头”。我第一次尝试爬取时&#…

作者头像 李华