工业传感器高精度采集编程:24位ADC下实现毫伏级信号的稳定采样
24位ADC最容易被误读成“满量程/1677万=分辨率到手”。实际工业现场,毫伏级信号(热电偶、应变桥、RTD压差)跑在24位Σ-Δ上,有效稳定位往往只有18~21位,剩下低位在跳——这不是芯片坏,是噪声底、参考源漂移、前端放大和PCB布局共同吃掉了解析度。
一、先定信号链,再谈代码
毫伏信号直接进ADC是浪费动态范围。0~100mV进2.5V参考ADC,只用满量程4%。正确链路:
传感器差分输出 → 仪表放大(INA) → RC抗混叠 → 24位ADC → MCU滤波
仪表放大做共模抑制,增益抬到ADC输入区的50%~80%
差分输入走双绞屏蔽线,屏蔽层单端接地
ADC前端加RC低通,截止频率按输出速率一半取
VREF用外部低噪声基准(如REF5025),别用AVDD分压凑
模拟地/数字地单点相连,去耦电容紧贴引脚
软件救不了“前端先在噪声里泡过”的采样。
二、ADC配置:低速+差分+SYNC时序
以ADS1256类为例,毫伏慢变信号别开高速率,10SPS对应50Hz陷波,工频抑制最稳。
void adc_init(void){
write_reg(0x00,0x00); // STATUS清默认
write_reg(0x01,0x10); // MUX:AIN0-AIN1差分
write_reg(0x02,0x20); // PGA=1
write_reg(0x03,0x04); // DRATE=10SPS
send_cmd(CMD_SYNC); // 配置后必须SYNC
delay_us(1);
send_cmd(CMD_WAKEUP);
}
读数据前必须等DRDY拉低,否则拿到的是上一轮旧转换:
int32_t adc_read(void){
while(gpio_read(DRDY)); // 等转换完成
send_cmd(0x01); // RDATAC
uint8_t b[3]={spi_rw(0),spi_rw(0),spi_rw(0)};
send_cmd(0x00); // 退出连续读(按芯片手册)
int32_t v = ((int32_t)b[0]<<16)|(b[1]<<8)|b[2];
if(v & 0x800000) v -= 0x1000000; // 24位补码符号扩展
return v;
}
换通道顺序按手册来:DRDY低→改MUX→SYNC→读旧数据,别在转换中途切通道。
三、软件滤波:平均+去抖,不迷信“24位”
低位跳动是正常的。处理原则:
随机噪声→滑动平均/过采样有效
零点漂移→平均救不了,要校准
工频周期干扰→采样窗口取20ms整数倍
#define N 16
static int32_t buf[N];
static uint8_t idx;
int32_t adc_filter(int32_t raw){
buf[idx]=raw; idx=(idx+1)%N;
int64_t sum=0;
for(int i=0;i<N;i++) sum+=buf[i];
return (int32_t)(sum/N);
}
更稳一点用“去极值平均”:去掉最大最小再平均,抗单次尖峰。输出前做零点校准:
static int32_t zero_offset;
void adc_cal_zero(void){
zero_offset = adc_filter(adc_read()); // 输入短接时采
}
int32_t adc_value(void){
return adc_filter(adc_read()) - zero_offset;
}
上电前几十个采样丢掉,参考源和PGA没稳。
四、增益与参考源才是精度天花板
代码再细也补不回这两处:
参考电压温漂:基准漂1ppm/℃在2.5V下就是2.5μV/℃,毫伏信号直接被带偏
PGA增益过高:小信号放大同时把失调放大,零点校准入固件
电源纹波:AVDD纹波经PSRR漏进ADC,LDO单独供模拟侧
RTD/电桥类建议比率测量:激励源和VREF同源,激励波动在比值里抵消。
五、落坑清单
以为24位输出=24位有效→低位狂跳
毫伏信号不放大直接采→只用满量程几个百分点
MUX切换不SYNC→通道串扰
DRDY没等就读→旧数据错位
三字节不符号扩展→负输入变巨数
只做平均不做零点校准→温漂累积
VREF用AVDD分压→基准噪声吃掉小信号
模拟数字地割开不连→ADC参考地飘
10kSPS采温度→工频噪声全进来
上电立刻采→前几百点漂移
六、落地顺序
仪表放大把mV抬到ADC区间50~80%
差分输入+屏蔽线+RC前端滤波
ADC配差分MUX、低速(10~50SPS)、外部VREF
DRDY中断取数,补码符号扩展
滑动平均/去极值,窗口取工频周期整数倍
上电短接输入做零点校准,存NV
定时重校零点或温度补偿修正漂移
串口/Modbus输出前做单位换算
毫伏级稳定采样不是“ADC位数拉满”,是前端把信号抬干净、参考源别漂、采样率别贪快、软件只做平均和校准。24位的价值在过采样换低噪声,不在最后几位真的稳定——工程上先看数据手册“有效分辨率”那张表,再决定滤波深度;参考源和地线没做对,代码平均到256点也还是跳。





