ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

中微单片机手持风扇方案拆解:从原理图到C源码的完整实践

中微单片机手持风扇方案拆解:从原理图到C源码的完整实践 简介这是一套基于中微单片机SC8P1710D的手持风扇完整工程资料面向DIY爱好者和嵌入式入门开发者解决低成本便携风扇的控制逻辑、三档调速与锂电池充电管理等问题。资料包含C源码、功能说明图及原理图能够帮助读者快速理解主控芯片如何通过PWM改变电机供电电压实现5V-7V-9V三档风量切换并掌握TP4056充电电路与电池电压监测的实用设计方法。压缩包共55个文件以.c源文件、.h头文件、.hex/.bin烧录文件以及.png原理图为主还包含编译生成的中间文件供排查参考整体仅433KB结构轻量、便于直接学习或移植。目前已有1127人学习下载。内容覆盖按键扫描、ADC采样、睡眠唤醒、系统初始化等模块适合希望用中微单片机快速搭建低功耗风扇方案的工程师参考也可作为同类手持小家电项目的设计蓝本。 前阵子拿到一份“中微单片机手挂风扇C源码及原理图.rar”解压之后是个标准的手持便携风扇方案。这类项目在消费电子里属于“麻雀虽小五脏俱全”的典型一颗8位MCU、一节锂电池、一个小直流电机、三档按键加上Type-C充电和电量提示几乎把一个单片机该碰的外设全用上了。如果你正在做课程设计、电子竞赛小项目或者纯粹想低成本给自己攒一个能挂着走的小风扇这份资料最大的价值在于它把“从空工程到真正出风”的完整链路都给你铺好了。先别急着编译烧录我建议按这样的顺序消化先看原理图搞清楚电流怎么走、每个引脚为什么这样接再打开C源码重点看状态机和PWM部分最后再谈改板和调参。下面我会把整个方案拆开讲顺便把我实际调这种板子踩过的坑都标出来。1. 先搞清楚这个项目到底值不值得看1.1 rar里面装的到底是哪些东西解压后通常能看到两大类内容。一类是C源码工程常见的是Keil C51工程结构包含main.c、led.c、key.c、pwm.c、adc.c、sleep.c这一组文件工程配置文件会带中微单片机的头文件。另一类是原理图文件有可能是立创EDA或AD格式也可能附带导出的PDF和BOM表。少数打包还会带上PCB丝印图和几张开板说明。这里要提醒一句网上流传的这类压缩包关键信息经常被省略比如单片机的具体型号、用晶振还是内部RC、电池容量和电机型号。遇到这种情况不要慌先从原理图里芯片丝印和电源拓扑反推再对照C源码里的寄存器配置基本能把型号锁定在某个系列。1.2 为什么这种小风扇喜欢用中微单片机中微单片机在小家电领域出镜率很高尤其是CMS79F系列这种8位MCU常见SOP8、SOT23-6封装Flash只有4K到8KRAM几百字节级别成本可以压到很低。对比传统STC51它的工作电压范围更宽常见型号能到1.8V到5.5V可以直接用3.7V锂电池供电不用额外加LDO对比STM8或STM32它在外设资源上刚刚好有PWM、有ADC、有外部中断、有掉电唤醒做风扇这种简单逻辑完全不浪费。另外还有一个容易被忽视的点中微很多型号的IO口驱动能力和开漏配置是专门为电池类小家电设计的推挽输出可以直接驱动LED甚至能直接推小MOS管。这对一个便携产品来说能省掉一堆缓冲电路和电平转换。后面讲原理图的时候你们会发现整个板子上逻辑部分的元件其实非常少。2. 原理图拆解手持风扇电路里每块钱都有它的位置原理图是整个方案的“地图”。别急着看MCU外围先看电源链路。典型的手挂风扇原理图基本上分成四段Type-C充电座、锂电池保护、MCU最小系统、电机驱动。下面我按电流方向逐个说。2.1 从Type-C口开始的充电与保护链路电源入口是Type-C座只用来充电所以只接VBUS和GND即可。充电管理芯片在很多低端方案里直接用TP4056或兼容型号它的PROG引脚接一个电阻决定充电电流典型做法是1.2k对应1A换成2.4k就是500mA。原理图上这枚电阻的位置很有讲究要靠近充电IC的PROG脚避免走线过长干扰参考电流精度。TP4056之后是电池保护部分常见的是DW01搭配双N-MOS 8205A负责过充、过放、过流保护。很多人把保护IC和充电IC搞混其实分工很清楚TP4056管“充”DW01管“不能乱放”。电池正极出来后通常还会并联一个100uF电解电容和0.1uF瓷片电容这是为了扛电机启动瞬间的大电流抽水不然MCU可能被拉复位。2.2 电机驱动与PWM调速电路电机驱动是原理图里最容易被新手画错的地方。手挂风扇用的基本都是直流有刷电机驱动方式用低边N-MOS开关即可不需要H桥。MOS管漏极接电机负极源极直接接地栅极接MCU的PWM输出脚。如果MCU的PWM高电平就是供电电压可以省略电平转换但最好在栅极串联一个22到100欧姆电阻抑制开关振铃。电机属于感性负载MOS管关断瞬间会产生很大的反向电动势必须在电机两端反向并联一个肖特基二极管续流常见SS34或SS14。没有这个二极管MOS管很容易被击穿现象就是板子工作几分钟突然不转了或者PWM高占空比时正常、低占空比时频繁重启。这个坑我见过太多次属于必须画的元件。2.3 按键、指示灯与档位逻辑电路按键部分一般用一个轻触开关一端接MCU的GPIO一端接地GPIO内部开上拉。为了防抖原理图上会在按键两端并联一个100nF电容配合代码里的消抖逻辑效果才稳。指示灯方面一块板子上通常有两个灯一个红色充电指示一个蓝色或绿色电量与工作指示。LED串个1k左右电阻直接用IO推挽驱动如果是低有效接法要注意IO灌电流能力。档位逻辑不复杂但很关键。常见方案是三档循环关机状态下短按开机进入一档后面每短按一次升一档到三档再短按回到关机也有方案是在任意档位长按1秒关机。这个逻辑放在C源码里就是一个状态机后面第三部分我会专门展开。3. C源码里真正值钱的部分是状态机和低功耗打开C源码第一件事不是读代码而是先看头文件里的芯片型号、引脚宏定义和时钟配置。中微单片机的寄存器命名和标准8051有差异但思路一致。下面我按初始化、按键、PWM与ADC、低功耗四个模块拆解。3.1 引脚初始化先把时钟和IO口配置搞清楚中微单片机一般支持内部RC振荡器不需要外部晶振。初始化最怕的是看门狗没关或配置顺序不对导致程序运行几分钟自动复位。常规初始化顺序是先关看门狗再设置时钟源和分频然后配置IO口的推挽、开漏或输入模式最后关闭不需要的外设模块以省电。不同型号寄存器名不一样示例代码只能作为框架参考实际开发必须对照对应型号的数据手册。void System_Init(void) { WDT_CONTR 0x00; // 关闭看门狗具体位定义看手册 CLK_Config(); // 选择内部RC设置系统时钟 GPIO_Init(); // 推挽/带上拉输入 PWM_Init(); // 初始化PWM输出 ADC_Init(); // 初始化ADC通道 LED_AllOff(); }IO口配置这里有个细节按键引脚要配置成输入带上拉电机PWM引脚配置成推挽输出。如果把PWM脚误配成开漏会导致MOS栅极无法拉高电机要么不转要么抖得厉害。3.2 按键扫描与状态机设计按键部分用延时消抖是新手做法虽然能跑但主循环里的大延时会让PWM输出产生顿挫。更稳的做法是用一个1ms定时器中断做节拍主循环里只查状态。按键状态机可以拆成三个状态待检测、确认按下、长按确认。每次进入中断读一次IO电平连续采样到同一电平超过10ms才认为有效长按时间单独用计数器累计。typedef enum { FAN_OFF 0, FAN_LOW, FAN_MID, FAN_HIGH } FAN_STATE; FAN_STATE fan_state FAN_OFF; uint16_t key_press_cnt 0; uint8_t key_short_flag 0; uint8_t key_long_flag 0;这样写的好处是抖动、短按、长按、连续触发的处理全部收敛在一处产品级的逻辑不会散落在主循环里。后面想加双击、组合键也只需要在这个状态机上扩展。3.3 PWM调速与ADC电量监测PWM调速的重点不是频率调到多高而是每一档的占空比要跟电机特性匹配。我见过直接把10%设为一档的结果是电机根本转不起来因为直流电机的启动需要克服静摩擦和电枢电阻。更合理的做法是低档给40%左右、中档70%、高档100%必要时在换挡时用软件“淡入淡出”的方式逐渐过渡避免瞬间大电流冲击。ADC部分主要是采电池电压。电池电压要经过分压电阻网络比如100k对47k分压后进ADC引脚采到的值换算回实际电压。算法上建议做多次采样取平均并增加一个低压滞回区间比如低于3.2V关机但要回升到3.4V才允许再次开机否则电池会在临界电压反复横跳。3.4 低功耗处理与关机策略手挂风扇是便携设备关机后的待机电流是重点。通常做法是进入掉电模式前把所有外设关闭、IO口设为确定电平、打开按键外部中断然后执行休眠指令。中微的掉电唤醒一般是外部中断唤醒唤醒后要重新初始化时钟和关键外设不能直接跳到主循环。这里有个容易踩的坑如果按键引脚在休眠时没有设成合适电平或没有打开内部上拉休眠电流会异常实测可能从几个uA涨到几百uA。另外LED指示引脚在休眠前一定要关掉不然一个小LED就是好几mA的漏电流掉电模式形同虚设。4. 从图纸到实物电流、噪声、续航实战中的坑资料里的方案是一回事真正打板回来调试又是另一回事。我按照实物调试的顺序把最常遇到的几个问题和不那么明显的解决思路整理一下。4.1 充电发热与电流设置的权衡TP4056在1A满电流充电时芯片本身发热非常明显尤其在Type-C座附近走线细的小板上。如果是500mAh的小电池没必要追求大电流把PROG电阻调到2.4k充电电流降到500mA理论充电时间会从1小时变成2小时但发热、寿命和板子铜箔压力都小很多。还有一点充电电流不要只用眼睛看把万用表串在电池正极去实测因为充电座、保护板和走线都会造成损耗。4.2 换挡瞬间的抖动和噪声很多资料源码里换挡逻辑很简单直接改占空比。实际上电机从停止到突然给满占空比启动浪涌电流可能达到正常工作电流的3到5倍这时如果电源电容不够MCU会复位。解决思路是做软启动让占空比在100ms内逐步爬升听起来是个不起眼的功能但实测对系统稳定性帮助很大。换挡时最好也先以当前档位的中间值平稳过渡。噪声方面PWM频率如果落在人耳敏感区1k到10k会有明显“滋滋”声。把频率提高到15kHz以上噪声会明显改善但要注意MOS管开关损耗增加低端MOS发热会大一点。最终频率选择要在电机声音和温升之间找平衡。4.3 续航实测与几个“假象”标称电池容量和实际续航差距很大。我做过一组对比标称1000mAh的锂电池在3档满速电流400mA的场景下实际跑空大约也就2小时出头因为放电平台在3.6V附近后期电流和电压都撑不住。想延长续航软件层面可以对低档位用更低的占空比硬件层面换低转速版本电机效果更明显。测量小技巧量整机电流时最好在电池正极和电路板之间串联电流表不要在电机回路串否则会干扰PWM波形。量电池电压要在电机转动的时候量空载电压会偏高太多按空载电压判断电量容易让产品在真正负载时突然关机。常见问题排查速查表现象大概率原因排查思路上电后MCU反复复位电机启动拉低电池电压增大电解电容检查电池内阻电机低档不转占空比过低加大低档占空比确认PWM频率触摸MOS管发烫驱动电压不足或频率过高确认栅极波形、降低PWM频率休眠后电流仍很大IO口悬空、LED未关逐个IO试检查上拉配置充电灯常亮不灭充电电流设置过大或电池损坏实测充电电流检查PROG电阻按键偶尔连跳消抖时间过短增加采样次数或加电容老实说这类“C源码原理图”的包网上能搜到很多但能从头到尾跑通、改好、量产的不多。关键在于不要光抄代码要把原理图里每个器件为什么存在想明白。我实际做这类小项目最大的体会是硬件上先保证电源稳定和续流可靠软件上把状态机和低功耗做扎实剩下的都是锦上添花。希望这篇拆解能帮你少走点弯路。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进