基于STM32F103软件SPI实现ADS1220高精度数据采集与配置优化

张开发
2026/4/21 8:32:12 15 分钟阅读

分享文章

基于STM32F103软件SPI实现ADS1220高精度数据采集与配置优化
1. ADS1220芯片与STM32F103的黄金组合在工业测量和传感器信号采集领域ADS1220这颗24位高精度ADC芯片可以说是性价比极高的选择。我去年在一个热电偶温度监测项目中使用它时实测噪声水平能控制在2μV以内这对于需要检测微小电压变化的场景简直是神器。而STM32F103作为经典Cortex-M3内核MCU虽然硬件资源有限但通过软件SPI驱动ADS1220的方案既节省硬件成本又保持灵活性。ADS1220最让我惊喜的是其内置的可编程增益放大器(PGA)最高支持128倍增益。这意味着当测量RTD电阻这类微弱信号时不再需要外置运放电路。记得第一次测试时我用它直接连接PT100铂电阻配合内部2.048V基准温度分辨率轻松达到0.01℃级别。芯片还集成了温度传感器和激励电流源一个芯片就能搞定传统需要多颗IC才能实现的信号链。2. 软件SPI驱动的实现要点2.1 引脚配置与初始化在STM32F103上实现软件SPI首先要规划好引脚分配。我的经验是尽量选择相邻GPIO方便统一初始化。以下是典型的引脚配置// PB0作为DRDY中断输入 // PB1作为片选CS // PA5模拟MOSI // PA6模拟SCK // PA7模拟MISO初始化时要特别注意GPIO模式设置。MOSI和SCK必须配置为推挽输出而MISO需要上拉输入模式。这里有个坑我踩过如果MISO配置为浮空输入在长导线连接时容易受到干扰导致数据错误。上拉电阻能显著提高信号稳定性。2.2 关键时序模拟软件SPI最核心的就是时序模拟。ADS1220的SPI接口支持模式1(CPOL0, CPHA1)即时钟空闲时为低电平在第二个边沿采样数据。实测发现在72MHz主频的STM32F103上每个时钟周期保持5μs以上最可靠。以下是写一个字节的典型实现void WriteByte(uint8_t cmd) { for(uint8_t i0; i8; i) { (cmd 0x80) ? MOSI_H : MOSI_L; delay_us(2); // 保持建立时间 SCK_H; cmd 1; delay_us(3); // 保持时钟高电平时间 SCK_L; delay_us(2); // 保持时钟低电平时间 } }特别注意CS信号的处理。每次传输前后要有至少500ns的建立和保持时间否则容易导致命令识别错误。我在调试时用逻辑分析仪抓取波形发现如果CS变化太快ADS1220偶尔会丢失第一个时钟边沿。3. 寄存器配置优化技巧3.1 传感器类型适配配置不同传感器需要不同的配置策略。以常见的PT100和K型热电偶为例RTD电阻测量配置使用内部IDAC输出1mA激励电流选择差分输入(AIN0-AIN1)PGA增益设为32倍数据速率设为20SPS启用50Hz/60Hz工频抑制热电偶测量配置选择单端输入(AIN0-AVSS)禁用PGA(设置PGA_BYPASS1)数据速率提高到90SPS使用内部温度传感器做冷端补偿3.2 低噪声配置实践要获得最佳噪声性能有几个关键点在config寄存器中启用FIR滤波器(FIR_MODE1)对于静态测量使用单次转换模式(ConverMode_0)适当降低数据速率能显著改善噪声性能基准电压选择内部2.048V最稳定实测发现当配置为PGA128、20SPS、FIR滤波时有效分辨率能达到22位以上。这时基准电压的稳定性就成为关键如果使用外部基准建议选择LDO供电而非开关电源。4. 数据采集与处理实战4.1 数据读取流程优化标准的读取流程是等待DRDY变低(数据就绪)发送RDATA命令(0x10)连续读取3个字节组合成24位数据但实际应用中我发现更可靠的流程是uint32_t ReadADC() { while(DRDY_IS_HIGH); // 等待就绪 CS_LOW; WriteByte(0x10); // RDATA命令 uint8_t b1 ReadByte(); uint8_t b2 ReadByte(); uint8_t b3 ReadByte(); CS_HIGH; return ((uint32_t)b116) | (b28) | b3; }4.2 数据校准与补偿高精度测量必须考虑校准。我通常采用两点校准法短接输入端读取零点偏移值输入已知电压读取满量程值计算校准系数float scale (known_voltage) / (raw_fullscale - raw_zero);对于热电偶应用还需要冷端补偿。ADS1220内置的温度传感器精度约±1℃可以通过读取其值并查表补偿float ReadInternalTemp() { // 配置为温度传感器模式 WriteRegister(0, 0x02); delay_ms(100); uint32_t raw ReadADC(); return (raw / 32.0f); // 每LSB对应32°C }5. 常见问题排查指南5.1 数据不稳定的解决方案如果发现读数跳动大建议按以下步骤排查检查电源质量AVDD引脚最好加10μF0.1μF去耦电容降低SPI时钟速度到100kHz以下尝试不同的滤波器设置检查PCB布局模拟和数字地要单点连接5.2 典型错误代码分析现象读取值始终为0可能原因CS信号时序问题或DRDY未正确连接解决方案用逻辑分析仪检查SPI波形现象数据明显偏小可能原因PGA配置错误或基准电压选择不当解决方案检查CONFIG0寄存器设置现象偶尔出现错误数据可能原因电源噪声或SPI时序不稳定解决方案增加数据传输间的延时在最近的一个工业现场项目中我们遇到ADS1220偶尔会死机的问题。后来发现是现场电机启停导致电源波动在AVDD引脚增加TVS二极管后问题彻底解决。这也提醒我们高精度ADC设计必须重视电源完整性。

更多文章