前阵子朋友公司做一套商用中央空调的能效监测系统,找到我帮忙解决温度采集端的精度问题。现场环境不算恶劣,但管道多、传感器分散、电缆走线长,用普通模拟前端方案误差总是压不下去。后来我换了ADS122U04IPWR 配 STM32F767ZG这套组合,一次性把温度测量精度和系统集成度都拉了回来。这篇文章就是这次项目里从硬件到固件再到标定流程的完整记录。
这套方案适合正在做HVAC温度采集、工业 SQL 现场 RTD/热电偶数据采集,或者想了解 UART 接口高精度 ADC 怎么用的朋友。ADS122U04IPWR 的特别之处在于:它是一颗 24 位 Delta-Sigma ADC,而且把 UART 通信接口直接集成进去了。这在工业温度测量里其实是个非常实用的设计思路,后面我会详细解释为什么。
1. 项目需求拆解与方案选型逻辑
1.1 为什么是 ADS122U04IPWR 而不是 SPI 接口 ADC
我最早接触的类似芯片大多是 SPI 接口,比如 ADS124S08、MAX31865 这些。SPI 接口本身没什么不好,通信速率高、时序也简单,但在实际工程里会遇到几个绕不开的问题:
第一,SPI 需要占用主控好几根 IO,SCLK、MOSI、MISO、CS 一个都不能少。如果测温通道多,还得用额外的 GPIO 做片选,或者用译码器扩展。板子上走线一多,信号质量就容易出问题,高速 SPI 在长线传输时更是容易翻车。
第二,工业现场经常需要和主控隔离。温度传感器探头放在管道、风柜、室外机附近,和主控板之间的地电位往往不一致。用 SPI 做隔离,光耦得一路一路配,四线 SP I再加片选,成本高还占 PCB 面积。而 UART 天然的两线制在半双工模式下就一根数据线加一根地线,隔离设计简单得多,用单个数字隔离器就能把通信链路隔开。ADS122U04IPWR 支持在半双工 UART 总线上寻址多个从机,我可以用一个 UART 口挂好几片 ADC,每片负责不同区域的传感器采集,组网灵活度比 SPI 高太多。
第三,ADS122U04IPWR 集成了很多模拟前端功能。它内部有可编程增益放大器(PGA,增益 1 到 128 倍)、四个多路复用输入通道、用于 RTD 测量的激励电流源、内部基准源,还有一个内部温度传感器。这颗芯片做温度测量时,外围电路可以做得非常精简,PT100、PT1000、热电偶都能直接接。从信号链角度讲,ADS122U04IPWR 等于把一个完整的测量前端打包了,我只需要关心后端的通信解析和数据处理。
1.2 STM32F767ZG 在系统里的角色
STM32F767ZG 是 ST 的 Cortex-M7 内核芯片,主频最高能到 216MHz,带双精度浮点单元和 DSP 指令。温度换算要用到多项式计算、查表和线性插值,这些在带 FPU 的 M7 上跑起来非常快,一个通道几微秒就能算完,多通道扫描毫无压力。
更重要的是 STM32F767ZG 的外设资源丰富。我需要至少一路 UART 和 ADS122U04IPWR 通信,一路 UART 或 RS-485 接口做 Modbus 上报,可能还需要以太网 MAC 用于接入楼宇自控系统。F767ZG 上这些接口都有,而且它的 DMA 功能很完善,UART 接收可以配合 DMA 使用,基本不占 CPU 时间。这对后面做实时性要求高的多点温度扫描很关键。
在实际系统里,我的分工是这样的:
- ADS122U04IPWR负责模拟信号采集,把热电偶的微伏级信号、RTD 的电阻变化转换为数字量;
- STM32F767ZG负责通信协议解析、温度算法计算、数据格式转换、故障诊断和网络上报。
两个芯片一个管物理量到数字量的转换,一个管数字量到工程量和系统交互的转换,边界清晰,调试起来也不容易糊涂。
2. 硬件电路设计与关键细节
2.1 传感器接口与信号调理
ADS122U04IPWR 内部有四个模拟输入通道(AIN0 到 AIN3),可以配置成多路复用输入。我实际使用时的接法是 PT1000 走三线制,K 型热电偶走差分输入,每个通道的输入结构都上拉到确定电位,避免悬空时读数乱跳。
PT1000 三线制接法是工业测温里最常用的方案。三根线分别接激励电流正端、检测正端和检测负端,ADC 内部通过两次采样,把导线电阻的影响减掉。ADS122U04IPWR 的激励电流源可以配置为 100µA 到 1.5mA 之间的几个档位,我给 PT1000 选择的是250µA这一档。为什么不选更大的电流呢?因为电流越大,RTD 自身发热越明显,自热效应会让温度读数偏高。比如 PT1000 在 0°C 时阻值是 1000Ω,250µA 电流产生的功耗只有 62.5µW,带来的自热误差几乎可以忽略;如果改成 1.5mA,功耗直接变成 2.25mW,在热阻较大的封装里可能引入 0.1°C 以上的误差。对于 HVAC 这种通常要求精度在 ±0.2°C 左右的应用,自热影响必须控制在可接受范围。
热电偶接法要稍微小心一点。热电偶输出的是微伏级直流信号,K 型热电偶在常温下的灵敏度大约是 40µV/°C,所以 PGA 增益必须打开。我把对应通道的 PGA 配置成 64 倍或者 128 倍,这样才能把热电偶的小信号抬到 ADC 的满量程范围内。ADS122U04IPWR 的四路输入通道可以独立配置测量类型,所以同一颗芯片里可以同时挂 RTD 和热电偶,互不干扰。这一点在 HVAC 现场特别实用,因为一台空调机组上既有水管温度传感器(通常用 PT1000),又有风管温度传感器(可能用 NTC 或热电偶),用一颗 ADC 就能全部覆盖。
冷端补偿是热电偶测量的核心环节。ADS122U04IPWR 内部有一个温度传感器,可以读取芯片结温。我把热电偶的冷端也就是接线端子尽量靠近 ADC 芯片放置,用芯片内部温度作为冷端温度参考。虽然严格来说冷端温度应该用接线端子处的温度来代表,但在 PCB 布局合理、芯片和端子之间没有大功率发热器件的前提下,这种近似完全满足 HVAC 场景的精度要求。
2.2 电源、基准与去耦布线
ADS122U04IPWR 的供电范围比较宽,我用的模拟电源 AVDD 和数字电源 DVDD 是分开的,都是 3.3V。这里有个容易被忽视的操作:模拟电源一定要干净。ADC 的积分非线性、噪声性能都受电源纹波直接影响。我在每个电源引脚旁边都放了 0.1µF 陶瓷电容和 10µF 钽电容做去耦,而且这些电容尽量靠近芯片引脚摆放,走线先经过电容再到 IC,避免电源噪声直接进入芯片。
基准电压方面,ADS122U04IPWR 支持内部基准和外部基准两种方式。对于 RTD 比例测量,我更推荐用外部精密基准电阻配合比率测量,而不是依赖内部基准的绝对值。因为内部基准的温漂再小,也做不到零温漂,而比率测量可以同时抵消基准电压和激励电流源的温漂。
举个实际例子:我用一个精度 0.1%、温漂 25ppm/°C 的精密电阻做基准电阻 Rref,ADC 的测量结果是传感器阻抗与基准电阻之比。在 24 位分辨率下,即使基准电压有微小波动,只要 Rref 和 RTD 使用的是同一个激励电流源,这个波动就会在除法运算里被抵消掉。这种方法比靠绝对电压测量重建电阻值要稳得多,我后面在固件计算里也一直沿用这个思路。
PCB 布线时我把模拟地和数字地单点连接,避免数字信号的返回电流串到模拟回路里。ADS122U04IPWR 的模拟输入走线尽量短,RTD 和热电偶的信号线如果距离长,应该加屏蔽层并且屏蔽层单端接地。在工业现场做过测温的都知道,长线上感应到的 50Hz 工频干扰是 ADC 读数波动的主要原因之一,后面我会专门讲怎么在软件上做抗干扰处理。
2.3 STM32F767ZG 接口连线与保护
ADS122U04IPWR 和 STM32F767ZG 之间的通信很简单:UART TX、RX 交叉连接即可。这里要注意的是 ADS122U04IPWR 的 UART 工作模式,我使用的配置是半双工模式,通信引脚只用一根数据线加上一个方向控制逻辑。在电路上不存在方向冲突问题。
电平匹配方面,两者都是 3.3V 供电,TTL 电平可以直接互连。如果现场环境和主控距离很远,比如超过 1 米,我建议在 STM32F767ZG 和 ADS122U04IPWR 之间加 RS-485 收发器,把单端 UART 转成差分信号,这样可以大幅提高抗干扰能力和通信距离。
硬件保护方面,我在通信线、传感器输入端都加了 TVS 管做静电防护。HVAC 现场经常有人员走动、设备启停,静电和浪涌不可避免。TVS 管选的是双向的,钳位电压 5.5V 左右,放在接口的最前端。传感器输入线上还加了 RC 低通滤波,截止频率设置在几kHz,既能滤掉高频噪声,又不会影响温度信号的缓变特性。很多初学者忽略这个细节,直接让热电偶的长线连进 ADC,出来的数据跳得和心电图一样,其实加一级 RC 滤波大部分问题都能缓解。
3. 固件实现与通信协议解析
3.1 ADS122U04 的 UART 通信机制
ADS122U04IPWR 的 UART 协议并不复杂,说白了就是主机发命令帧、从机回数据帧的轮询模式。通信帧里包含命令字节、寄存器地址、数据长度、数据和校验。和普通 UART 外设不同的是,ADS122U04IPWR 的帧有比较严格的时序要求,主机发送完一条命令之后,必须等待足够的响应时间再发起下一次传输,这个超时设计需要仔细处理。
具体到寄存器操作,无非三种:写配置寄存器、读配置寄存器、触发转换并读数。芯片转换完成之后内部数据就绪标志会变化,主机也可以直接发读数据命令拿到转换结果,结果通常是 24 位(三字节)的二进制补码数据。
我建议所有读取操作都带上一段简单的校验处理。ADS122U04IPWR 支持一定的通信可靠性特性,但作为应用工程师,我依然把每一帧数据都当作可能出错的数据来处理。在 STM32 侧解析到非法帧或者校验不一致,直接丢弃并触发重传,而不是把错误数据拿去算温度,这是嵌入式通信的基本修养。
3.2 STM32 侧收发状态机与代码示例
STM32F767ZG 的 UART 我用的是 DMA + 空闲中断的方式接收。所谓空闲中断,就是 UART 收到一帧数据后、总线上出现空闲状态时触发中断,这时候 DMA 已经搬到缓冲区里的数据就是一包完整帧。这个模式可以省掉逐字节接收中断的开销,对 CPU 占用率非常友好。多通道扫描时,MCU 还能腾出时间跑 Modbus 协议栈和以太网任务。
下面是我项目里实际在用的状态机框架,按字节逐个解析输入缓冲区:
typedef enum { RX_WAIT_STX, RX_WAIT_CMD, RX_WAIT_LEN, RX_WAIT_DATA, RX_WAIT_CHK } rx_state_t; static rx_state_t rx_state = RX_WAIT_STX; static uint8_t rx_buf[32]; static uint8_t rx_len; static uint8_t rx_idx; static uint8_t rx_chk; void ads122u04_on_rx_byte(uint8_t byte) { switch (rx_state) { case RX_WAIT_STX: if (byte == 0xAA) { // 帧头 rx_state = RX_WAIT_CMD; rx_idx = 0; rx_chk = byte; } break; case RX_WAIT_CMD: rx_buf[rx_idx++] = byte; rx_chk ^= byte; rx_state = RX_WAIT_LEN; break; case RX_WAIT_LEN: rx_buf[rx_idx++] = byte; rx_chk ^= byte; rx_len = byte; rx_state = RX_WAIT_DATA; break; case RX_WAIT_DATA: rx_buf[rx_idx++] = byte; rx_chk ^= byte; if (rx_idx >= rx_len + 2) { rx_state = RX_WAIT_CHK; } break; case RX_WAIT_CHK: if (byte == rx_chk) { ads122u04_process_frame(rx_buf, rx_idx); } rx_state = RX_WAIT_STX; break; default: rx_state = RX_WAIT_STX; break; } }实际工程里我不会在接收中断函数里直接处理温度计算,而是把解析好的数据丢给主循环里的任务队列。这样既保证通信不丢帧,又不会阻塞其他业务。
发送端也要注意:STM32 发命令给 ADS122U04IPWR 之后,不能立刻发下一条。我实测下来,芯片内部寄存器写入到稳定需要一小段延时,转换启动到数据就绪更是要按数据手册里的转换时间等。有些工程师为了追求快,连续发读命令,结果读回来的全是旧数据,就是因为没有处理好转换时序。我这里的做法是每次发完命令之后,起一个 2ms 到 5ms 的软件延时,确保芯片有充裕时间响应,再做下一轮通信。
3.3 多点组网与总线扩展
ADS122U04IPWR 支持在一条 UART 总线上挂多个器件,通过地址字节区分。这在很多 ADC 里是少见的功能,主要原因是通用 SPI 器件很难做地址识别,而 UART 帧天然可以带地址信息。
我这套系统里的实际做法是:每片 ADS122U04IPWR 设置一个唯一的地址(比如 0x01、0x02、0x03),STM32F767ZG 作为主机轮询每个从机地址,依次读取对应的温度数据。轮询周期取决于通道数和采样率,HVAC 这种温度变化慢的场景,每 100ms 轮询一次足够了。
如果需要更远的传输距离,可以在 STM32F767ZG 的 UART 后再加一块 RS-485 收发器,把总线改成差分模式。布局上注意总线两端加 120Ω 匹配电阻,通信速率适当降下来,比如 9600bps 或 19200bps,实测在几百米范围内非常稳定。这套设计思路在工业现场很常见,测温采集节点通过 RS-485 汇聚到控制器,控制器再做逻辑决策和上报。
4. 温度换算与校准标定
4.1 RTD 的电阻到温度换算
RTD 测温的本质是“电阻随温度变化”,所以拿到 ADC 的原始码值之后,第一件事是把它换算成电阻值,第二步再把电阻值换算成温度。
在比率测量模式下,RTD 电阻的计算可以简化为:
float resistance_from_raw(uint32_t raw, uint32_t full_scale, float rref) { return rref * (float)raw / (float)full_scale; }这里的 full_scale 取决于 ADC 转换结果的数据格式。ADS122U04IPWR 是 24 位 ADC,我按二进制补码处理原始数值,正满量程对应 0x7FFFFF,负满量程对应 0x800000。计算时把数据量程统一换算成 2^23,就可以得到实际电阻值。
得到电阻值之后,用 PT1000 的 Callendar-Van Dusen 方程换算温度:
- 0°C 以上:R(T) = R0 × (1 + A×T + B×T²)
- 0°C 以下:R(T) = R0 × (1 + A×T + B×T² + C×(T−100)×T³)
其中 R0 是 0°C 时的阻值,PT1000 是 1000Ω;系数 A = 3.9083×10⁻³,B = −5.775×10⁻⁷,C = −4.183×10⁻¹²。这个方程通过迭代法解出 T 即可。
不过工程上我不会在 STM32 里反复迭代解方程,太费时间。项目中用的是查表加线性插值:在 MCU 的 Flash 里预存一张从 −50°C 到 +150°C、每 1°C 一个电阻值对应表(共 201 个点),然后用二分查找定位温度区间,再在区间内做线性插值。实测误差在 0.05°C 以内,计算耗时基本可以忽略。
有人会问:既然要精度,为什么不直接用迭代法解 CVD 方程?我的回答是:查表法的精度已经超过 RTD 传感器本身的精度了,PT1000 的 B 级精度是 ±0.3°C,查表插值引入的 0.05°C 误差完全可以接受。而且查表法代码简单、执行速度快、没有收敛性问题,这在嵌入式开发里是最稳妥的方案。
4.2 热电偶测温及冷端补偿
热电偶的换算稍微绕一点,但逻辑很清晰:热电偶输出的是热端和冷端之间的温差电势,不是绝对温度。要得到热端温度,需要知道冷端温度,再把冷端对应的热电势补偿进去。
我在固件里的计算流程是这样的:
- 从 ADC 读取热电偶通道的电压值 Vmeas;
- 通过 ADS122U04IPWR 内部温度传感器读取当前冷端温度 T_cold;
- 查 NIST 热电偶分度表,得到 T_cold 对应的热电势 E_cold;
- 计算总热电势 E_total = Vmeas + E_cold;
- 用 E_total 查 NIST 分度表(反向查表),得到热端温度 T_hot。
这里关键的一步是步骤 3 和 5 的查表。NIST 分度表数据量很大,直接全量塞进单片机太占 Flash。我采用稀疏表加插值的方式,K 型热电偶的温度范围按 −50°C 到 400°C 覆盖 HVAC 常见场景,每 10°C 存一个电压点,中间用三次样条插值补出温度。这样一张表大概几十个点,精度却能做到 ±0.1°C 以内,足够满足精度要求。
冷端补偿最大的坑在于冷端温度的“真实性”。ADS122U04IPWR 内部温度传感器测的是芯片结温,不是热电偶接线端子处真正的冷端温度。如果 PCB 布局不合理,比如芯片旁边有发热器件、开关电源、继电器,结温会比端子温度高好几度,补偿出来的温度直接偏掉。我反复踩过这个坑之后,总结出两条经验:一是冷端端子尽量靠近 ADC 芯片,PCB 上做等温设计,不要让它们之间有温度差;二是系统上电后留出热身时间,或者等芯片温度稳定后再启动测温,否则上电初期读数会有明显漂移。
4.3 标定校准流程
任何高精度测量都离不开标定。ADS122U04IPWR 本身已经是很高精度的 ADC,但系统的总误差还包含传感器误差、基准电阻误差、布线引入的误差和安装误差。我在每块板子出厂前都会做一遍标定,方法不复杂:
- 零点标定:把输入端短路(对于 RTD,用精密 0Ω 电阻代替传感器),记录 ADC 的输出偏移;
- 增益标定:接一个精密标准电阻(比如 1000Ω,精度 0.01%),记录输出值;
- 多点校准:如果条件允许,把传感器放到恒温槽里,在 0°C、25°C、50°C 等几个温度点记录误差,用最小二乘法拟合出补偿系数。
这些补偿系数最后都存在 STM32F767ZG 的片内 Flash 或外部 EEPROM 中。每次上电时读取,换算温度时先对 ADC 原始值做偏移和增益修正,再做查表换算。标定之后,系统在 0~100°C 范围内的整体精度可以做到 ±0.2°C 左右,比不标定直接用的精度提升非常明显。
5. 常见问题与排查技巧实录
5.1 读数漂移、噪声与工频干扰
我在调试过程中遇到最多的一个问题:温度读数在某个值附近来回跳,幅度达到 0.3°C 上下。排查到最后,原因几乎都和工频干扰有关。温度信号是缓变的直流信号,50Hz 工频及其谐波一旦耦合进来,就会变成 ADC 码值上的低频纹波。
解决办法分两步。硬件上,传感器信号线用屏蔽线,屏蔽层单端接地;输入加 RC 低通滤波。软件上,ADC 采样率不要设得太高,反而应该刻意把采样率控制在和工频相关的频率上,让内部数字滤波器对 50Hz 及其谐波形成陷波。再加上一阶或二阶移动平均滤波,每 50 次采样取平均输出一次温度值,这样基本能把高低频噪声都压掉。
另一个漂移问题是传感器自热。我前面提到 250µA 的激励电流就是为了减小自热,但如果你用的 RTD 封装很小,热阻很大,即便 250µA 也可能产生可感知的温升。检查方法很简单:把 RTD 从介质中取出,放在空气中,观察读数是否持续高于环境温度。如果偏高,就降低激励电流,或者改用四线制接线以消除导线电阻影响,再配合自热修正。
5.2 通信异常与帧丢失处理
UART 通信最大的敌人是干扰。如果硬件隔离和屏蔽没有做彻底,工业现场的电机会在通信线上感应出尖峰干扰,导致帧校验失败或者接收超时。
我在固件里做了三层保险:
- 所有命令帧和数据帧都带校验字节,校验失败直接丢弃;
- STM32 对一个从机发起请求后,如果 50ms 内没有收到有效响应,就重发;连续三次失败,标记该通道故障;
- 系统里加看门狗,如果通信任务死锁,自动复位重启。
这么处理下来,实际运行了几个月,很少出现因为帧丢失导致的误报。还有一个细节:UART 波特率误差。STM32 的 UART 时钟来自 APB 总线,配置出来的波特率有一定误差。如果误差过大,长帧传输就会出错。串口助手调试时发几个字节没事,一传长包就错了,多半是这个原因。我用逻辑分析仪抓了波形,认真对照数据手册把分频系数调好,这类问题就消失了。
5.3 传感器自热与冷端补偿不准
这两个问题在 4.2 和 5.1 都提过,但值得再展开一下。热电偶冷端补偿不准的表现是:温度校准正常,但一开机读数就偏高 1~2°C,然后慢慢回落。这个现象很像芯片自热引起的结温升高,导致内部温度传感器读数偏高,冷端补偿把热电势加多了。解决办法是让 ADS122U04IPWR 和冷端端子做等温设计,不要有大的热梯度;同时在软件里可以对内部温度传感器读数做平滑,避免瞬间波动影响补偿结果。
5.4 常见问题速查表
我整理了一张表,方便遇到类似问题的朋友对照排查:
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
| 读数跳变幅度大 | 信号线受工频干扰 | 加屏蔽、RC滤波、软件平均滤波 |
| 读数单调偏高 | RTD自热或冷端补偿不准 | 降低激励电流、检查等温布局 |
| 通信偶尔超时 | 长线干扰或波特率误差 | 加RS-485、调波特率到19200以下 |
| 上电初期读数漂 | ADC和传感器热平衡未稳定 | 预热后采样,或软件延时丢弃前N个点 |
| 零度以下温偏偏大 | CVD方程系数或查表表项不足 | 检查是否用了0°C以下系数C |
| 多从机地址冲突 | 地址配置错误 | 逐个确认地址字节,总线只挂单设备调试 |
6. 从单板到系统:结合场景的可靠设计
6.1 HVAC 场景中的典型配置与数据上报
在 HVAC 系统里,温度测量的点位非常多:冷冻水供回水温度、冷却水进出水温度、风管送风温度、回风温度、室内温控面板温度等。每个位置对传感器的要求不同,水管温度通常用 PT1000 套管安装,风管温度用不锈钢探头的 NTC 或者 PT1000,室内温度用高精度数字温度传感器也可以,但如果想统一到一个采集平台,用 ADS122U04IPWR 的多通道能力一片覆盖多个点位是最合适的。
常见配置是:一片 ADS122U04IPWR 的四路通道,两路接冷冻水供回水 PT1000(三线制),一路接风管 K 型热电偶,一路预留做备用或者接室外温度传感器。STM32F767ZG 通过 UART 轮询这片 ADC,计算出的温度数据打包成 Modbus RTU 寄存器,通过 RS-485 上传到楼宇自控主机或者云网关。
这样做的好处是:传感器信号在源头就完成了数字化,长距离传输只走数字总线,不再受模拟信号衰减和干扰的困扰。而且四路通道之间是独立的 PGA 和激励电流配置,一路传感器断路不会影响其他通道,故障隔离效果好。
6.2 工业现场抗干扰与长期运行可靠性
聊到工业现场,就绕不开可靠性三个字。我在项目里做了这些实践:
第一,电源入口做防反接和浪涌保护。HVAC 控制柜里 24V 电源常和接触器、变频器挤在一起,电源波动和浪涌比较常见。板子入口加了自恢复保险丝、TVS 和反接保护二极管,后级再用隔离 DC-DC 给模拟部分供电,这样即使外部电源异常,板载 ADC 和 MCU 也能正常工作。
第二,看门狗和掉电保存。STM32F767ZG 的独立看门狗(IWDG)必须开启,喂狗操作放在主循环最核心的任务后面。校准系数和通信参数放在片内 Flash 的独立扇区,每次修改后根据写入次数做磨损均衡。掉电瞬间通过检测电源电压触发保存流程,把当前温度数据和故障状态写入备份寄存器,重启后能快速恢复现场状态。
第三,长期稳定性靠日志和自检。我在固件里加入了周期性的自检任务,每 30 秒读一次各通道的数据质量和 ADC 状态,一旦发现数据异常或通信故障就记录到环形日志里,并把故障码通过 Modbus 上传。这种“预防性维护”的思路让现场运维人员能在设备真正出问题之前就发现异常趋势,比事后排查省力得多。
就我这几年的调试感受,ADS122U04 这种带 UART 的 ADC 非常适合分布式温度采集。不要嫌协议解析麻烦,一旦把帧同步和错误重传做稳,后面的扩展很省心。建议新手先在两块开发板上用杜邦线验证通信,再上正式的 PCB。硬件上重点把传感器输入滤波和电源去耦做扎实,固件上把状态机和超时重传做完整,剩下的就是标定和现场部署了。