ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

D223 ADC数据处理流水线:从原始采样值到工程单位的完整转换链

2026/8/14 14:41:34 拓冰建站 浏览量
D223 ADC数据处理流水线:从原始采样值到工程单位的完整转换链 一颗ADC芯片输出的只是数字编码如何把它变成用户看得懂的电压值本文从代码层面完整解析D223的ADC数据处理流水线原始值→滑动平均→量程转换→校准插值→工程单位。一、数据处理流水线总览D223的ADC数据从硬件到用户显示经过以下完整流水线[word_4][note_63]AD7606原始16位数据 │ ├── 256点滑动平均滤波 │ ├── 16位均值 → getAdcFilter16[] │ └── 24位累加和 → getAdcFilter24[] │ ├── 量程转换±5V / ±10V │ ├── 16位 → mV │ ├── 24位 → μV │ └── 电流模式 → μA │ ├── 两点线性插值校准 │ └── 消除系统误差 │ ├── 校正系数与零点偏移 │ └── 微调 │ └── 传感器单位转换 └── V, mV, A, mA, ℃, N, kg, Pa ...二、Step 1256点滑动平均滤波2.1 数据结构D223的ADC数据缓冲区[word_4]u16 getAdc_Buf256[8][256];// 8通道×256点滑动窗口u16 getAdcFilter16[8];// 16位滤波值u32 getAdcFilter24[8];// 24位精度提升值u16 getAdc_Buf200[8][200];// 波形显示缓存u16 getAdc_Buf1000[8][1000];// 连续数据读取缓存2.2 滑动平均算法每收到一次新的ADC采样数据进入滑动窗口计算256点累加和[word_4]voidmodbus_getDeviceDatas(void){for(u8 i0;i8;i){// Step1: 256点滑动平均u32 sumTotal0;for(u16 j0;j256;j)sumTotal_uadc.getAdc_Buf256[i][j];_uadc.getAdcFilter16[i]sumTotal/256;// 16位均值_uadc.getAdcFilter24[i]sumTotal;// 24位累加和不除}}2.3 为什么不除以256就能得到24位这是整个流水线中最精妙的设计[word_4]AD7606是16位ADC单次采样值范围0~655352^16256个采样值累加最大 65535 × 256 16,776,960 ≈ 2^24累加结果不除以256直接保留24位精度效果16位均值sumTotal / 256范围0~65535精度±1 LSB24位累加sumTotal范围0~16,776,960精度提升到±1/256 LSB有效位数ENOB提升约4位log2(256) 8实际约4位有效提升信噪比提升约24dB关键24位精度不是ADC硬件直接给出的而是通过256次过采样累加获得的。代价是采样率降低256倍——以时间换精度[word_4]。2.4 滤波效果256点滑动平均等效于一个低通FIR滤波器截止频率约为采样率/512对白噪声的抑制20×log10(√256) 24dB对50Hz工频干扰也有一定抑制效果三、Step 2量程转换3.1 ±10V量程转换AD7606在±10V量程下的数据编码[word_4]ADC原始值对应电压0x0000 (0)-10V0x8000 (32768)0V0xFFFF (65535)10V16位转换公式[word_4]// ±10V量程int16 adc16(int16)_uadc.getAdcFilter16[i]-32768;// 去偏置_modbus._inputReg.adc_mV_Data16[i]adc16/3.2768;// → mV// 3.2768 32768 / 10000满量程10V 10000mV24位转换公式[word_4]// ±10V量程int32 adc24(int32)_uadc.getAdcFilter24[i]-8388608;// 去偏置_modbus._inputReg.adc_uV_Data24[i]adc24/0.8388608/10;// → μV// 8388608 2^2324位中位值// 0.8388608 8388608 / 100000003.2 ±5V量程转换±5V量程下系数相应调整[word_4]// ±5V量程// 16位: 系数 6.5536 32768 / 5000// 24位: 系数 1.6777216 8388608 / 50000003.3 上位机端的转换C#上位机中的24位ADC数据转换[word_3]// Setting.csif(_prxData.adcRange1)// ±5V量程value(SWAPS32(adcValue)-8388608)/83886.08/10;else// ±10V量程value(SWAPS32(adcValue)-8388608)/167772.16/10;// 8388608 2^23, 24位ADC中位值3.4 Modbus寄存器编码D223/G511的Modbus寄存器中24位ADC原始值用两个16位寄存器表示[word_17]量程0x0000000x008000000x00FFFFFF±5V-5V0V5V±10V-10V0V10V3.5 电流信号转换当信号类型为电流时通过240Ω取样电阻将电流转换为电压[word_4]// 电流模式4-20mA环路240Ω取样电阻_modbus._inputReg.adc_uA_Data16[i]adc16/3.2768/240*1000;// → μA转换链ADC数字值 → mV电压 → ÷240Ω × 1000 → μA电流[word_4]。四、Step 3两点线性插值校准4.1 校准公式两点线性插值是D223校准的核心算法[word_4][word_3]doublecalc_adcCalibData(doubledata,doubled1,doublea1,doubled2,doublea2){return(((data-d1)*(a2-a1))/(d2-d1))a1;}参数说明[word_4]data当前ADC原始数字量d1, a1校准点A的数字量和模拟量d2, a2校准点B的数字量和模拟量4.2 校准执行流程固件中的校准执行[word_4]doublegetCalibAdcDatas(u8 widthByte,u8 ch,s32 data){doubleadcFloat0;if(校准点A使能校准点B使能){// 使用用户标定的两点进行线性插值adcFloatcalc_adcCalibData(data,_framDatas._adcCalibDatasPointA[ch].calibDigital,_framDatas._adcCalibDatasPointA[ch].calibAnalog,_framDatas._adcCalibDatasPointB[ch].calibDigital,_framDatas._adcCalibDatasPointB[ch].calibAnalog);adcFloat*0.00001;// 缩放到实际工程单位}else{// 使用默认理想转换曲线无校准if(±10V量程)adcFloatdata*10.0/8388608.0-10.0;// 24位elseadcFloatdata*5.0/8388608.0-5.0;// 24位}returnadcFloat;}4.3 校准参数存储每通道独立存储两组校准数据[word_7]// C#上位机中的校准参数结构publicstaticInt32[]calib_adcCalib_digitalAnew Int32[8];// A点数字量publicstaticInt32[]calib_adcCalib_analogAnew Int32[8];// A点模拟量(×100000)publicstaticbyte[]calib_adcCalib_enableAnew byte[8];// A点使能publicstaticInt32[]calib_adcCalib_digitalBnew Int32[8];// B点数字量publicstaticInt32[]calib_adcCalib_analogBnew Int32[8];// B点模拟量publicstaticbyte[]calib_adcCalib_enableBnew byte[8];// B点使能publicstaticInt32[]correctFactornew Int32[8];// 校正系数(×100000)publicstaticInt32[]calibZeronew Int32[8];// 零点偏移(×100000)模拟量乘以100000存储为整数避免浮点运算精度损失[word_7]。4.4 校正系数与零点偏移在两点校准之后还叠加校正系数和零点偏移[word_4]adcFloatadcFloat*(correctFactor*0.00001)(calibZero*0.00001);correctFactor乘法校正系数默认100000即1.0calibZero加法零点偏移默认0五、Step 4传感器单位转换5.1 支持的传感器单位D223支持以下传感器单位[word_3][word_6]类别单位电压V, mV电流A, mA温度℃, m℃, ℉力/重量N, kg, g转速G, K, mK压力MPa, kPa, hPa, Pa共17种预置单位[word_3]。注意D223支持最大256个自定义单位可以任意修改[note_259]。这意味着用户可以根据实际传感器定义任意工程单位。5.2 上位机单位选择C#上位机中每个通道可以独立选择传感器单位[word_6]publicstaticbyte[]sensorUnitnewbyte[8];// 每通道单位索引publicstaticstring[]sensorUnitList{V,mV,A,mA,℃,m℃,N,kg,g,G,K,mK,MPa,kPa,hPa,Pa,℉};六、完整转换示例示例±10V量程下测量1V电压假设AD7606输出16位原始值 39322对应约1V[word_5]Step1: 256点滑动平均 假设256次采样的累加和 39322 × 256 10,066,432 getAdcFilter16 10,066,432 / 256 39322 (16位均值) getAdcFilter24 10,066,432 (24位累加和) Step2: 量程转换±10V 16位mV值 (39322 - 32768) / 3.2768 6554 / 3.2768 2000 mV 2V 24位μV值 (10066432 - 8388608) / 0.8388608 / 10 1677824 / 8.388608 200000 μV 0.2V 注意这里的示例假设了理想线性实际值取决于信号和噪声 Step3: 两点校准假设已标定 校准点A: d132768, a10V0V输入时的ADC值 校准点B: d265535, a210V10V输入时的ADC值 校准值 (39322 - 32768) × (10 - 0) / (65535 - 32768) 0 2.003V Step4: 单位转换 传感器选择V → 显示 2.003 V 传感器选择mV → 显示 2003 mV七、精度层次总结D223的ADC数据处理实现了多层精度保障[word_4][note_244]层次方法精度AD7606硬件16位SAR ADC±0.5 LSB INL/DNL256点过采样软件滑动平均24位等效精度量程转换数学运算无损浮点计算两点校准线性插值消除系统误差校正系数乘法加法微调微米级微调硬件精度未标定±0.05%标定后精度两点标定0.01% FSR八、与其他型号的数据处理对比特性DABL7606DABL-G511DABM-D223过采样方式256点滑动平均256点滑动平均256点滑动平均精度模式16位/24位16位/24位16位/24位校准方式两点线性插值两点线性插值两点线性插值参数存储FRAMFRAMFRAM自定义单位17种预置17种预置256种自定义数据流SPI1 DMA直读SPI1 DMA直读QSPI四线DMA三款产品的数据处理算法基本一致核心差异在于数据传输通道——D223通过QSPI四线DMA读取FPGA FIFO带宽远高于SPI1直读[note_63]。九、总结D223的ADC数据处理流水线是一个从硬件到软件、从原始值到工程值的完整转换链AD7606 16位原始值 ↓ 256点滑动平均8位精度 24位累加值 ↓ 量程转换±5V/±10V → mV/μV 工程电压值 ↓ 两点线性插值消除系统误差 校准电压值 ↓ 校正系数 零点偏移微调 最终电压值 ↓ 传感器单位转换V/mV/℃/Pa... 用户显示值每一步都有明确的数学公式和代码实现整个流水线透明可控便于用户理解和定制。下篇预告《D223上位机C#开发实战从帧解析到波形显示的完整实现》