1. 从“买块板子不香吗”说起:TinyML硬件选型的真实困境
“有那么多现成的开发板,我为什么还要为TinyML费劲巴拉的重新做一款?”这个问题我第一次听到的时候,正蹲在实验室角落里对着一堆跳线发呆。桌上摆着五六块市面上主流的开发板,从几十块的入门级到几百块的高配版都有,但没有一块能让我在功耗、算力和接口这三个维度上同时满意。TinyML这个领域有个很尴尬的特点:它既不像传统嵌入式那样对算力要求极低,也不像边缘计算那样可以容忍几瓦的功耗。它卡在中间,要求你在毫瓦级的功耗预算里跑起神经网络推理,同时还得保证传感器数据采集的实时性和稳定性。
现成开发板的问题不是“能不能跑”,而是“跑得别不别扭”。我试过用一块常见的MCU开发板跑关键词唤醒模型,模型本身只有几十KB,推理一次大概几十毫秒,看起来能用。但实际部署的时候发现,麦克风采集的数据要通过I2S接口传进来,中间得经过DMA搬运,再经过预处理做MFCC特征提取,最后才喂给模型。这一套流程下来,CPU大部分时间都在做数据搬运和预处理,真正跑推理的时间反而占小头。更麻烦的是,开发板上的电源管理芯片是给通用场景设计的,待机功耗就有几百微安,而我需要的是一套能靠纽扣电池撑几个月的方案。
所以问题就变成了:现成开发板的通用性,在TinyML场景下反而成了负担。它们为了兼容各种外设和调试需求,堆了太多用不上的东西——多余的USB转串口芯片、多余的LDO、多余的LED指示灯。这些东西每一个都在偷偷吃电。我实测过,把一块典型开发板上所有“非必要”外设去掉之后,静态功耗能从几百微安降到几十微安,直接差出一个数量级。这就是为什么我开始认真考虑自己画一块板子——不是为了炫技,而是因为现成方案在TinyML这个特定场景下,确实存在系统性的不匹配。
2. 现成开发板的三大“隐形税”:功耗、尺寸与信号链
2.1 功耗税:那些你根本没注意到的漏电点
大部分开发板的电源架构是“USB供电优先,电池备份为辅”的思路。这意味着板上一定有一个电源切换电路,通常是一颗负载开关或者理想二极管芯片。这颗芯片在电池供电时的静态电流往往在几十微安到几百微安之间。再加上USB接口的ESD保护器件、电平转换芯片、调试器的待机功耗,整块板子在“什么都不做”的时候可能就已经消耗了1mA以上的电流。对于需要连续运行数月的TinyML应用来说,这个数字直接判了死刑。
我做过一个对比测试:同一颗MCU,放在现成开发板上跑睡眠模式,实测电流是380微安;把MCU单独焊到一块最小系统板上,只保留必要的去耦电容和晶振,同样跑睡眠模式,电流降到了12微安。差距主要来自开发板上的LDO静态电流、调试芯片的漏电以及各种上拉电阻的持续消耗。TinyML的很多应用场景——比如预测性维护的振动监测、野生动物声学监测、可穿戴健康追踪——都要求设备在大部分时间里处于深度睡眠,只在特定事件触发时才唤醒推理。这种工作模式下,睡眠电流直接决定了电池寿命。
2.2 尺寸税:当你的设备需要塞进一个耳塞里
现成开发板的物理尺寸往往被低估了。一块典型的MCU开发板大概有拇指大小,但TinyML的很多应用场景对尺寸极其敏感。比如入耳式健康监测设备、微型无人机上的视觉识别模块、植入式或贴片式医疗传感器,这些场景留给电路板的空间可能只有几毫米见方。现成开发板上的排针、USB接口、按键、LED这些“标配”在这里全是累赘。
更关键的是,尺寸不仅影响能不能塞进去,还影响信号完整性。板子越大,走线越长,天线性能越难调,高频信号的衰减和干扰越严重。我做过一个麦克风阵列的TinyML项目,用现成开发板的时候,两个麦克风之间的走线长度差了将近两厘米,导致相位不一致,声源定位算法怎么调都达不到精度要求。后来自己画了一块紧凑的板子,把麦克风走线做到等长,问题立刻解决了。这种细节在通用开发板上根本没法控制。
2.3 信号链税:通用接口与专用传感器的错配
现成开发板通常提供的是“标准接口”——I2C、SPI、UART、ADC。但TinyML常用的传感器往往有自己特殊的时序要求和信号调理需求。比如MEMS麦克风输出的是PDM信号,需要特定的时钟和抽取滤波器;电流传感器输出的是微弱的差分信号,需要仪表放大器做前端调理;热电堆传感器输出的是几十微伏级别的信号,对噪声和温漂极其敏感。
用现成开发板连接这些传感器,你往往需要额外的转接板或调理电路,而这些附加电路又会引入新的噪声和功耗。我试过用开发板加外置ADC采集热电堆信号,结果发现开发板上的数字噪声通过电源和地平面耦合到了模拟前端,信噪比怎么都上不去。后来自己设计板子的时候,把模拟地和数字地严格分开,模拟部分单独用LDO供电,噪声问题才得到解决。这种“信号链完整性”的考量,是通用开发板很难照顾到的。
3. 自研TinyML开发板的核心设计决策
3.1 MCU选型:算力、内存与功耗的三角博弈
选MCU是第一步,也是最关键的一步。TinyML对MCU的要求可以概括为:在尽可能低的功耗下,提供足够的算力和内存来跑目标模型。这里有个常见的误区:很多人一上来就追求最高主频和最大内存,结果功耗失控。实际上,TinyML的模型通常很小——关键词唤醒模型可能只有20-50KB,简单的视觉唤醒模型也就100-200KB。你需要的不是最大的内存,而是“刚好够用”的内存加上高效的电源管理。
我个人的选型逻辑是这样的:先确定模型大小和推理延迟要求,然后反推需要的Flash和RAM。比如一个关键词唤醒模型,权重加激活值大概需要80KB RAM和200KB Flash,那么选一颗128KB RAM、512KB Flash的MCU就绰绰有余。主频方面,Cortex-M4跑80MHz通常就能在几十毫秒内完成推理,再高就是浪费。真正重要的是低功耗模式的表现——睡眠电流要低于10微安,唤醒时间要短于1毫秒,最好支持多种低功耗模式和外设自主运行。
注意:选型时一定要看数据手册里的“典型睡眠电流”而不是“最低睡眠电流”。后者往往是在极端条件下测得的,实际应用中根本达不到。
3.2 电源架构:从“能用”到“省电”的跨越
电源架构是自研板子和现成开发板拉开差距最大的地方。我的设计原则是:每一微安都要有明确的去向。具体来说,我会把电源分成三个域:常开域、推理域和传感器域。常开域只给RTC和唤醒逻辑供电,电流控制在几微安以内;推理域给MCU核心和内存供电,只在需要推理时开启;传感器域给传感器和模拟前端供电,可以独立开关。
实现这种分区供电的关键是选择合适的LDO和负载开关。LDO的静态电流要低于1微安,负载开关的导通电阻要小、关断漏电要低。我试过几种方案,最后发现用一颗超低静态电流的LDO给常开域供电,再用几颗小尺寸的负载开关控制其他域,整体静态功耗可以压到5微安以下。这个数字意味着什么?一颗200mAh的纽扣电池,理论上可以撑四年多。当然实际会有电池自放电和其他损耗,但撑几个月到一年是完全可行的。
3.3 传感器接口:为特定信号链定制前端
自研板子最大的优势是可以针对特定传感器优化前端电路。以麦克风为例,如果我用的是PDM麦克风,我会把PDM时钟线尽量短、尽量远离其他高频信号,并在电源引脚旁边放一颗小容值的去耦电容。如果用的是模拟麦克风,我会在ADC前面加一个抗混叠滤波器,截止频率根据采样率精确计算。这些细节在通用开发板上要么被忽略,要么因为布局限制没法做好。
对于振动监测这类应用,传感器输出的是微弱的电荷信号,需要电荷放大器做前端。我会把电荷放大器的反馈电容和电阻尽量靠近运放引脚,减少寄生电容的影响。同时,模拟部分的电源我会单独用一颗低噪声LDO供电,数字部分的电源则用另一颗,两者在单点接地,避免数字噪声串扰。这些做法在教科书上都有,但只有自己画板子的时候才能真正落实。
4. 从原理图到实物:自研TinyML板子的实操全流程
4.1 原理图设计:把“省电”落实到每一个元件
画原理图的时候,我有个习惯:每放一个元件,都问自己“这个元件在睡眠模式下会消耗多少电流”。电阻分压电路?如果只是用来检测电池电压,我会在分压电阻上串一个MOS管,只在需要测量的时候才导通。上拉电阻?如果I2C总线上挂的设备不多,我会把上拉电阻值加大到10K甚至47K,牺牲一点上升沿速度来换取更低的静态功耗。LED指示灯?直接去掉,调试的时候用GPIO临时接一个就行。
电源部分的原理图需要特别小心。LDO的使能引脚要接到MCU的GPIO上,这样MCU可以在进入深度睡眠前把不必要的电源域关掉。负载开关的控制逻辑要明确:哪些域可以独立关闭,哪些域必须常开。我一般会画一个电源状态表,列出每种工作模式下各个域的开关状态,然后对照着检查原理图有没有遗漏。
4.2 PCB布局:信号完整性与功耗的平衡
PCB布局是自研板子最考验经验的地方。我的布局优先级是:电源路径最短、模拟数字分区、高频信号包地。电源路径方面,从电池接口到LDO再到各个电源域,走线要尽量宽、尽量短,减少压降和寄生电感。模拟部分和数字部分要严格分开,模拟地在靠近ADC或运放的地方单点连接到数字地。晶振要尽量靠近MCU,负载电容的接地要干净。
对于TinyML板子来说,还有一个特殊考量:天线的净空区。如果板子上有无线通信功能(比如BLE),天线周围要留出足够的净空,不能铺铜,不能走线。我见过不少自研板子因为天线净空没做好,通信距离直接减半。另外,如果板子上有麦克风或加速度计这类对振动敏感的传感器,布局时要远离变压器、电感等可能产生机械振动的元件。
4.3 打样与焊接:从钢网到回流焊的细节
打样我一般选四层板,虽然两层板便宜,但四层板有完整的地平面和电源平面,对信号完整性和EMC都更有利。TinyML板子通常尺寸小,四层板的价格差异可以接受。钢网建议选激光切割的,开口精度比化学腐蚀的好很多。锡膏我习惯用含铅的,虽然无铅更环保,但含铅锡膏的焊接温度低、润湿性好,对手工回流焊更友好。
焊接的时候,先焊MCU和电源芯片这些关键元件,焊完立刻测一遍电源电压和静态电流。如果静态电流超标,先别急着焊其他元件,把问题找出来再说。我踩过的坑是:有一次焊完发现静态电流比预期高了200微安,查了半天发现是一颗去耦电容焊反了——虽然电容没有极性,但焊盘设计的时候把两个焊盘大小做成了不一样,导致电容立起来了一点点,接触不良产生了漏电。这种细节只有自己焊过才会注意。
4.4 固件与模型部署:让板子真正“智能”起来
板子焊好只是第一步,真正让它跑起TinyML模型还需要固件和模型的配合。我通常先用一个简单的GPIO闪烁程序验证MCU能正常工作,然后逐步加入外设驱动、传感器读取、预处理、推理。每一步都测电流,确保功耗符合预期。模型部署方面,我会先用TensorFlow Lite Micro把模型转成C数组,然后集成到固件里。推理的时候要注意内存分配——TinyML模型需要一块“张量竞技场”内存,这块内存的大小要精确计算,太小了会溢出,太大了浪费RAM。
实操心得:模型量化是TinyML的关键步骤。把浮点模型转成int8模型,不仅模型大小缩小四倍,推理速度也能提升两到三倍。但量化会带来精度损失,需要在训练时做量化感知训练,或者至少用代表性数据集做校准。
5. 自研板子 vs 现成开发板:一张表说清楚
| 对比维度 | 现成开发板 | 自研TinyML板 |
|---|---|---|
| 静态功耗 | 通常200微安以上 | 可做到10微安以下 |
| 尺寸 | 拇指大小,含排针和接口 | 可小至指甲盖大小 |
| 传感器接口 | 通用接口,需外接调理电路 | 可定制前端,信号链完整 |
| 电源管理 | 通用架构,冗余多 | 分区供电,按需开关 |
| 调试便利性 | 即插即用,工具链成熟 | 需自备调试器,初期投入大 |
| 单板成本 | 几十到几百元 | 打样加元件约几百元(小批量) |
| 适用场景 | 原型验证、教学、快速迭代 | 量产、低功耗、小尺寸场景 |
这张表不是要否定现成开发板的价值。恰恰相反,我在项目初期一定会用现成开发板做原型验证,把算法和模型跑通之后,再根据实际需求决定要不要自研板子。现成开发板的优势是“快”,自研板子的优势是“准”。如果你的项目对功耗和尺寸没有极端要求,现成开发板完全够用。但如果你要做的是需要靠纽扣电池运行数月的设备,或者尺寸必须塞进极小空间的产品,那自研板子就是绕不过去的路。
6. 常见问题与排查技巧实录
6.1 功耗超标了,从哪里开始查?
功耗超标是最常见的问题。我的排查顺序是:先测总电流,再逐个断开电源域测。如果总电流是1mA,先把传感器域的负载开关关掉,看电流降到多少。如果降到100微安,说明传感器域有问题;如果还是1mA,说明问题在常开域或推理域。然后继续细分,把MCU设成深度睡眠,看电流是否降到数据手册标称的值。如果降不下去,检查所有GPIO的状态——悬空的GPIO如果配置成输入且没有上下拉,可能会因为浮空而产生漏电。我遇到过好几次都是因为一个没用的GPIO悬空导致功耗偏高,把它配置成模拟输入或者输出低电平就解决了。
6.2 模型跑不起来,是内存不够还是算子不支持?
TinyML模型部署失败通常有两个原因:内存不够或算子不支持。内存不够的表现是推理时程序跑飞或者返回错误码。这时候要检查张量竞技场的大小是否足够,以及是否有内存碎片。算子不支持的表现是模型转换成功但推理结果不对,或者直接报“未实现算子”的错误。解决办法是换用TFLite Micro支持的算子,或者自己实现自定义算子。我建议在模型设计阶段就查一下TFLite Micro的算子支持列表,避免用那些不支持的算子。
6.3 传感器数据有噪声,怎么定位是硬件还是软件问题?
先看噪声的频率特征。如果是50Hz或60Hz的工频干扰,多半是电源或地线的问题,检查LDO的PSRR和地平面的完整性。如果是高频噪声,可能是数字信号串扰,检查模拟和数字的隔离。如果是随机噪声,可能是传感器本身的问题或者前端电路的噪声。我一般会先用示波器看传感器的原始输出,如果原始输出就有噪声,那是硬件问题;如果原始输出干净但ADC读出来有噪声,那是ADC配置或参考电压的问题。
6.4 板子焊好了但连不上调试器,怎么排查?
先检查电源——MCU的供电电压是否正常,复位引脚是否被拉低。然后检查调试接口的连线——SWDIO和SWCLK有没有接反,有没有虚焊。如果都没问题,试试降低调试器的时钟频率,有时候走线太长或干扰太大会导致高速调试失败。还有一个容易被忽略的点:有些MCU在出厂时调试接口是关闭的,需要通过特定的时序或选项字节来开启。我遇到过一颗MCU,因为选项字节被误写,调试接口锁死了,最后只能用并行编程器擦除整颗芯片才恢复。
7. 一些关于“值不值得”的个人体会
自研TinyML板子这件事,投入产出比取决于你的具体场景。如果你只是做个课程设计或者周末项目,现成开发板绝对够用,没必要折腾。但如果你在做一款需要量产的产品,或者你的应用对功耗和尺寸有硬性要求,那自研板子带来的收益是巨大的。我算过一笔账:一块自研板子的打样和元件成本大概几百块,加上我投入的设计和调试时间,第一版的总成本可能上千。但一旦验证通过,后续小批量生产的单板成本可以控制在几十块以内,而且功耗和尺寸都精确匹配需求。相比之下,用现成开发板做产品,要么忍受功耗和尺寸的妥协,要么花大量时间做转接板和飞线,最后算下来未必省钱。
还有一个隐性收益是技术积累。自己画过板子之后,你对整个信号链的理解会深很多。以前用开发板的时候,很多问题被封装好了,你只知道“这样能跑”,但不知道“为什么能跑”。自己设计之后,每一个元件、每一根走线你都要想清楚它的作用,这种理解是看多少篇教程都换不来的。我现在再拿到一块现成开发板,一眼就能看出它的电源架构和信号链设计,知道哪些地方可以优化、哪些地方是妥协。这种判断力,才是我觉得自研板子最大的收获。
最后分享一个小技巧:如果你决定自研板子,第一版一定要留足够的测试点和跳线。我第一版板子为了追求小尺寸,把很多测试点省掉了,结果调试的时候发现想测个信号都没地方下探头,只能飞线,特别狼狈。第二版我学乖了,每个电源域都留了测试点,关键信号也引出了焊盘,调试效率高了很多。板子大一点点没关系,调试的便利性比省那几平方毫米重要得多。