尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

传感器前端设计新利器:Microchip 8位PIC模拟外设与低功耗实战解析

传感器前端设计新利器:Microchip 8位PIC模拟外设与低功耗实战解析 做传感器应用开发这些年我养成了一个习惯拿到一颗新MCU先不看主频先翻模拟外设清单和低功耗机制。原因很简单传感器项目里真正决定产品成败的往往不是算力而是信号链能不能干净、功耗链能不能省心。最近Microchip放出来的一批面向传感器应用的8位PIC——PIC18F16Q40/Q41、PIC16F17146这些我逐颗做了评估还拿其中一颗低成本QFN封装搭了一版实际方案。这篇把选型思路、外设细节、实测数据和踩过的坑一起整理出来。这批新8位PIC要解决的是传感器前端的三大老难题小信号放大、ADC采样精度、功耗控制。它们把运放、比较器、DAC、带计算功能的ADCADCC、零交叉检测这些以前要靠外部运放和分立件才能搞定的功能全部塞进了片内而且大部分外设都能在CPU休眠状态下独立工作。对做电池供电IoT节点、工业变送器、家电传感检测的工程师来说这几颗料值得认真看一眼。1. 新8位PIC的产品定位为什么传感器应用还离不开8位机1.1 8位机在传感器场景的不可替代性每次聊选型总有工程师觉得8位机是老古董。真不是这样。传感器应用有个特点数据量极小但采集频率、功耗预算和成本约束极其苛刻。一颗温湿度节点每秒采一次、每十秒上报一次算力需求可能连1%都用不到但要求整个系统在CR2032纽扣电池下跑一两年。这种场景下8位PIC反而是最优解。先说成本。一颗主流8位PIC的单价普遍在0.3到0.8美元之间而带同样数量级模拟外设的32位MCU基本要1.5美元往上。做消费级、工业级批量产品一颗料差0.5美元十万片就是五万美元的差异这不是小数目。再说功耗。8位PIC的休眠电流可以做到1微安以下唤醒时间在微秒级别配合新系列里的硬件自动采样机制平均功耗能做到极低。最后是生态。MPLAB X IDE、MCC代码生成器、免费编译器、大量应用笔记从入门到量产的工具链都是现成的团队学习成本低出了问题也好查。所以我的建议一直很直接如果你的应用只需要做传感器采集、阈值判断、简单通信别一上来就上32位。先把8位机的模拟外设和低功耗能力吃透往往能用更低的成本做出更可靠的产品。1.2 内核独立外设让CPU从采样循环里解脱出来这批新8位PIC和早期型号最大的区别就是大量引入了Core Independent Peripherals内核独立外设简称CIP。这名字听着玄乎说白了就是外设本身能独立完成一系列工作不用CPU一步步指挥。打个比方。老式做法的CPU像个什么事情都要亲自过问的老板每隔几毫秒就要起来看一眼ADC有没有转换完转换完了读数据、做平均、比较阈值然后继续睡。问题在于CPU每次醒来都要耗电、都要花时间频繁醒来反而把功耗拉高。而CIP的思路是给ADC配一个自动化流水线让它自己定时触发、连续转换、累加平均、和阈值比较全都做完之后只有结果真正超出设定范围时才把CPU叫醒。这带来的直接好处有两个。第一CPU大部分时间都处于休眠状态平均功耗可以降一个数量级以上。第二CPU不用频繁处理中断代码逻辑大幅简化把测量-处理-上报变成睡大觉-被叫醒-干正事-继续睡。我用PIC18F16Q41实测下来整颗芯片在休眠自动采样的工作模式下平均电流能做到几十微安级别这在以前不敢想。1.3 新器件家族怎么选一句话版选型建议这批新8位PIC主要分两个家族我整理了它们在传感器场景下的核心差异。系列代表型号核心模拟外设适合场景PIC16F171xxPIC16F1714612位ADCC、2路运放、2路比较器、8位DAC、ZCD中低端传感器节点、家电传感、电池供电小终端PIC18F-Q40/Q41PIC18F16Q4112位ADCC、2路运放、2路比较器、8位DAC、ZCD、CLC工业变送器、需要DMA/更多存储/更强通信的场景选择时主要看三点一是存储如果需要跑协议栈如Modbus、CANopen选PIC18F-Q系列程序空间和RAM更充裕二是引脚数量从14脚到40脚都有按传感器数量和PCB面积来定三是是否需要DMAQ系列的部分型号支持DMA适合要搬运数据块的场景。如果只是简单的单路传感器采集PIC16F171系列就够用了单价更低。2. 核心外设深度拆解ADCC、运放、比较器与ZCD2.1 ADCC带计算ADC平均、滤波、阈值比较都搬到硬件里这批新8位PIC最值钱的外设就是带计算功能的ADCMicrochip管它叫ADCC。常规ADC只能把一个模拟电压变成一个数字码ADCC在这一步后面还加了三个硬件模块累加器、右移器和数字滤波器外加一组上下限阈值寄存器。先说累加和平均。你可以配置ADC连续转换多少次比如32次硬件自动把32次结果累加到一个寄存器里然后通过右移指定位数来除以32得出平均值。整个过程CPU完全不参与也不需要在中断里做累加运算。这意味着什么意味着传感器的随机噪声可以被硬件平均掉。我实测用一颗内部运放放大热电偶信号开了32次平均之后码值的峰峰值抖动从±12个LSB降到了±3个LSB效果非常明显。再说是阈值比较。ADCC内部有ADLTH和ADUTH两个寄存器可以设置下限和上限阈值。ADC转换完成并做完平均后硬件自动把结果和阈值区间比较只有超出阈值范围才产生中断唤醒CPU。这个功能在报警类传感器里特别实用平时不用CPU操心超限了才上报。还有低通滤波功能硬件内置了滤波系数可调的滤波器可以对ADC结果做滑动平均进一步平滑信号。关键点在于这些功能不占用CPU运行时间也不需要在软件里写复杂的滤波算法。你的main循环可以简单到只有一个SLEEP()语句所有测量逻辑都由ADCC自己完成。这彻底改变了传感器固件的编写方式。2.2 轨到轨运放的多面手用法新系列片内集成了一到两路轨到轨输入输出运放这对小信号传感器是雪中送炭。以前处理电桥、热电偶、PT100这些信号板子上必须加外部运放现在直接用片内的就行。片内运放的典型用法有三种。第一种是PGA模式把运放接成可编程增益放大器增益通过寄存器配置用于放大毫伏级信号。第二种是电压跟随器也就是缓冲器用于驱动ADC的采样电容解决高阻抗传感器直接接ADC导致的采样误差。第三种是和比较器配合做信号调理和阈值判断的前级。一个非常实用的技巧是电桥传感器配合内部运放做比率式测量。具体做法是让电桥的激励电压和ADC的参考电压都取VDD。这样即使电池电压从3.3V掉到3.0VADC结果也不受影响因为激励和参考是同一个电压源电压波动自然抵消。这个细节在电池供电的称重、压力检测项目里能省掉一颗稳压芯片的成本。需要提醒的是片内运放的带宽和精度都有上限不适合放大高频信号。但对传感器这种直流、低频信号来说完全够用。而且运放的偏置电压会导致零点偏移好在部分新器件在出厂时把校正数据烧录在Device Information AreaDIA里软件启动时读取并补偿就行这个机制对批量生产的一致性帮助很大。2.3 比较器DAC组合省掉外部参考与阈值电路很多传感器应用需要判断信号是否超限传统做法是用比较器加一个外部电位器或参考芯片设定阈值。现在片内集成了比较器和8位DAC阈值可以直接由软件设定。你可以把DAC输出电压接到比较器同相端传感器信号接到反相端比较器输出直接触发中断或者作为其他外设的输入全程不需要外部元件。这个组合在省电上还有额外玩法。比较器本身可以工作在极低功耗模式配合DAC可以实现常开监测系统休眠比较器持续监测信号一旦超限立即通过中断唤醒CPU。这样比ADCC定期唤醒还要省电适合用于门窗磁控、水流检测、振动报警这类事件型传感器。比较器还有一个容易被忽略的用法就是利用它的迟滞特性做信号整形。传感器输出信号如果有毛刺或振荡在阈值附近来回穿越会导致频繁误触发。内部比较器可以配置迟滞电压让上升穿越阈值和下降穿越阈值不在同一个点从硬件上消除振荡毛刺。这个细节我在做水位检测时深有体会之前软件里去抖写了半天后来发现把比较器迟滞打开代码直接删掉三行。2.4 ZCD零交叉检测不只是用在调光零交叉检测ZCD这个外设很多人一听觉得是调光、可控硅应用才用得上其实在传感器领域同样有价值。它的作用是检测交流电压过零点的时刻产生同步信号。凡是需要和市电同步做采样的应用比如交流供电的功率计量、电流互感器采样、电机电流检测ZCD都能提供精确的时序参考。它的原理很简单通过一个高阻分压结构把交流电压信号引入引脚内部比较器检测电压过零的时刻。相比外部用光耦搭零交叉电路片内ZCD省掉了大量分立元件。而且ZCD的输出可以作为定时器或ADC的触发源实现交流周期内的定点采样。我在做一个交流电流监测项目时用了这个功能市电过零时ZCD产生中断CPU在过零后若干毫秒的位置触发ADC采样从而避开电流浪涌区采出来的电流有效值稳定性好很多。以前用外部光耦做零交叉温度漂移导致过零检测点偏移现在直接用片内的一致性好了不少。2.5 PPS引脚重映射布局噪声的救星Peripheral Pin SelectPPS是这批新PIC的另一个实用功能几乎所有数字外设的输入输出引脚都可以通过寄存器重新映射。这意味着你在画PCB的时候不需要被迫把某些信号线绕远路去迁就固定的引脚功能可以先按最优布局布线再用软件把外设映射到需要的引脚上。对传感器应用来说这个功能的实际收益是抗干扰。模拟输入引脚可以尽量靠近传感器连接器数字通信引脚可以放在远离模拟区域的一侧电源和地走线可以更短。我在画一个四路模拟输入的采集板时就是靠PPS把UART映射到离MCU供电脚最远的那组引脚实测数字通信对模拟通道的干扰明显降低。要注意的是PPS映射必须在外设使能之前完成并且在较新器件上要按顺序操作PPSLOCK寄存器解锁再锁定防止配置被意外改写。这个顺序搞反了外设怎么都不工作是新手最容易踩的坑之一。3. 实操全流程用PIC18F16Q41搭一个低功耗温度采集节点3.1 模拟前端设计从传感器到ADC引脚我这次搭的方案是工业上很常见的场景用NTC热敏电阻做温度采集电池供电每分钟上报一次温度。传感器部分NTC和精密电阻组成分压网络分压点经过一个片内运放缓冲后接到ADCC输入引脚。选NTC时要注意阻值和B值我用的10kΩ NTC25°C时阻值10kΩB值3435串联电阻也是10kΩ。分压输出接运放跟随器再进ADC。这样做的原因很明确NTC是高阻抗器件直接接ADC会导致采样保持电容充电时间不足采出来的值偏低且不稳定。中间加一级运放缓冲源阻抗降到几十欧姆级别采样精度就有保障了。实际搭建时还要注意在NTC分压点并联一个0.1μF电容做滤波把环境中耦合进来的高频噪声滤掉。这个电容不能太大否则会拖慢信号响应也不能太小否则滤波效果不明显。0.1μF是我在多数场景下的经验值如果需要更快的温度响应可以降到10nF再实测。3.2 ADCC配置完整步骤自动触发、32次平均、窗口比较配置ADCC是这次项目的核心。我的目标是定时器每30秒自动触发一次ADCC连续转换32次并做平均平均结果和上下限阈值比较超限才唤醒CPU上报否则继续睡。以下代码以PIC18F-Q系列的寄存器风格为例具体型号的寄存器名以数据手册为准但整体配置思路是一致的。void adcc_init(void) { ADCON0bits.ADON 0; // 配置期间先关闭ADC ADPCH 0x01; // 选择AN1作为采样通道 ADCON1bits.ADPREF 0b00; // 正参考电压选择VDD负参考VSS ADCON3bits.ADCLK 0x1F; // ADCC时钟 FOSC/64保证转换时钟在规格范围内 ADCON2bits.TRIGSEL 0b0001; // 自动触发源选择Timer0定时触发采样 ADCON0bits.ADCONT 1; // 使能连续转换模式让ADC按配置自动跑 ADRPT 31; // 连续转换32次寄存器值是次数-1 ADCON3bits.ADCRS 5; // 累加结果右移5位等效除以32输出平均值 ADLTH 200; // 下限阈值温度低于某值时判定超限 ADUTH 800; // 上限阈值温度高于某值时判定超限 ADCON2bits.ADMD 0b100; // ADC工作模式窗口比较模式 PIE1bits.ADIE 1; // 使能ADCC中断 ADCON0bits.ADON 1; // 打开ADC INTCONbits.PEIE 1; // 使能外设中断 INTCONbits.GIE 1; // 全局中断使能 }配置顺序有一个细节必须是先选通道、参考电压、时钟、触发源最后再置ADON使能。很多人习惯先开ADC再配其他寄存器结果配置无效而且ADC在配置过程中就可能开始采样产生错误结果。另外触发源的选择很关键我用的是Timer0自动触发这样采样间隔可以由定时器精确控制CPU不用干预。3.3 主循环与低功耗流程代码配置好ADCC之后主循环可以写得非常简洁。核心思路是CPU进入休眠ADCC在定时器触发下自动完成32次采样和平均然后和阈值比较。只有超限才产生中断CPU醒来处理上报。volatile uint8_t wake_flag 0; void __interrupt() adcc_isr(void) { if (PIR1bits.ADIF) { PIR1bits.ADIF 0; // 清中断标志 wake_flag 1; // 通知主循环处理 } } void main(void) { system_init(); // 时钟、GPIO、PPS映射、运放、ADCC初始化 adcc_init(); while (1) { if (wake_flag) { wake_flag 0; uint16_t value (ADRESH 8) | ADRESL; // 这里只需要处理超限情况换算温度、报文上报、清状态 process_alert_and_report(value); } SLEEP(); // 无事发生继续睡 } }这段代码看着简单但背后硬件在默默干活。每次Timer0溢出ADCC自动开始32次转换并累加平均完全不需要CPU参与。CPU只在阈值比较命中时醒来。实际测下来从进入Sleep到ADCC中断唤醒整个流程的电流曲线非常干净。还有一点值得强调进入休眠之前要把不用的外设全部关闭尤其是运放如果不参与方案就务必关掉否则运放的静态电流会直接体现在休眠电流上可能多出几百微安。这是一个非常容易被忽略的功耗大头。3.4 功耗实测与电池寿命推演做完软硬件之后我测了三种状态下的电流数据如下。状态电流说明深度休眠0.8μA关闭WDT、BOR保留ADCC阈值比较唤醒ADCC自动采样约150μA每次采样周期约2ms含运放工作电流唤醒上报约2.5mA唤醒后UART发送报文约5ms按每分钟上报一次、每次上报前做一次采样来估算功耗。假设睡眠时间59秒采样和上报时间约7ms那么平均电流大概是0.8μA × 0.9999 150μA × 0.0001 2500μA × 0.0001 ≈ 0.8 0.015 0.25 ≈ 1.1μA。如果进一步把上报间隔改成五分钟一次平均电流基本就贴着休眠电流走了。用一颗CR2032纽扣电池标称容量220mAh来算220mAh ÷ 1.1μA ≈ 200000小时折合约22年。当然这是理想值电池自放电、温度影响都没算但即便打个对折十年以上的使用寿命也绰绰有余。这就是ADCC自动采样CIP机制带来的实际收益。4. 调试实录常见问题与排查技巧4.1 采样值跳变先查源阻抗和采样时间我在调试过程中遇到的第一个问题是ADC输出值总在几个码之间跳。排查下来原因不是噪声而是NTC分压网络的高源阻抗。NTC本身阻值随温度变化25°C时源阻抗约5kΩ这个值对ADC内部的采样保持电容来说偏大导致采样时间内电容充不满每次转换结果都略有差异。解决办法有两个一是加大ADC的采样保持时间通过ADCON寄存器里的ACQ位设置更长的采样时间二是在信号源和ADC之间加运放缓冲。我的经验是如果源阻抗超过2.5kΩ就应该优先考虑加缓冲而不要一味延长采样时间因为采样时间拉长会增加整体功耗。还有一个坑PCB走线。ADC输入引脚旁边的走线如果和数字通信线平行走太长耦合过来的开关噪声也会体现在采样结果里。我的习惯是ADC输入线周围尽量铺地隔离避免和PWM、UART这类高频信号长距离平行。4.2 运放输出自激振荡排查去耦与Layout启用片内运放做PGA放大时我遇到了运放输出自激振荡的问题表现为输出波形叠加了高频震荡。排查下来有两个因素。第一是电源去耦不足。运放工作时的动态电流会在电源上产生波动如果去耦电容离MCU电源脚太远等效电感就会偏大导致电源纹波反馈到运放输入端形成振荡。解决办法是在MCU电源引脚就近放置0.1μF和1μF两个去耦电容并且走线要短粗。第二是PCB布局问题。运放输入引脚和反馈路径容易拾取耦合噪声布局时应该让输入走线尽量短并用地线包围。如果这样还振荡可以尝试降低增益档位或者从外部在反馈网络上加一个小电容做带宽限制。这里有个实际心得先软件上把运放增益调低确认不是增益过高导致的振荡再从Layout上找原因效率会高很多。4.3 阈值比较频繁误触发硬件去抖与软件复核窗口比较模式跑起来之后又遇到一个问题阈值边界附近的噪声导致频繁误触发CPU经常被无缘无故唤醒。解决思路是软硬结合。硬件层面除了前面说的开启比较器迟滞ADCC本身也可以利用重复转换机制。不要只做一次转换就判阈值而是让ADC连续转换并平均多次把噪声平均掉之后再做窗口比较。我配置的32次平均就是为了这个目的。软件层面可以在中断里加一个复核逻辑第一次唤醒后不立即上报而是再触发一次完整采样若两次结果都超限才确认报警。这一步能有效避免瞬时干扰造成的误报。实测下来这个确认两次的机制把误报率降到了零代价是每次报警要多耗几毫秒的电流完全可以接受。4.4 休眠电流异常偏高引脚状态和外设时钟是重灾区测深度休眠电流时我发现怎么也降不到数据手册标称值始终有几十微安。排查了很久最终锁定在两个地方。第一个是GPIO引脚悬空。未使用的引脚如果处于浮空状态输入缓冲器会在高低电平之间来回切换产生漏电流。解决办法是把所有未使用引脚配置为输出低电平或者使能内部弱上拉/下拉让它们有一个确定的电平。这个操作能在很多MCU上直接省掉十几微安。第二个是外设时钟没有完全关闭。某些外设虽然功能没有使用但如果它的时钟源仍然开启休眠时也会消耗电流。比如我保留了定时器2的时钟给一个不用的PWM模块光这一项就多吃了8μA。阅读数据手册里的休眠模式章节逐一确认每个外设的时钟是否关闭是调低功耗的必修课。还有个容易被忽略的是调试接口。调试器连接状态下芯片的调试模块会保持活动休眠电流会明显偏大。测量功耗时一定要拔掉调试器用独立的电源和电流表测试否则数据完全不可信。最后再分享一个实操中的小技巧做这类低功耗传感器项目我从一开始就会在板上预留一个1Ω的采样电阻串联在电池回路里测量功耗时直接用示波器探头测电阻两端压差就能看到完整的电流波形。这个方法比用万用表看平均电流直观得多能清楚看到ADC自动采样、CPU唤醒、通信发送每个阶段的电流尖峰优化功耗时全靠它定位问题。新8位PIC的硬件外设能力确实强但真正把低功耗做好还是得靠这些接地气的调试手段一点点抠。
返回列表