TC118S电机驱动芯片全解析:从H桥原理到STC8G1K08A的PWM调速实战

发布时间:2026/8/6 5:17:27
TC118S电机驱动芯片全解析:从H桥原理到STC8G1K08A的PWM调速实战 1. 项目概述从一颗芯片到驱动一个马达最近在捣鼓一个电动牙刷的小项目手头正好有一块从旧玩具上拆下来的小马达想让它能正反转、调速模拟电动牙刷的振动效果。翻找元件盒时看到了这颗TC118S一个SOP-8封装的马达驱动芯片。这玩意儿在电动牙刷、玩具小车这类小功率直流电机驱动场景里出场率极高尤其是富满Fuman原装的正品稳定性和性价比都相当不错。网上搜资料时发现不少朋友也在用类似的芯片比如有人想用STC8G1K08A这款单片机来产生PWM波形再配合驱动芯片来控速。这正好给了我灵感为什么不深入聊聊这颗TC118S把它从引脚定义、工作原理到实际驱动一个马达的全过程都捋清楚呢这样无论是想修复电动牙刷还是DIY个小玩具你都能直接上手。简单来说TC118S是一个单通道的H桥电机驱动芯片。所谓H桥你可以把它想象成一个聪明的“十字路口交警”它能控制电流从四个方向流过电机从而实现电机的正转、反转和刹车停止。而SOP-8封装意味着它只有8个引脚体积小巧非常适合集成到空间有限的电路板上比如电动牙刷的手柄内部。它的驱动能力通常在几百毫安到1安培左右驱动玩具马达、微型振动电机就像电动牙刷里那种绰绰有余。这篇文章我就以一个实际动手的视角带你彻底吃透TC118S。我会先拆解它的内部原理告诉你每个引脚该怎么接然后我会用两种最常见的方式来驱动它一种是直接用单片机IO口另一种就是用你搜到的那个热词——用STC8G1K08A单片机输出PWM波形来精确调速。最后我会分享在面包板上搭建电路、调试过程中踩过的坑和积累的经验让你拿到芯片就能用遇到问题也知道往哪儿查。2. 芯片深度解析TC118S的引脚与内部逻辑拿到一颗芯片第一件事就是看数据手册。但对于TC118S这种常用芯片很多关键信息我们可以先提炼出来形成自己的理解框架。2.1 引脚功能全解与电路连接要点TC118S的SOP-8封装8个引脚排成两排。我们按照典型应用电路来逐个解读这比死记硬背引脚号更有用。1. 电源与地线引脚VCC GNDVCC (引脚 8)这是芯片的工作电源正极。它的电压范围决定了你能驱动多大电压的电机。TC118S的典型工作电压范围在2V到9V之间。也就是说如果你用一个3.7V的锂电池单节18650或锂聚合物电池或者两节干电池3V它都能正常工作。给电动牙刷马达供电3-6V这个区间最常见。GND (引脚 4)电源地。这是整个电路的公共参考点至关重要。单片机的GND、电机电源的GND如果分开供电、以及输入信号的GND最终都必须连接到这一点上否则控制逻辑会混乱甚至芯片不工作。2. 控制信号输入引脚IN1 IN2IN1 (引脚 7)和IN2 (引脚 6)这是芯片的“大脑”接收指令的接口。它们接收来自单片机或逻辑电路的控制信号电平高低决定了电机的状态。TC118S的逻辑电平兼容性很好无论是3.3V还是5V的单片机如STC8G1K08A、Arduino、STM32等都可以直接连接无需额外的电平转换电路。3. 电机输出引脚OUT1 OUT2OUT1 (引脚 1)和OUT2 (引脚 3)这是芯片的“双手”直接连接直流电机的两个电极。电流从OUT1流入从OUT2流出电机正转反之则反转。这两个引脚需要承受电机工作时的全部电流所以连接它们的导线要足够粗。4. 电源相关引脚VM VCPVM (引脚 2)这是电机的功率电源正极输入。这里有一个非常重要的概念芯片逻辑电源VCC和电机功率电源VM可以分开供电。为什么要分开因为电机启动和堵转时会产生很大的瞬间电流和电压波动如果和芯片共用电源这个波动可能会“干扰”甚至“重启”脆弱的控制逻辑电路。对于小功率玩具电机VCC和VM接在一起比如都接5V通常问题不大。但对于稍大功率或要求高的场合建议分开VCC接一个稳定的5V或3.3V例如来自单片机稳压器VM则接电机所需的更高电压例如7.4V电池以实现更高转速。VCP (引脚 5)内部电荷泵电容连接端。这个引脚需要连接一个电容到地通常是一个0.1uF到1uF的陶瓷电容。它的作用是产生一个高于VM的电压用于内部高端N-MOSFET的栅极驱动确保其能完全导通降低导通损耗。这个电容必不可少且必须靠近芯片引脚放置。为了方便接线这里给出一个典型的引脚连接速查表引脚编号引脚名称功能描述连接说明与注意事项1OUT1电机输出端1接直流电机的一端。2VM电机电源正极接驱动电机的电源正极如电池。可与VCC共用但分开更稳定。3OUT2电机输出端2接直流电机的另一端。4GND电源地所有电源和信号的公共地必须可靠连接。5VCP电荷泵电容端接一个0.1µF - 1µF的陶瓷电容到GND必须靠近芯片引脚。6IN2控制输入2接单片机GPIO控制电机转向和停止。7IN1控制输入1接单片机GPIO控制电机转向和停止。8VCC逻辑电源正极接芯片工作电源2-9V常与单片机共5V或3.3V。2.2 H桥工作原理与真值表理解控制逻辑TC118S的核心是一个H桥电路。我们可以把内部的四个MOSFET开关想象成四座桥墩电机是河上的船。正转当IN1高电平(H) IN2低电平(L)时左上和右下开关闭合右上和左下开关断开。电流从VM - 左上开关 - OUT1 - 电机 - OUT2 - 右下开关 - GND。船电机向左开。反转当IN1L IN2H时右上和左下开关闭合。电流路径变为 VM - 右上开关 - OUT2 - 电机 - OUT1 - 左下开关 - GND。船向右开。刹车/停止当IN1和IN2同时为H或同时为L时有两种情况。同时为L时所有开关断开电机惯性滑行停止。同时为H时在某些H桥设计中会形成短路刹车能更快让电机停止。TC118S的数据手册会明确其真值表通常IN1IN2L为停止高阻态IN1IN2H也为停止刹车但具体以手册为准。我们一般采用IN1IN2L来让电机自由停止。绝对禁止IN1和IN2不能出现“一高一低”之外的快速交替状态除非是PWM调速时否则会导致上下桥臂直通瞬间大电流烧毁芯片。这就是所谓的“ shoot-through”现象。基于以上我们可以总结出最常用的控制真值表IN1IN2OUT1OUT2电机状态LL高阻态高阻态停止/自由滑行HLHL正转LHLH反转HHLL停止/刹车低阻态注意上表中“H”和“L”是相对于芯片逻辑地的电平。确保你的单片机IO口能输出足够高的电压对于5V系统H要接近5VL要接近0V来被TC118S可靠识别。3. 驱动方案设计从IO控制到PWM调速理解了芯片怎么工作接下来就要设计控制它的“大脑”。这里提供两种最实用的方案第二种正是对应你搜索的热点。3.1 基础方案单片机GPIO直接控制这是最简单粗暴的方法适用于只需要正转/反转/停止不需要调速的场景。比如一个简单的玩具小车前进后退。电路连接单片机如STC8G1K08A、Arduino Uno的一个GPIO例如P1.0连接TC118S的IN1。另一个GPIO例如P1.1连接TC118S的IN2。单片机、TC118S的VCC和GND共电源共地。程序逻辑伪代码// 定义控制引脚 #define MOTOR_IN1 P10 #define MOTOR_IN2 P11 void Motor_Forward() { MOTOR_IN1 1; // 高电平 MOTOR_IN2 0; // 低电平 } void Motor_Reverse() { MOTOR_IN1 0; MOTOR_IN2 1; } void Motor_Stop() { MOTOR_IN1 0; MOTOR_IN2 0; // 或者 MOTOR_IN1 1; MOTOR_IN2 1; 根据芯片手册选择 } void main() { // 初始化GPIO为推挽输出模式以STC8G为例 P1M0 0x03; // P1.0, P1.1 设置为推挽输出 P1M1 0x00; while(1) { Motor_Forward(); Delay_ms(2000); // 正转2秒 Motor_Stop(); Delay_ms(500); // 停止0.5秒 Motor_Reverse(); Delay_ms(2000); // 反转2秒 Motor_Stop(); Delay_ms(2000); // 停止2秒 } }这个方案的优点是极其简单代码易懂。但缺点也很明显电机只能全速运行无法实现电动牙刷那种轻柔、强劲等多档位振动效果。这就需要引入PWM调速。3.2 进阶方案PWM调速实现与STC8G1K08A实战PWM脉冲宽度调制是直流电机调速的灵魂。它通过快速开关频率通常几千到几十千赫兹改变一个周期内高电平所占的比例占空比来等效输出不同的平均电压从而实现调速。占空比越大平均电压越高电机转速越快。为什么用STC8G1K08A这款单片机是国产STC8系列中的性价比之王SOP-8封装价格低廉性能却不错自带硬件PWM发生器非常适合这种小控制场景。你搜索的热词正好切中了这个实用组合。电路连接调整连接方式与基础方案类似但我们需要将控制正转或反转的其中一个引脚例如IN1连接到单片机的硬件PWM输出引脚上另一个引脚IN2用于控制方向。以STC8G1K08A为例其PWM输出引脚可以是P3.4或P5.4取决于具体型号和配置。我们假设使用P3.4作为PWM输出连接IN1P3.5作为方向控制连接IN2。STC8G1K08A 硬件PWM配置要点STC8系列的PWM配置稍复杂但一旦掌握就很强大。核心是配置几个特殊功能寄存器。#include stc8g.h #define PWM_PIN P34 // PWM输出引脚接TC118S的IN1 #define DIR_PIN P35 // 方向控制引脚接TC118S的IN2 void PWM_Init(void) { // 1. 将P3.4设置为PWM输出功能 P3M0 ~0x10; P3M1 ~0x10; // 先将P3.4设为准双向口模式或根据需要设置 // 实际上STC8G的PWM功能是复用的需要通过PWMSET寄存器开启 PWMSET | 0x40; // 使能PWM3输出到P3.4 (具体位需查手册此处为示例) // 2. 设置PWM时钟源和分频 PWMCKS 0x00; // 选择系统时钟/1作为PWM时钟源。假设系统时钟12MHz。 PWMCFG 0x00; // 配置其他参数如对齐方式等默认边沿对齐即可。 // 3. 设置PWM周期频率 // 周期值 (PWM时钟频率 / PWM输出频率) - 1 // 例如欲输出10kHz PWM PWM时钟12MHz则周期值 12000000/10000 - 1 1199 PWMC 1199; // 设置周期值 // 4. 设置初始占空比 PWM3T1 0; // 设置比较值1对于边沿对齐模式通常用T1控制占空比 // 占空比 (PWM3T1 1) / (PWMC 1) // 初始设为0电机不转 // 5. 使能PWM输出 PWMCR 0x80; // 使能PWM模块 PWMCR | 0x08; // 使能PWM3输出 } void Set_Motor_Speed_Direction(unsigned int duty, bit direction) { // 设置占空比范围 0 ~ (PWMC) if(duty PWMC) duty PWMC; PWM3T1 duty; // 更新占空比 // 设置方向 if(direction 0) { // 假设0为正转 DIR_PIN 0; // IN2 L // IN1由PWM控制自动输出PWM波 } else { // 反转 // 对于反转我们需要将PWM给到IN2IN1置低。 // 但我们的硬件连接是PWM固定接IN1。因此一种方法是 // 反转时将DIR_PIN接IN2置高同时将PWM输出值“反转”。 // 更简单的做法是用两个PWM通道分别控制IN1和IN2实现正反转调速。 // 这里为简化我们先实现单向正转调速反转时直接给固定电平。 // 实际项目中推荐使用两个PWM通道或使用带方向控制的PWM逻辑。 DIR_PIN 1; // IN2 H // 此时需要将IN1置为低电平但IN1接的是PWM引脚。 // 所以在反转时我们应停止PWM输出并将该引脚强制拉低。 // 这涉及到更复杂的IO模式切换。这揭示了基础方案的局限性。 } } void main() { PWM_Init(); // 初始化方向引脚为推挽输出 P3M0 | 0x20; P3M1 ~0x20; // P3.5推挽输出 // 实现一个简单的加速-减速正转过程 unsigned int speed 0; bit dir 0; DIR_PIN 0; // 设置为正转模式 while(1) { for(speed 0; speed PWMC; speed10) { Set_Motor_Speed_Direction(speed, dir); Delay_ms(50); // 延时观察加速效果 } for(speed PWMC; speed 0; speed-10) { Set_Motor_Speed_Direction(speed, dir); Delay_ms(50); // 延时观察减速效果 } Delay_ms(1000); // 停止1秒 // 若要反转需要改变硬件逻辑或采用更优方案见下文 } }上面的代码示例揭示了用单个PWM引脚实现双向调速的复杂性。更优的实践是使用两个PWM通道分别控制IN1和IN2。优化方案双PWM控制逻辑正转PWM_IN1 PWM信号 PWM_IN2 0。反转PWM_IN1 0 PWM_IN2 PWM信号。停止PWM_IN1 0 PWM_IN2 0。刹车PWM_IN1 1 PWM_IN2 1。注意此时PWM占空比应为100%即恒高电平这样无论正转反转都能实现平滑调速。STC8G1K08A有两个PWM输出可以分别配置给P3.4和P3.5完美实现此方案。配置两个PWM通道的代码逻辑类似只需分别初始化PWM3和PWM4或其他可用通道并同步更新它们的比较值即可。4. 实战搭建与调试从原理图到转动的马达理论说得再多不如动手接一次。下面我以面包板为例搭建一个完整的TC118S驱动电路。4.1 物料清单与电路搭建步骤所需物料TC118S SOP-8芯片 一枚STC8G1K08A-SOP8 单片机或其他3.3V/5V单片机 一枚小型直流电机3-6V 一个面包板 一块杜邦线 若干电源可用USB转5V供电或3.7V锂电池电容0.1uF陶瓷电容用于VCP引脚至少1个10uF-100uF电解电容用于电源滤波1-2个。电阻如果需要可以加1kΩ电阻作为IO口上拉STC8G推挽输出可省略。下载器用于给STC单片机下载程序如USB-TTL串口模块。搭建步骤放置芯片将TC118S和STC8G1K08A小心插入面包板注意引脚方向不要插反。通常芯片有凹槽或圆点标记的是第1脚。连接电源与地从电源正极引线到面包板正极总线。连接TC118S的VCC8脚和VM2脚到正极总线。初次测试可先共用电源。连接TC118S的GND4脚、STC8G的GND、电源负极到面包板负极总线。在VCC和GND之间靠近芯片处并联一个10uF电解电容和一个0.1uF陶瓷电容进行电源滤波。连接电荷泵电容用0.1uF陶瓷电容连接TC118S的VCP5脚到GND这个电容务必紧贴芯片引脚引线尽量短。连接电机将直流电机的两个引脚分别连接到TC118S的OUT11脚和OUT23脚。连接控制信号将STC8G的P3.4PWM输出连接到TC118S的IN17脚。将STC8G的P3.5GPIO输出连接到TC118S的IN26脚。连接下载线将USB-TTL下载器的TX、RX、GND、VCC可选如果从下载器取电分别连接到STC8G的对应引脚P3.0/RxD, P3.1/TxD, GND, VCC。注意如果单片机已从面包板电源取电则下载器的VCC可不接只接GND、TX、RX三线。4.2 上电调试与核心参数测量搭建完成后不要急于上电。先做一次目视检查所有电源线和地线连接是否正确、牢固VCP电容是否接上电机、芯片、单片机有没有插反电源正负极有没有短路确认无误后先不接电机给系统上电。用万用表测量VCC电压是否在预期值如5V稳定无波动。VM电压是否与VCC一致如果共用或为电机电压控制引脚电平在单片机程序初始化后测量IN1和IN2引脚电压。在停止状态下两者应为0V或接近0VL。如果程序设置了PWM输出IN1上应能测到平均电压。如果静态电压正常断开电源接上电机。再次上电并运行一个简单的正转-停止-反转测试程序非PWM。观察电机是否按预期转动。如果电机不转或发热异常立即断电。引入PWM调试下载一个固定占空比比如50%的PWM程序。此时用万用表直流电压档测量OUT1和OUT2之间的电压。它应该是一个波动的值但平均电压大约是VM电压的一半。更专业的做法是用示波器探头测量OUT1对GND的波形应该能看到清晰的PWM方波。重要心得在面包板上由于接触电阻和分布电感电机在启动瞬间可能会引起电源电压的瞬间跌落导致单片机复位。如果遇到程序跑飞或单片机重启首要怀疑对象就是电源。解决方法加大电源滤波电容如在电机电源两端并联一个100uF以上的电解电容使用更粗的电源线或者将电机电源VM与逻辑电源VCC彻底分开供电。5. 常见问题排查与进阶技巧在实际操作中你几乎一定会遇到下面这些问题。我把它们和解决方案整理成了速查表。现象可能原因排查步骤与解决方案电机完全不转1. 电源未接通或电压不足。2. 芯片或单片机损坏。3. 控制信号错误IN1/IN2电平不对。4. VCP电容未接或损坏。5. 电机本身损坏。1. 用万用表测量VCC、VM对GND电压。2. 检查IN1/IN2电平是否符合真值表。可暂时将IN1接VCCIN2接GND手动给高电平看电机是否正转。3. 检查VCP引脚电容是否焊接/连接良好。4. 将电机直接接电池检查电机好坏。电机单向转动另一向不转1. 控制某一方向的IO口损坏或未正确配置。2. 芯片内部对应桥臂损坏。3. 接线错误如IN1/IN2接反。1. 交换IN1和IN2的控制信号如果原来不转的方向现在转了说明程序或IO口有问题。2. 用万用表测量不转时对应输出端OUT1或OUT2是否有电压输出。电机转动无力速度慢1. 电源带载能力不足电池电量低或电源限流。2. PWM频率不合适过高导致损耗大过低导致电机抖动。3. 芯片过热进入保护。1. 测量电机转动时的VM电压如果跌落严重换用功率更大的电源。2. 调整PWM频率。对于小型有刷直流电机5kHz到20kHz是比较合适的范围。频率太低会听到啸叫声太高则开关损耗增加。3. 触摸芯片是否烫手确保散热良好。单片机程序跑飞或反复复位1.电机干扰电源最常见。2. 电源纹波过大。3. 程序逻辑错误如死循环。1.在电机的两个引脚上并联一个1040.1uF陶瓷电容可以有效吸收电刷火花产生的高频噪声。2. 在VM和GND之间并联一个大容量电解电容如220uF储能。3.将逻辑电源VCC与电机功率电源VM分离供电这是解决干扰问题的终极方案。PWM调速时电机抖动或异响1. PWM频率处于人耳可闻范围20kHz。2. 占空比太小无法启动电机存在启动电压阈值。3. 电机机械负载有卡顿。1. 将PWM频率提高到20kHz以上超出人耳听觉范围。2. 设置一个“死区”或最小启动占空比例如低于10%的占空比直接设为0停止。3. 检查电机轴和负载是否顺畅。芯片发热严重1. 负载电流过大超过芯片额定电流。2. PWM频率过高开关损耗大。3. 散热不良。4. 出现“共通”现象软件错误导致上下桥臂同时导通瞬间短路。1. 测量电机工作电流确认未超规格TC118S约1A左右。2. 适当降低PWM频率。3. 考虑加装小型散热片或通过焊盘敷铜散热。4.检查程序确保在改变电机转向时先发送停止信号IN1IN2L延时几毫秒再发送新方向信号避免直通。进阶技巧电流检测如果想做更高级的控制比如过流保护可以在电机回路中串联一个毫欧级的小电阻如0.1Ω用单片机的ADC读取电阻两端的电压换算成电流。能耗制动在需要电机快速停止时除了设置IN1IN2L让其自由停止还可以设置IN1IN2H刹车模式。此时电机两端被短接转动产生的反电动势会形成电流回路产生制动力矩停止更快。并联使用如果单个TC118S驱动电流不够比如驱动稍大的减速电机可以将两个TC118S的IN1、IN2并联OUT1、OUT2并联以增加电流能力。但要注意均流问题最好在两个芯片的输出端各串一个小阻值电阻如0.1Ω再并联。最后关于STC8G1K08A的PWM配置官方的数据手册和示例代码是关键。我建议直接去STC官网下载最新的数据手册和库函数示例里面关于PWM时钟分频、周期设置、死区控制等都有详细说明。刚开始可能会觉得寄存器配置繁琐但一旦理解你会发现它比许多库函数更灵活、更高效。调试时不妨先用一个简单的IO口翻转程序测试硬件连接再用一个固定占空比的PWM程序测试调速功能最后再实现复杂的加速减速算法。一步一步来这颗小小的TC118S芯片就能在你手中精准地驱动马达重现电动牙刷那富有节奏感的振动或是让玩具小车灵活地奔跑起来。