ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

可编程模拟SoC:让模拟前端设计像改配置一样简单

可编程模拟SoC:让模拟前端设计像改配置一样简单 搞过几个物联网数据采集项目之后我越来越体会到一件事在嵌入式和IoT领域真正麻烦的往往不是数字逻辑而是前端的模拟链路。MCU和传感器之间的信号调理、滤波、增益匹配每个节点都能让板卡多打样一版。直到后来接触了可编程模拟SoC我才发现原来很多模拟方案是可以在软件里改出来的今天就把这块的经验完整梳理一遍。可编程模拟SoC准确说是把可配置的模拟前端、模拟开关网络、可编程增益放大器、数据转换器和可编程数字逻辑集成在一颗芯片里的方案典型代表有Infineon/Cypress PSoC、瑞萨GreenPAK系列以及一些集成高精度模拟前端的低功耗MCU。它们解决的问题非常直接当传感器变了、量程变了、信号极性变了你不需要重新画电路板改配置、改寄存器就能完成适配。这篇内容会覆盖这类芯片的架构原理、选型思路、完整落地流程以及我在实际项目中踩过的坑适合正在做IoT传感节点、便携仪表、电池供电数据采集设备的朋友参考。1. 可编程模拟SoC到底是什么它和普通MCU加运放的差别1.1 从改硬件到改配置变化的本质是什么传统方案里一个典型的传感采集链路大概是这样的传感器输出的微弱信号先经过仪用放大器放大再做二阶低通滤波然后送到ADC采样最后MCU读数据。这个链路里每一个电阻电容的值都是板上固定的一旦传感器变了比如原来用热电偶后来改用NTC放大倍数、偏置电压、滤波截止频率全都要重新计算然后改原理图、改PCB重新打样。我第一次用可编程模拟SoC时最直观的感受是原来需要换电阻、换电容的位置变成了在配置工具里拖几个模块接口照样是SPI或I2C数据照样能读出来。这不是什么黑科技本质是把模拟信号链路的拓扑和参数数字化了。芯片内部集成了开关矩阵运算放大器、比较器、DAC、ADC、滤波模块都放在片上它们之间的连接不是固定的而是通过配置寄存器来控制的。烧写固件的时候这些配置跟着一起进去硬件就按配置好的拓扑工作。这种架构带来的一个直接好处就是硬件的通用性。我做过一个支持多类型传感器的板子客户今天要接铂电阻明天要接0-10V电压信号后天又要接4-20mA电流环。放在以前这是三种完全不同的模拟前端设计现在只需要把输入调理电路做成一个通用的前端后续全靠配置切换。这在产品还没定型、需求频繁调整的IoT项目里价值非常明显。1.2 可编程模拟SoC和外置运放加MCU的边界在哪里有人会问现在MCU内部也带运放和ADC这不就是可编程模拟了吗严格来说不是。普通MCU里的运算放大器、比较器通常是固定连接、固定参数的你可以用但不能改变它们之间的内部连接关系也不能把某个运放的反馈网络改成完全不同的拓扑。可编程模拟SoC强调的是可重构不光参数可调连模块间的信号路由都是可编程的。拿PSoC举例它的内部有模拟开关矩阵可以将多个运算放大器、DAC输出、ADC输入、比较器输入按需要任意连接。比如某一时刻我需要让两个运放串联组成两级放大下一时刻又想让它们各自独立作为缓冲器这个切换就是写寄存器的事。GreenPAK这种小型混合信号IC也类似它更偏集成度内部有模拟比较器、电流源、DAC、电压基准片内还带LUT和计数器适合纯粹的逻辑加模拟混合场景。我用过一段时间传统MCU加外部运放的方案对这种差别的体会很深外部方案在指标上往往更灵活运放选高精度的、ADC选独立的高位数性能上限高但代价是布板空间大、物料成本高、匹配性和一致性问题要靠校准来做。可编程模拟SoC的性能不是天花板级别但对绝大多数IoT传感器信号来说已经完全够用而且省掉了大量分立器件开发周期能缩短一个月以上。下面这个对比表格是我个人在项目里做的选型参考不同项目需求不同但思路可以复用对比维度普通MCU 外部模拟前端可编程模拟SoC如PSoC小封装可编程混合信号IC如GreenPAK模拟链路灵活性低改参数需改板高配置寄存器即可改中只能改允许范围内的拓扑集成度低需要多颗芯片高单芯片搞定采集与处理极高可做在传感器内部性能上限高可选用顶级放大器中上适合工业级常见信号中适合低压、低速信号开发门槛中硬件设计经验要求高中需要学习专用配置工具低配置简单但灵活性有限适合场景高性能仪器、复杂采集链路工业传感、便携设备、IoT节点传感器调理、逻辑替代、消费类小功能2. 选型前必须搞清的三类可编程模拟SoC架构2.1 以PSoC为代表的控制器型模拟SoC先把名字说全Cypress在2019年被Infineon收购但PSoC的名字已经深入人心现在全新开发基本都是用ModusToolbox老项目维护还在用PSoC Creator。PSoC系列的特点是MCU为主体模拟外设是可编程的。具体型号覆盖从Cortex-M0到Cortex-M4F模拟资源包括运算放大器、比较器、12位到20位ADC、8位到12位DAC、电容感应模块等。这类芯片适合做节点级的设备也就是需要一个完整MCU跑协议栈同时又需要灵活模拟前端的场景。我做过一个三通道pH采集器pH电极输出阻抗极高前端需要输入阻抗极高的缓冲器后级还要根据电极电位范围做增益和偏置调整。用PSoC的话片内运放配置成电压跟随器模式输入漏电流能做到几十皮安级别缓冲器后面直接接可配置ADC供电电压范围也够宽。整个模拟链路在配置工具里完成不用外接运放。架构上有一个值得关注的点PSoC的模拟路由不是漫无边际的它分成几个模拟mux总线信号可以在片内模拟路由上走但能访问哪个ADC、哪个运放是有限制的。原理上就是开关矩阵的连通性问题并非任意两个引脚都能直连。选型时不能只看资源数量还要看具体资源的分布和路由限制否则会出现资源够用但拓不出来的情况。2.2 以GreenPAK为代表的小封装可编程混合信号ICGreenPAK是瑞萨原Dialog再往前是Silego Technology的产品线它的定位和PSoC完全不同没有独立的CPU内核部分新系列具备可编程状态机核心是一堆可配置的数字宏单元查找表、触发器、计数器和模拟宏单元比较器、电流源、电压基准、DAC、ACMP延时。配置完之后它就像一颗专用的小芯片在工作不需要写C代码。这种方式在特定场景下非常香一个IoT设备里有一路接近传感器或者光敏信号需要一个迟滞比较器去判断阈值、然后输出一个中断或控制信号如果用MCU实现需要一直轮询ADC费电还慢。用GreenPAK的话外部接一个光敏电阻内部比较器和参考电压配置好它能自己干这个活MCU可以一直睡。它的静态功耗可以做到微安级别甚至更低因为这不是CPU在跑而是纯硬件电路在工作。GreenPAK的开发流程也很特别它的配套工具叫GreenPAK Designer界面是一块代表芯片内部资源的网格你在上面拖线、连接比较器和LUT就像画电路图一样。配置完成后生成一个烧录文件这颗芯片就固化了功能。对于量产成本敏感、功能单一、不需要OTA升级的小模块它比MCU方案更省电、更便宜、更简洁。2.3 集成高精度模拟前端的低功耗MCU第三类是近些年越来越多见的MCU 高精度模拟前端组合代表型号包括瑞萨的RL78/I1C、ADI的MAX32675还有一些国产MCU也在往这个方向走。这类芯片的模拟前端不是完全可编程矩阵的颗粒而是内置了特定用途的高精度模拟电路比如24位Σ-Δ ADC、可编程增益放大器、激励电流源、内部高精度基准然后通过寄存器配置量程和增益。这类方案在IoT采集场景里最省心因为很多传感器接口是标准化的热电阻需要比例测量电化学传感器需要恒电位偏置热电偶需要冷端补偿。芯片直接把这一套做进去了你只要配好寄存器数据就直接出来了。它比PSoC的优势是精度高、设计难度低劣势是灵活性不如PSoC的模拟矩阵毕竟你买的是一套已定义的模拟前端而不是一套可以自由组合的模拟积木。我个人的选型经验是如果这个产品只有20%的需求是模拟相关的且变化频繁选PSoC如果产品就是围绕一个特定传感器类型做采集选集成模拟前端的MCU如果模拟功能很简单、只做阈值判断或小信号处理选GreenPAK。不要一上来就上最灵活的灵活是有代价的代价就是配置复杂度和调试难度。3. 从需求到配置一个IoT传感节点从零到固件的落地路径3.1 把传感器特性吃透再谈配置不管选哪颗芯片拿到一个IoT传感节点需求以后最忌讳的是直接打开配置工具开始画图。在碰工具之前我习惯先把传感器的输出特性用表格列清楚。几项关键指标输出类型电压/电流/电阻/电荷、信号幅度范围、输出阻抗、是否需要激励、需要的带宽、允许多大的噪声、线性度要求。举个例子NTC温度传感器。它的输出是电阻值电阻值在25℃时可能是10k在100℃时可能降到1k以下。你怎么用ADC测量最常规的办法是做一个恒流源激励让电阻变成电压或者用分压电阻加ADC测量然后软件查表。但在可编程模拟SoC里你可以用片内电流源给传感器供电这个电流源可以配置成10μA、100μA等档位产生电压后进入PGA放大最后进入ADC。这里有一个特别重要的参数匹配问题电流源档位选错了叠加出来的电压可能会超出ADC量程或者太小达不到ADC的信噪比。我把计算逻辑简化一下假设ADC的量程是0-3.3V负温度系数电阻在高温时阻值最小那么电压就低如果在低温时阻值最大电压会接近满量程。你需要找一个电流值使得在整个温度范围内电压都落在0.2V到3.0V之间留出足够裕量给PGA做增益调整。然后算PGA增益传感器在目标温度范围内电压变化范围可能只有0.5V而ADC满量程是3.3V那么增益设置在5倍到6倍左右比较合适。如果传感器的信号本身是几十毫伏的增益可能需要100倍以上。在可编程模拟SoC里PGA增益一般有明确的档位比如1、2、4、8、16、32、64你要选一个最接近计算值的档位并且要注意带宽会不会因为增益升高而下降。多数可编程运放在高增益时带宽会缩水如果被测信号本身是毫秒级的跳变低速配置没问题但如果是高速振动信号就要提前确认增益带宽积是否够用。3.2 在配置工具里完成模拟链路的编译以PSoC为例完整的流程是这样的打开配置工具选择一颗具体型号然后在原理图编辑页面放置ADC、运算放大器、DAC、模拟mux等组件把它们连线起来设置每个组件的参数。这和我们画电路原理图很像只不过每个组件在最终生成代码时都会映射成配置寄存器和驱动API。放置完成后需要给模拟信号做引脚分配。这里有一个新手容易忽略的点模拟信号从引脚进入芯片内部不是直接就能连到运放的中间有模拟专用引脚和普通GPIO之分。GPIO虽然也能当模拟输入但往往没有内部保护结构和低泄漏特性。如果接的是高阻抗传感器一定要接到模拟专用引脚上。配置结束后生成代码然后进入嵌入式IDE编写业务逻辑。PSoC Creator或者ModusToolbox会为每个配置好的模拟组件生成API比如ADC_Start()、ADC_Read()、Opamp_SetGain()这些。你在代码里调用它们实现轮流切换通道、定时采集、数据滤波、计算工程值等功能。需要注意的是配置工具生成的代码里模拟模块的初始化顺序是按照你在原理图里的放置顺序生成的如果两个模块之间存在依赖关系必须确保依赖的模块先启动。GreenPAK Designer的流程就完全不同了没有C代码可写。你打开工具后看到的是芯片内部的宏单元网格把比较器输出连到LUT输入LUT输出再连到芯片引脚。配置方式是图形拖拽配置完成后直接烧录。对于不熟悉软件编程的硬件工程师这个门槛其实非常低。但对于纯软件背景的嵌入式工程师来说可能需要先理解什么是组合逻辑、什么是触发器。3.3 固件侧的校准与自检决定长期稳定性可编程模拟SoC的集成度高但这也意味着片上放大器的失调电压、ADC的增益误差、基准电压的温漂都会直接影响精度。IOT设备经常工作在户外温度范围宽不做校准根本扛不住。我在项目中采用的标准做法是三项校准。第一项是零点校准系统上电后将PGA输入端通过模拟mux切换到片内的GND通道或专用校准引脚采集一段数据作为零点偏移存到Flash里。第二项是增益校准将一个已知精度的电压源或片内高精度基准如果可用接入输入端采集数据并与理论值比对得到增益误差系数。第三项是温漂补偿如果芯片内部有温度传感器读取温度值然后根据一个预置的温度-误差表去修正数据这能显著改善户外采集的数据质量。校准的最佳时机不是每一帧都做而是上电时做一次然后周期性比如每小时做一次自检。自检的目的不是修正而是确认模拟链路没有退化把基准电压接入ADC读数如果漂出预设的范围就上报故障。我调过不少设备发现很多故障根本不是数字逻辑崩溃而是运放或者模拟开关在某次浪涌之后状态不对了。自检能帮你尽早发现这类问题。在校准数据的存储上要特别注意Flash的写入寿命和写入时间都要考虑不要每次开机都立刻写Flash可以把新校准值放在RAM里只有变化量超过阈值时才写一次。另外校准系数最好和固件版本号、硬件版本号绑定在一起否则硬件飞线改了之后校准数据还是旧的用户会收到一批测量偏到姥姥家的设备。4. 实际项目中的工具链体验与调试效率4.1 可编程模拟SoC与嵌入式IDE如何分工可编程模拟SoC的开发工具链通常分两半一半是用来规划和配置模拟/数字外设的图形化工具另一半是编写应用层固件和编译调试的嵌入式IDE。这两半在项目流程中是交替使用的。拿PSoC的最新流程来说ModusToolbox里集成了设备配置器Device Configurator你在里面配置BSP、引脚、模拟组件然后生成代码。应用层使用eclipse系的IDE或VSCode插件来写逻辑。对从传统MCU开发转过来的人来说这个思路其实是把芯片选型、引脚分配、时钟配置、模拟前端设计这一大堆以前要在数据手册里反复翻的内容变成了一套可视化的工程文件。GD32 Embedded Builder、Vitis Embedded Development这些IDE虽然主打不同芯片但如果你用过这些IDE里的图形化时钟和引脚配置功能上手ModusToolbox会很容易。GreenPAK Designer则像是另一个世界它没有IDE没有编译器所有的工作都在一个窗口里完成连仿真都是图形化的。你可以在工具里输入激励信号查看内部节点的输出波形确认逻辑有没有跑对再烧到芯片里。对于小规模的混合信号设计这个效率高到离谱。我个人的建议是工具链选择要跟着团队已有技能走。如果团队全是硬件出身GreenPAK Designer这类图形化工具最友好如果团队是嵌入式软件为主PSoC这种有完整IDE和代码生成环境的更合适如果项目的核心算法在上位机或云端模拟部分只想快速跑通那么集成模拟前端的MCU配合常规IDE就够了。4.2 不用示波器怎么调试模拟链路嵌入式调试时有示波器当然最好但IoT现场调试很多时候手边只有一块串口转USB工具和万用表。好在可编程模拟SoC在这一块有天然优势因为模拟信号最终都要被ADC数字化所以你可以直接把内部节点接到ADC的额外通道把观察内部节点变成调试功能。举个例子PSoC片内有多路模拟mux你可以把某个运放输出或比较器输出通过mux接到ADC。调试时固件里加一个特殊模式用串口或I2C往外部输出内部节点的原始ADC码这样你在电脑上就能看到信号波形虽然采样率不如示波器但频率在几十赫兹以内的传感器信号绰绰有余。我做GreenPAK项目时也用过类似思路把比较器输出内部接到一个内部观察引脚如果芯片支持然后配一个LED在外部闪烁来判断比较器有没有翻转。这种方式很土但在现场判断信号有没有到阈值判断对不对非常高效。关于调试效率有一个习惯值得养成在固件里保留一个进入工厂测试模式的入口比如上电时按住某个按键2秒固件就会依次把每个模拟通道切换到内部基准源采集数据并输出。配合上位机脚本一条产线测试几分钟就能完成全部通道的模拟链路自检。这个功能不是客户要求的但我在几个项目里做了之后量产出货的坏件率明显下降。5. 可编程模拟SoC项目里最容易翻车的五类问题5.1 电源噪声和基准电压源是精度最大的敌人这个问题在传统模拟电路里就有但可编程模拟SoC的集成度高容易让人低估电源的影响。芯片内部的运放和ADC共用一个电源时数字逻辑的开关噪声很容易通过电源耦合到模拟前端。我遇到过ADC读数在某些负载开启时跳了十来个LSB排查半天才发现是片内数字模块运行时拉高了电源纹波。解决办法有几个层面。首先电源设计要严格按照数据手册的模拟电源引脚要求来最好单独用一颗LDO给模拟部分供电。其次如果SoC内部没有独立模拟电源引脚至少要在电源输入上加大电容并注意PCB布局时模拟地和数字地在芯片下方单点汇合。第三在固件层面ADC采样时如果可能关掉或暂停不用的数字外设尤其是PWM和通信外设避免采样瞬间发生大的电流跳变。5.2 高阻抗传感器的输入偏置电流问题可编程模拟SoC的输入缓冲器为了省电输入偏置电流通常不会做到特别小有些芯片甚至不做超低漏电保护。客户在实验室里用精密源表测传感器没问题接上你的设备读数就越偏越大这种现象经常是输入偏置电流和传感器高源阻抗共同作用的结果。排查这个问题的技巧是把传感器断开用一个大电阻代替源阻抗看看ADC读数是否变化。如果电阻从10k变成1M以后读数偏了几十个mV那就说明输入偏置电流不达标。解决方案包括在软件里把模拟输入改为低漏电模式如果芯片支持、降低传感器的源阻抗比如加一级外部缓冲器或者换用专门标了超低漏电输入的型号。5.3 切换模拟通道时建立时间比你想象的慢多通道测量设备里模拟mux在通道间切换后后面接的PGA和ADC需要时间稳定下来。很多可编程模拟SoC的ADC支持自动扫描模式你配置了一圈通道它会按顺序自动采。但如果你没有设置合理的稳定时间切换通道后立刻采样采集到的可能还是上一个通道的残留电压。我遇到过实际案例三通道温度采集数据轮流刷新其中一路总是比另外两路低一两度。排查后才发现问题出在稳定时间不够上因为三路传感器的源阻抗不同充电时间常数差异很大。解决方法是按源阻抗大小来设置每路的稳定时间或者在信号链路上加一个低通滤波器减小高频噪声但代价是响应变慢。从系统设计的角度最好在通道切换顺序上把高阻抗通道和低阻抗通道交错排列避免连续快速采样导致误差累积。5.4 PCB布局的模拟地与数字地别在最后才考虑可编程模拟SoC把模拟和数字功能卷进一颗芯片里PCB布局反而越要小心。芯片内部的模拟和数字是分开的芯片外部也需要PCB设计来保持这个隔离。最典型的问题是把数字信号线SPI、I2C、SWD调试口布到模拟输入引脚旁边高频跳变的数字信号会通过寄生电容耦合到模拟通道。我的经验是从原理图阶段就明确哪些引脚是模拟信号线画PCB时让模拟信号线和数字信号线不要长距离平行模拟输入回路尽量短回流地线尽量宽模拟地分割后在芯片的模拟底部单点连接数字地。这些不是玄学每一招背后都是实际发生过的噪声问题。5.5 配置工具生成的初始化顺序别一股脑信任有一类问题非常坑你配置好了模拟链路生成的初始化代码能编译但固件运行时模拟模块就是不工作。一个常见原因是运算放大器需要稳定的输入共模电压才能启动但初始化代码把运放放在了ADC之前启动而ADC在运放没有就绪时就开始转换了。我的建议是拿到生成的初始化函数后对照数据手册把启动顺序理一遍通常是基准电压源先启动然后是运放等待运放稳定芯片数据手册会给出稳定时间再启动ADC。如果芯片提供待机/唤醒接口必须先唤醒模拟域再配置寄存器。我踩过最惨的一次是代码里把ADC配置放在了模拟参考启动之前导致校准系数算出来全乱查了一整天才发现是初始化顺序不对。这些坑如果你没有亲历过光看数据手册其实很难注意到但它们几乎在每个项目里都会以不同方式出现。我建议在项目起步阶段就建立一个问题台账把每个模拟配置相关的异常记录下来包括复现条件、临时解法、最终方案。一个月后回看你会发现自己对芯片的理解深了很多。最后再分享一个实操习惯每次改完模拟配置和硬件电路都顺手在固件里保留一个导出原始ADC码的调试接口这个接口只在DEBUG版本编译时启用。它能帮你快速判断数据异常是传感器变了、配置变了还是校准掉了省掉很多无谓的定位时间。可编程模拟SoC的一大优势就是配置即硬件但也要时刻记住配置变了硬件行为就变了排查问题的思路要跟着变。
返回列表