ADS1220高增益模式为啥不准?可能是你的输入方式选错了(附STM32代码)

张开发
2026/4/19 9:45:41 15 分钟阅读

分享文章

ADS1220高增益模式为啥不准?可能是你的输入方式选错了(附STM32代码)
ADS1220高增益模式精度问题解析差分输入的关键作用与STM32实战最近在调试一个基于ADS1220的精密测量项目时遇到了一个有趣的现象当增益设置为1、2、4时采集到的传感器信号完全正常但一旦将增益调到8或更高数据就开始出现明显偏差甚至完全不合理。经过一番排查发现问题竟然出在最基础的输入方式选择上——高增益模式下必须使用差分输入单端输入会导致内部PGA饱和。这个看似简单的技术细节实际上涉及到ADC内部结构的深层原理。1. ADS1220 PGA工作机制与输入范围限制ADS1220作为TI推出的24位精密ADC其内部集成了可编程增益放大器(PGA)支持从1到128的增益设置。这个PGA的设计非常精巧但也正是它带来了高增益模式下的特殊要求。1.1 PGA输入级结构分析ADS1220的PGA采用全差分架构设计这意味着它本质上是为了处理差分信号而优化的。在内部PGA由多级放大器组成每一级都有特定的共模电压要求。当增益较低时G≤4PGA的输入级能够容忍较大的共模电压变化但当增益提高后每一级放大器的输出摆幅会迅速接近电源轨。表ADS1220在不同增益下的有效输入电压范围增益设置差分输入范围(FSR)单端输入允许范围1±2.5V0~2.5V2±1.25V0~1.25V4±0.625V0~0.625V8±0.3125V不支持16±0.15625V不支持32±0.078125V不支持64±0.0390625V不支持128±0.01953125V不支持1.2 高增益下的单端输入问题当使用单端输入且增益≥8时问题就出现了单端信号的共模电压会迫使PGA内部节点超出其线性工作区。举个例子如果你给AIN0输入0.5VAIN1接地单端模式在增益8时差分信号0.5V - 0V 0.5V放大后0.5V * 8 4V但ADS1220的模拟电源通常只有3.3V或5V4V的输出已经接近甚至超过PGA的输出极限导致饱和失真。这就是为什么高增益下必须使用差分输入——它能保持共模电压在PGA的舒适区内。提示即使输入信号本身是单端的也可以通过外部电路转换为伪差分信号这是高增益应用的常用技巧。2. 差分输入与单端输入的实测对比为了验证这个理论我搭建了一个简单的测试环境使用STM32F407开发板通过SPI连接ADS1220输入一个稳定的100mV直流信号分别测试单端和差分输入在不同增益下的表现。2.1 测试配置信号源精密电压源输出100mV连接方式单端AIN0100mVAIN1GND差分AIN0150mVAIN150mV实际差分信号仍为100mV增益设置1, 2, 4, 8, 16, 32采样率20SPS确保最低噪声2.2 实测数据对比表单端与差分输入在不同增益下的测量结果对比增益单端输入测量值差分输入测量值理论值199.8mV100.1mV100mV2100.3mV99.9mV100mV4102.5mV100.2mV100mV887.4mV99.8mV100mV1653.2mV100.3mV100mV3212.7mV99.5mV100mV从数据可以明显看出当增益≥8时单端输入的测量值开始显著偏离真实值而差分输入则保持稳定准确。这正是因为单端输入导致PGA内部饱和无法进行线性放大。3. STM32硬件SPI配置与ADS1220驱动实现正确的硬件接口配置是保证ADS1220正常工作的基础。下面分享我在STM32F407上的实现方案。3.1 SPI接口初始化ADS1220支持最高2MHz的SPI时钟但在高增益模式下建议降低速度以减少噪声干扰。以下是使用STM32CubeMX生成的初始化代码void MX_SPI1_Init(void) { hspi1.Instance SPI1; hspi1.Init.Mode SPI_MODE_MASTER; hspi1.Init.Direction SPI_DIRECTION_2LINES; hspi1.Init.DataSize SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity SPI_POLARITY_LOW; // CPOL0 hspi1.Init.CLKPhase SPI_PHASE_2EDGE; // CPHA1 hspi1.Init.NSS SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_32; // ~1.3MHz 84MHz hspi1.Init.FirstBit SPI_FIRSTBIT_MSB; hspi1.Init.TIMode SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial 10; if (HAL_SPI_Init(hspi1) ! HAL_OK) { Error_Handler(); } }关键参数说明CPOL0, CPHA1这是ADS1220要求的SPI模式NSSSOFT使用软件控制片选Prescaler32在84MHz系统时钟下约1.3MHz兼顾速度和稳定性3.2 差分输入模式配置以下是配置ADS1220为差分输入(AIN0-AIN1)和高增益模式的关键代码void ADS1220_Init(void) { uint8_t config[3] {0}; // 配置寄存器0: AIN0-AIN1差分输入, Gain16, PGA使能 config[0] 0x01; // MUX[2:0]001 (AIN0-AIN1) config[0] | 0x04 3; // GAIN[2:0]100 (G16) config[0] | 0x01 6; // PGA enabled // 配置寄存器1: 20SPS, 连续转换模式 config[1] 0x04; // DR[2:0]100 (20SPS) config[1] | 0x00 3; // MODE0 (连续转换) // 配置寄存器2: 使用内部2.048V基准, 50/60Hz抑制 config[2] 0x00; // VREF00 (内部基准) config[2] | 0x03 2; // 50/60Hz rejection ADS1220_WriteReg(0x40, config, 3); // 从寄存器0开始写入3个字节 }4. 高增益应用中的实用技巧与注意事项在实际项目中除了正确配置差分输入外还需要注意以下关键点才能充分发挥ADS1220的高精度性能。4.1 布局与接地策略高增益模式下任何微小的噪声都会被放大因此PCB设计至关重要星型接地将模拟地、数字地、电源地在一点连接去耦电容在AVDD和AVSS引脚附近放置10μF钽电容0.1μF陶瓷电容信号走线差分对走线等长、等距远离数字信号线和高频信号必要时使用保护环(Guard Ring)4.2 外部滤波电路设计即使ADS1220内部有滤波器外部前端滤波仍然必要信号源 → 10Ω → 1μF → AIN0 │ GND这个简单的RC滤波器(截止频率约16kHz)可以有效抑制高频噪声。注意电阻值不宜过大以免影响信号建立时间电容选择低泄漏的C0G/NP0类型4.3 校准与补偿技术高增益模式下offset和gain error会更加明显建议系统校准零点校准短接输入端读取偏移值满量程校准输入已知参考电压温度补偿ADS1220的偏移和增益会随温度漂移必要时添加温度传感器进行实时补偿// 简单的两点校准示例 float Apply_Calibration(int32_t raw, float offset, float scale) { return ((float)raw - offset) * scale; } // 校准过程 void Perform_Calibration(void) { float V_zero 0.0f; // 短路输入时的理论值 float V_ref 1.024f; // 已知参考电压 int32_t raw_zero ADS1220_ReadData(); int32_t raw_ref ADS1220_ReadData(); float scale V_ref / (raw_ref - raw_zero); float offset raw_zero; // 保存offset和scale到Flash或EEPROM }5. 常见问题排查指南即使按照最佳实践设计实际调试中仍可能遇到各种问题。以下是几个典型场景的排查思路。5.1 读取数据全为0或满量程检查SPI通信确认CS、SCK、DIN、DOUT连接正确用逻辑分析仪验证SPI时序尝试降低SPI速度验证电源AVDD和DVDD电压是否正常基准电压是否稳定检查配置寄存器确保已正确写入配置读取寄存器回读验证5.2 高增益下噪声过大前端信号调理添加适当的低通滤波考虑使用仪表放大器预处理信号电源优化使用LDO而非开关电源增加LC滤波环境因素远离电机、继电器等干扰源必要时使用屏蔽外壳5.3 数据偶尔跳变DRDY信号处理确保在DRDY变低后才读取数据使用中断而非轮询接地环路检查是否有多个接地点传感器与ADC之间使用隔离方案机械振动压电效应可能导致微小信号变化固定好连接器和线缆调试高精度ADC系统就像侦探工作需要仔细观察每一个细节。记得在项目初期就预留足够的测试点这能大大节省后期的调试时间。

更多文章