1. 便携式传感器信号调理的痛点与INA333的破局思路
搞过便携式传感器项目的人都有一个共同体会:传感器本身往往不是最难的,难的是它输出的信号太弱、太脏,直接送给单片机ADC,读出来的数据基本没法用。尤其是应变片、热电偶、压力桥式传感器这类输出差分电压只有几毫伏甚至几十微伏的场景,信号里混着工频干扰、共模噪声、电源纹波,ADC采到的数值跳得跟心电图一样。我在做一款便携式压力采集模块的时候就踩过这个坑,一开始图省事,直接把桥式传感器的差分输出接到STM32的ADC引脚上,结果数据抖动超过200个LSB,根本没法做后续的滤波和标定。
后来换成仪表放大器方案,试过几款经典器件,最终锁定在INA333上。这颗芯片在圈子里被叫做“小钢炮”不是没道理的:静态电流只有50微安(典型值),单电源2.7V到5.5V就能工作,失调电压低到25微伏(最大值),增益误差0.1%,共模抑制比在增益100时能达到100dB以上。这些参数放在一颗MSOP-8封装、价格十几块钱的芯片上,对于便携式设备来说几乎是量身定做的。你要知道,很多同类仪表放大器的静态电流动辄几百微安甚至上毫安,用在电池供电的便携设备上,光是放大器就把续航吃掉了。
这篇文章我打算把INA333在便携式传感器信号调理中的完整用法讲透,从芯片选型逻辑、电路设计、增益电阻计算、单电源偏置技巧,到和Arduino、STM32、ESP32这些常见主控的对接方式,再到实际调试中遇到的噪声问题和排查方法。不管你是刚接触仪表放大器的新手,还是已经用过几款仪表放大器想换更低功耗方案的老手,应该都能从里面找到可以直接抄作业的东西。
2. INA333核心特性拆解与选型逻辑
2.1 为什么是INA333而不是普通运放搭差分电路
很多人第一反应是:差分放大电路用普通运放搭三个电阻不就行了,为什么要花十几块钱买一颗专用仪表放大器?这个问题我在早期项目里也纠结过。用普通运放搭差分电路,最大的问题是电阻匹配精度。差分放大器的共模抑制比直接取决于电阻匹配度,四个电阻只要有0.1%的失配,共模抑制比就会掉到60dB以下。而传感器信号调理场景里,共模干扰往往比差模信号大几个数量级,比如工频共模干扰可能有几伏,而你要测的差分信号只有几毫伏。这种情况下,共模抑制比不够,干扰直接淹没信号。
INA333内部集成了经过激光修调的电阻网络,三个运放构成的经典仪表放大器拓扑,共模抑制比在增益100时保证100dB以上。而且它的输入阻抗极高,差分输入阻抗100吉欧,共模输入阻抗也是100吉欧级别,对桥式传感器这种输出阻抗可能几千欧的源来说,不会造成信号衰减。另外它内部的三运放结构让增益设置只需要一颗外部电阻,增益公式是G = 1 + (100kΩ / Rg),这个100kΩ是内部修调过的,精度很高,你只需要选一颗合适的外部电阻就能得到精确的增益。
还有一点容易被忽略:INA333的输入偏置电流只有200皮安(典型值),输入失调电流50皮安。这意味着即使传感器源阻抗比较高,比如热电偶或者某些高阻抗压力传感器,偏置电流在源阻抗上产生的误差电压也极小。普通运放的输入偏置电流可能是纳安甚至微安级别,在兆欧级源阻抗上就会产生毫伏级误差,直接吃掉信号。
2.2 关键参数与便携场景的匹配分析
选芯片不能只看一个参数,得把关键指标和你的应用场景对齐。我把INA333的核心参数和便携式传感器信号调理的典型需求列了个对照表:
| 参数 | INA333典型值 | 便携场景需求 | 匹配度分析 |
|---|---|---|---|
| 静态电流 | 50μA | 电池供电,要求低功耗 | 极优,一颗CR2032能撑很久 |
| 工作电压 | 2.7V-5.5V | 单节锂电或3.3V系统 | 完美匹配3.3V和5V系统 |
| 失调电压 | 25μV max | 微伏级信号需要低失调 | 优秀,25μV在同类中很低 |
| 失调漂移 | 0.1μV/°C | 户外温度变化场景 | 很好,温漂带来的误差可控 |
| 共模抑制比 | 100dB (G=100) | 工频干扰环境 | 优秀,能压住大部分共模噪声 |
| 增益带宽积 | 350kHz (G=100) | 低频传感器信号 | 足够,传感器信号通常<1kHz |
| 输入偏置电流 | 200pA | 高源阻抗传感器 | 极优,高阻抗源也不怕 |
| 封装 | MSOP-8 | 便携设备空间受限 | 很小,适合紧凑设计 |
从表里可以看出来,INA333在便携场景下的核心优势就是低功耗、低失调、高共模抑制比这三条。350kHz的增益带宽积看起来不高,但传感器信号调理场景里,你要测的压力、温度、应变这些物理量,信号带宽通常都在几百赫兹以内,完全够用。如果你要测振动或者声音这种高频信号,那INA333可能不是最优选择,得看更高带宽的型号。
2.3 单电源供电的偏置问题与解决方案
INA333可以单电源供电,但单电源供电有个绕不开的问题:输出不能低于负电源轨,也不能高于正电源轨。当输入差分信号为负的时候,输出想往负方向走,但负电源是0V,输出就卡在0V附近,波形被削掉一半。这个问题在双电源供电时不存在,因为负电源是-2.5V,输出可以正常往负方向摆动。
解决办法是给输出加一个直流偏置,让静态输出坐在电源电压的一半左右。具体做法是在REF引脚上加一个等于电源电压一半的参考电压。比如3.3V供电时,REF引脚加1.65V,这样输出就以1.65V为中心摆动,正负方向的信号都能正常放大。这个1.65V可以用两颗等值电阻分压得到,也可以用一颗低压差基准源。用电阻分压的话,记得在分压点加一个电容滤波,否则电源噪声会直接串到REF引脚上,被放大到输出。
注意:REF引脚的输入阻抗是100kΩ,分压电阻的并联值要远小于这个值,否则分压比会被REF引脚拉偏。建议分压电阻用10kΩ级别,并联值5kΩ,对100kΩ的影响在5%以内,可以接受。如果要求更高,可以用运放缓冲一下。
3. 增益电阻计算与电路参数设计实操
3.1 增益公式推导与电阻选型
INA333的增益公式是:
G = 1 + (100kΩ / Rg)
这个公式里的100kΩ是内部两个25kΩ电阻串联得到的,激光修调后精度很高。Rg是外部增益电阻,接在RG引脚之间。你要得到某个增益,就把公式反过来算:
Rg = 100kΩ / (G - 1)
举个例子,你要把桥式传感器输出的10mV差分信号放大到1.65V附近(以1.65V为偏置),需要放大165倍。那Rg = 100kΩ / (165 - 1) = 100kΩ / 164 ≈ 609.8Ω。标准电阻里没有609.8Ω,最接近的是610Ω(E96系列)或者604Ω(E24系列)。用610Ω的话,实际增益是1 + 100k/610 = 164.9,和165倍差0.06%,完全够用。
这里有个细节要注意:增益电阻的精度直接影响增益精度。如果你用1%精度的电阻,增益误差就是1%左右。对于大多数传感器应用,1%的增益误差可以通过软件标定消除,问题不大。但如果你不想做标定,那就得用0.1%精度的电阻,成本会高一些。另外增益电阻的温度系数也要考虑,普通厚膜电阻的温度系数是100ppm/°C,温度变化20°C时增益漂移0.2%,对于高精度应用可能需要选低温漂电阻。
3.2 输入滤波与射频干扰抑制
传感器信号线往往比较长,容易拾取射频干扰。INA333的输入端虽然有内部保护,但射频信号可能会在输入级被整流,产生直流误差。解决办法是在输入端加一个差分低通滤波器,截止频率根据你的信号带宽来定。比如你的传感器信号最高频率是100Hz,那截止频率可以设在1kHz左右,留10倍余量。
差分滤波器的结构是在两个输入端之间跨接一颗电容Cdiff,然后在每个输入端和地之间各接一颗电容Ccm。Cdiff和Ccm的关系是Cdiff ≥ 10 × Ccm,这样差分信号和共模信号的截止频率才能匹配。电阻R可以串在输入端,但要注意INA333的输入偏置电流在电阻上产生的噪声。200pA的偏置电流在10kΩ电阻上产生2μV的噪声,相对于25μV的失调来说可以忽略。但如果电阻用到100kΩ,噪声就变成20μV,和失调一个量级了,这时候就得权衡。
截止频率的计算公式是:
f_diff = 1 / (2π × R × Cdiff)
f_cm = 1 / (2π × R × Ccm)
假设R = 10kΩ,想要差分截止频率1kHz,那Cdiff = 1 / (2π × 10k × 1k) ≈ 15.9nF,取标准值15nF。Ccm取1.5nF,共模截止频率约10.6kHz。这样配置下来,差分信号在1kHz以上被衰减,共模信号在10kHz以上被衰减,射频干扰基本进不来。
3.3 电源去耦与布局要点
INA333的电源引脚去耦做不好,输出噪声会明显变大。我的经验是在V+引脚附近放一颗0.1μF的陶瓷电容,再并一颗10μF的钽电容或陶瓷电容。0.1μF负责高频去耦,10μF负责低频储能。两颗电容的接地端要尽量靠近芯片的GND引脚,走线越短越好。
PCB布局上,增益电阻Rg的走线要尽量短且对称,因为RG两个引脚之间的任何寄生电阻都会影响增益。输入端的走线要远离电源线和数字信号线,最好用地线包围起来做屏蔽。REF引脚的走线也要注意,如果REF电压是从远处引过来的,中间要加滤波电容,否则REF上的噪声会直接加到输出上。
实操心得:我习惯在REF引脚和地之间放一颗1μF的电容,同时在REF分压电阻的中点也放一颗0.1μF的电容。这样REF电压的噪声能压到很低,输出波形干净很多。另外,如果PCB空间允许,把INA333放在传感器接口附近,缩短输入走线长度,比什么滤波措施都管用。
4. 与Arduino、STM32、ESP32的对接实战
4.1 与Arduino UNO的5V单电源方案
Arduino UNO的供电是5V,ADC参考电压默认也是5V,10位分辨率。用INA333调理传感器信号,输出偏置设在2.5V,这样ADC读到的数值在512附近摆动。增益设置要根据传感器输出幅度来定,目标是让放大后的信号尽量占满ADC量程但不削顶。比如传感器满量程输出20mV,想放大到2V峰峰值,增益就是100倍,Rg = 100k / 99 ≈ 1.01kΩ,取1kΩ标准值,实际增益101倍。
接线方面,INA333的V+接5V,V-接GND,REF接2.5V(两颗10kΩ电阻分压加1μF电容),输出接Arduino的A0。增益电阻接在RG引脚之间。传感器差分输出接INA333的+IN和-IN。代码部分很简单,就是读ADC然后换算:
void setup() { Serial.begin(9600); } void loop() { int adcValue = analogRead(A0); float voltage = adcValue * (5.0 / 1023.0); float sensorVoltage = (voltage - 2.5) / 101.0; Serial.print("Sensor voltage: "); Serial.print(sensorVoltage * 1000, 3); Serial.println(" mV"); delay(100); }这段代码里,voltage是ADC引脚电压,减去2.5V偏置后除以增益101,得到传感器原始差分电压。乘以1000换算成毫伏,方便看。实测下来,Arduino UNO的ADC噪声大概在2-3个LSB,换算到输入端就是2.5mV / 101 ≈ 0.025mV,也就是25μV左右,和INA333的失调一个量级,说明ADC本身成了瓶颈。如果要求更高,得换外置ADC。
4.2 与STM32的3.3V高分辨率方案
STM32的ADC是12位的,参考电压3.3V,分辨率比Arduino UNO高4倍。用INA333调理信号,输出偏置设在1.65V,ADC读到的数值在2048附近。STM32的ADC输入阻抗相对较低,建议在INA333输出和ADC输入之间加一个电压跟随器做缓冲,或者确认STM32的ADC采样时间设置得足够长,让采样电容充分充电。
STM32的HAL库代码示例:
#include "stm32f1xx_hal.h" ADC_HandleTypeDef hadc1; void SystemClock_Config(void); static void MX_ADC1_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_ADC1_Init(); HAL_ADC_Start(&hadc1); while (1) { HAL_ADC_PollForConversion(&hadc1, 100); uint32_t adcValue = HAL_ADC_GetValue(&hadc1); float voltage = adcValue * (3.3f / 4095.0f); float sensorVoltage = (voltage - 1.65f) / 101.0f; // 后续处理 HAL_Delay(10); } }STM32的ADC配置里,采样时间要设长一点,比如239.5个周期,让采样电容充分充电。如果采样时间太短,高源阻抗的信号还没充到采样电容上就转换了,读数会偏低。INA333的输出阻抗很低,但走线上的寄生电容和ADC输入电容加起来也有几十皮法,采样时间不够的话还是会引入误差。
4.3 与ESP32的物联网传感器节点方案
ESP32自带WiFi和蓝牙,适合做物联网传感器节点。它的ADC是12位的,但线性度一般,尤其是接近0V和3.3V的时候非线性比较明显。用INA333把信号偏置在1.65V,避开ADC的非线性区域,是个好办法。ESP32的ADC参考电压内部是1.1V,但可以通过衰减器设置成测量0-3.3V范围。用Arduino框架开发ESP32时,代码和Arduino UNO类似:
void setup() { Serial.begin(115200); analogReadResolution(12); analogSetAttenuation(ADC_11db); } void loop() { int adcValue = analogRead(34); float voltage = adcValue * (3.3 / 4095.0); float sensorVoltage = (voltage - 1.65) / 101.0; Serial.printf("Sensor: %.3f mV\n", sensorVoltage * 1000); delay(100); }ESP32的ADC引脚34、35、36、39是输入专用引脚,没有输出功能,但ADC性能相对好一些。用这些引脚做模拟输入,噪声会比通用GPIO小。另外ESP32的WiFi工作时会产生射频干扰,可能耦合到模拟信号上。我的做法是在INA333输出和ESP32 ADC之间加一个RC低通滤波器,截止频率设在100Hz左右,把WiFi的射频干扰滤掉。
注意:ESP32的ADC在WiFi开启时噪声会明显增大,如果对精度要求高,可以在采样时暂时关闭WiFi,或者用外部ADC芯片。我实测过,WiFi开启时ADC噪声大概增加3-5个LSB,换算到输入端是3.3V / 4095 × 5 / 101 ≈ 40μV,对于毫伏级信号来说还能接受,但对于微伏级信号就需要注意了。
5. 噪声排查与常见问题实录
5.1 输出噪声大的排查思路
INA333输出噪声大,原因可能有很多,我按排查顺序列一下。第一步先看电源,用示波器交流耦合测V+引脚上的纹波,如果纹波超过几毫伏,那输出噪声很可能来自电源。解决办法是加强去耦,0.1μF和10μF电容都要有,而且接地要短。第二步看REF引脚,REF上的噪声会直接加到输出上,用示波器测REF引脚的交流成分,如果有噪声,加电容滤波。第三步看输入端,输入线如果太长,会拾取环境中的工频干扰,把输入线绞合起来或者用屏蔽线,能明显改善。第四步看增益电阻,Rg的走线如果太长,寄生电感可能引起振荡,尽量缩短Rg走线。
还有一个容易被忽略的点:INA333的REF引脚如果悬空,输出会漂到电源轨附近,看起来像是噪声很大,其实是REF没接。我第一次用的时候就把REF忘了,输出一直贴在3.3V,查了半天才发现是REF悬空。
5.2 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 输出贴在电源轨 | REF悬空或偏置不对 | 测REF引脚电压 | 接REF分压电路 |
| 输出噪声大 | 电源去耦不足 | 示波器测V+纹波 | 加0.1μF+10μF电容 |
| 增益不对 | Rg阻值错误或走线太长 | 测Rg实际阻值 | 换精密电阻,缩短走线 |
| 输出振荡 | 输入滤波不足或负载电容太大 | 示波器看输出波形 | 加输入RC滤波,减小负载电容 |
| 温漂大 | 增益电阻温漂大 | 测不同温度下输出 | 换低温漂电阻 |
| 共模抑制差 | 输入源阻抗不匹配 | 测两输入端阻抗 | 加缓冲或匹配阻抗 |
| ADC读数跳动 | ADC参考噪声大 | 测ADC参考电压 | 加参考滤波电容 |
5.3 独家避坑技巧
第一个坑:增益电阻的功率。虽然INA333的增益电阻上流过的电流很小,但如果Rg选得太小,比如几十欧姆,增益会很大,这时候Rg上的功耗虽然不大,但Rg的精度和温漂会变得很重要。我建议Rg不要小于100Ω,对应最大增益约1001倍。超过1000倍的增益,噪声和漂移都会明显变大,不如用两级放大。
第二个坑:输入端的共模电压范围。INA333的共模输入范围不是轨到轨的,在单电源3.3V供电时,共模输入范围大概是0.3V到3.0V左右。如果你的传感器共模电压接近0V或3.3V,INA333可能工作不正常。解决办法是给传感器加一个偏置,让共模电压坐在中间。比如桥式传感器,可以把桥的参考端从地抬到1.65V,这样共模电压就在1.65V附近,远离电源轨。
第三个坑:输出负载电容。INA333的输出可以驱动一定的容性负载,但如果负载电容太大,比如直接接长电缆,可能会引起振荡。如果必须驱动长电缆,在输出和电缆之间串一颗50Ω电阻做隔离,能有效防止振荡。
第四个坑:PCB布局中的地平面分割。模拟地和数字地要分开,最后在一点连接。INA333的GND引脚要接模拟地,ADC的模拟地也要接模拟地,数字部分的地接数字地。如果混在一起,数字开关噪声会通过地平面耦合到模拟信号上,输出噪声会明显增大。
6. 进阶应用与扩展思路
6.1 多通道传感器采集方案
如果你要采集多个传感器的信号,可以用多颗INA333,每个通道一颗,共用电源和REF。这样每个通道的增益可以独立设置,适合不同传感器混合使用的场景。比如一个通道接压力传感器,增益100倍;另一个通道接热电偶,增益200倍。多颗INA333的静态电流加起来,如果每颗50μA,10颗就是500μA,对于电池供电的设备来说还是可以接受的。
多通道布局时,每颗INA333的电源去耦电容要独立,不要共用一颗电容。因为共用去耦电容时,一个通道的电流变化会通过电容耦合到另一个通道。每颗芯片旁边放自己的0.1μF电容,10μF可以几个通道共用一颗。
6.2 与24位ADC搭配做高精度采集
INA333的噪声在增益100时大概是0.5μV峰峰值(0.1Hz-10Hz),这个噪声水平对于24位ADC来说还是偏大。如果你要做高精度采集,比如电子秤或者精密压力测量,INA333后面可以接一颗24位ADC,比如ADS1256或者HX711。HX711内部集成了32倍增益的仪表放大器,但它的噪声和失调不如INA333。用INA333做前级放大,HX711或者ADS1256做后级ADC,能兼顾低噪声和高分辨率。
这种方案里,INA333的增益可以设小一点,比如10倍,把信号放大到ADC的合适范围,剩下的放大和滤波在数字域做。INA333增益10倍时,Rg = 100k / 9 ≈ 11.1kΩ,取11kΩ标准值。增益小的时候,INA333的带宽更宽,噪声也更低。
6.3 电池供电的电源管理
便携设备用电池供电,电源管理直接影响续航。INA333的静态电流50μA,如果一直开着,一颗1000mAh的锂电池能撑20000小时,也就是两年多。但如果你用LDO给INA333供电,LDO的静态电流可能比INA333还大。比如常见的AMS1117静态电流5mA,比INA333大100倍。所以选LDO的时候,一定要看静态电流参数,选低静态电流的型号,比如TPS7A02系列,静态电流只有25nA。
如果传感器不是一直需要采集,可以用MOS管控制INA333的电源,需要采集的时候打开,采集完关掉。这样平均功耗可以降到微安级别。但要注意,INA333上电后需要一定的建立时间,大概是几十微秒,如果采集间隔很短,频繁开关可能不划算。
7. 我的实操体会与几个小技巧
INA333这颗芯片我用了大概两年多,从最初的面包板验证到后来的PCB量产,踩过的坑基本都在这篇文章里了。最后再分享几个我个人的小技巧。
第一个技巧:调试的时候,先用双电源供电验证电路。双电源供电时,REF接地,输出以0V为中心摆动,用示波器看波形最直观。确认电路工作正常后,再改成单电源供电,加REF偏置。这样能把偏置问题和放大问题分开排查,省很多时间。
第二个技巧:增益电阻用贴片电阻的时候,注意电阻的封装。0603封装的电阻功率是0.1W,0805是0.125W,对于INA333的增益电阻来说都够用。但0603的电阻在焊接时容易立碑,如果手工焊接,建议用0805,好焊一些。
第三个技巧:如果传感器信号特别微弱,比如热电偶输出的几十微伏,INA333的失调电压25μV可能还是偏大。这时候可以用软件做失调校准:在传感器没有信号的时候,采集一组数据取平均,作为失调基准,后续采集的数据都减去这个基准。这样能把失调的影响降到很低,但要注意温漂,温度变化后需要重新校准。
第四个技巧:INA333的输出可以直接接STM32的ADC,但STM32的ADC输入有采样电容,采样瞬间会从INA333输出拉一个电流脉冲。如果INA333的输出阻抗不够低,这个电流脉冲会在输出上产生电压跌落,导致ADC读数偏低。解决办法是在INA333输出和ADC之间加一颗1kΩ电阻和一颗100nF电容做缓冲,截止频率约1.6kHz,对低频信号没影响,但能吸收ADC的采样电流脉冲。
这个方案后续还可以扩展,比如加一个低通滤波器做抗混叠,或者用模拟开关做多通道切换,或者把数据通过ESP32的WiFi传到云端做远程监测。INA333作为信号链的第一级,把信号调理干净了,后面的ADC和数字处理才能发挥出应有的性能。