数据采集卡的精度不仅取决于ADC芯片,还取决于标定方案和参数存储的可靠性。本文解析D223如何通过两点线性插值校准 + FRAM铁电存储,将硬件精度从±0.05%提升到0.01%FSR。
一、精度从哪里来?
D223的精度指标分两个层次[note_244]:
| 硬件精度 | ±0.05% | 出厂状态,未标定 |
| 标定后精度 | 0.01% FSR | 用户执行两点标定后,一段时间内可达 |
AD7606BBSTZ本身是16位ADC,理论分辨率为1/65536 ≈ 0.0015%。但实际系统中,基准电压误差、PCB走线压降、运放偏移等因素会引入系统误差,使硬件精度降低到±0.05%[note_244]。
两点标定的作用就是消除这些系统误差。
二、两点线性插值校准算法
2.1 校准原理
D223采用两点线性插值校准方案[word_4]:
公式: Y = (X – X1) × (Y2 – Y1) / (X2 – X1) + Y1
其中:
- X = 当前ADC读数(数字域)
- X1 = 校准点1数字值(如输入0V时的ADC读数)
- Y1 = 校准点1模拟值(如0V = 0)
- X2 = 校准点2数字值(如输入10V时的ADC读数)
- Y2 = 校准点2模拟值(如10V = 10000000 μV)
2.2 代码实现
double calc_adcCalibData(double data, double d1, double a1,
double d2, double a2) {
double result = (((data – d1) * (a2 – a1)) / (d2 – d1)) + a1;
return result;
}
double getCalibAdcDatas(u8 widthByte, u8 ch, s32 data) {
double adcFloat = 0;
// 检查两点校准是否已配置
if(校准点A使能 && 校准点B使能) {
// 使用用户标定的两点进行线性插值
adcFloat = calc_adcCalibData(data,
_framDatas._adcCalibDatasPointA[ch].calibDigital, // 点1数字值
...);
}
return adcFloat;
}
每个通道独立配置两个校准点(A和B),互不影响[word_4]。
2.3 校准流程
三、FRAM:校准参数的"保险箱"
3.1 为什么用FRAM?
校准参数必须在掉电后不丢失,传统方案用EEPROM或Flash。但D223选择了FRAM(铁电随机存储器)[note_63]。
FRAM相对于EEPROM/Flash的优势[note_249]:
| 写入时间 | <50ns | 5~10ms |
| 写入寿命 | 100亿次(10^10) | 10万~100万次 |
| 写入功耗 | 1.5V低压 | 10-14V高压 |
| 数据撕裂风险 | 无(电能前加载) | 有(写入中断导致部分写入) |
| 读取后恢复 | 需要(读操作可能改变存储状态) | 不需要 |
FRAM的写入速度比EEPROM快1000倍,写入寿命高达100亿次,非常适合频繁更新的校准参数存储[note_249]。
3.2 D223中的FRAM驱动
D223通过SPI3连接FRAM芯片,驱动代码简洁高效[note_63]:
// FRAM写时序:WREN → WRITE → WRDI
void FramWrite(u8* data, u16 addr, u16 len) {
FRAM_CS(0);
HAL_SPI_Transmit(&hspi3, WREN, 1, 100); // 写使能
FRAM_CS(1);
FRAM_CS(0);
HAL_SPI_Transmit(&hspi3, WRITE+addr, 3, 100); // 写命令+地址
HAL_SPI_Transmit(&hspi3, data, len, 100); // 写数据
FRAM_CS(1);
FRAM_CS(0);
HAL_SPI_Transmit(&hspi3, WRDI, 1, 100); // 写禁止
FRAM_CS(1);
}
void FramRead(u8* rdData, u16 addr, u16 len) {
FRAM_CS(0);
HAL_SPI_Transmit(&hspi3, READD+addr, 3, 100); // 读命令+地址
HAL_SPI_Receive(&hspi3, rdData, len, 100); // 读数据
FRAM_CS(1);
}
3.3 FRAM中存储的内容
D223上电时从FRAM加载全部参数[note_63]:
void fram_read_datas(void) {
FramRead((u8*)&_framDatas, FRAM_BASE_ADDR, FRAM_DATA_LENGTH);
// 首次上电检测(软件版本号不匹配则初始化默认值)
if(_framDatas.softVersion != 0x0223) {
_framDatas.softVersion = 0x0223; // D223版本号
_framDatas._adcParam.adc_ch_Enable = 0xff; // 8通道全使能
_framDatas._adcParam.samplingRate = 100000; // 默认100kHz
_framDatas._adcParam.sramRecordMaxTime = 100; // 默认100ms记录时长
// … 初始化校准数据、DAC参数、PWM参数
fram_write_datas(); // 写入FRAM
fram_read_datas(); // 回读验证
}
// 参数范围约束
_framDatas._adcParam.samplingRate = clamp(1, 510000);
_framDatas.dacOutRate = clamp(1000, 10000);
}
FRAM中存储的参数包括[note_63]:
- ADC校准数据(每通道两点)
- ADC采样参数(采样率、量程、通道使能)
- DAC输出参数
- PWM参数
- SRAM记录参数
- 软件版本号(用于首次上电检测)
四、三种存储的协同
D223中实际上使用了三种存储器协同工作[note_137]:
| SRAM | 实时数据缓存、记录仪存储 | 速度快,掉电丢失 |
| FRAM | 校准参数、配置信息 | 非易失,100亿次写入,<50ns写入 |
| Flash | 固件存储 | 大容量,低成本,擦写次数有限 |
系统启动时:CPU从Flash加载固件 → 从FRAM读取校准参数和配置 → SRAM作为运行时缓存[note_137]。
五、标定注意事项
六、总结
D223的精度保障体系是一个完整的闭环:
AD7606BBSTZ硬件精度±0.05% → 两点线性插值校准 → 校准参数存入FRAM → 掉电不丢失 → 标定后精度0.01% FSR
| ADC芯片 | AD7606BBSTZ | 16位,8通道同步 |
| 校准算法 | 两点线性插值 | Y = (X-X1)×(Y2-Y1)/(X2-X1) + Y1 |
| 参数存储 | FRAM铁电存储 | 100亿次写入寿命,<50ns写入 |
| 硬件精度 | 未标定 | ±0.05% |
| 标定后精度 | 两点标定 | 0.01% FSR |
FRAM的100亿次写入寿命和纳秒级写入速度,使得D223可以频繁更新校准参数而不担心存储器磨损——这是EEPROM和Flash无法做到的。
系列完结:本文是D223技术解析系列的最后一篇。五篇文章分别覆盖了架构设计、8通道同步采样、DDS信号发生器、SRAM硬件记录仪、标定系统与FRAM存储,完整呈现了D223从芯片选型到系统实现的技术全貌。
网硕互联帮助中心






评论前必须登录!
注册