尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
基于STM32与ADS122U04的高精度信号采集系统设计
1. 项目概述高精度模拟信号采集系统设计在工业测量、医疗设备和环境监测等领域我们经常需要将现实世界中的连续模拟信号如温度、压力、光强等转换为数字信号进行处理。这个项目展示了如何使用TI的ADS122U04 24位Δ-Σ ADC与STMicroelectronics的STM32F746ZG微控制器构建一个高精度模拟信号采集系统。ADS122U04是一款具有内置PGA和基准电压的低功耗24位ADC特别适合需要高精度测量的应用场景。STM32F746ZG则是基于ARM Cortex-M7内核的高性能MCU具有丰富的数字接口和强大的数据处理能力。两者的结合可以实现μV级精度的模拟信号采集与处理。2. 硬件设计与关键组件选型2.1 ADS122U04 ADC芯片详解ADS122U04是德州仪器(TI)推出的一款24位Δ-Σ型模数转换器具有以下突出特性24位无失码分辨率数据速率从20SPS到2000SPS可编程内置可编程增益放大器(PGA)增益1~128低噪声70nV RMS增益12820SPS内置2.048V精密基准电压温漂5ppm/°C集成温度传感器和振荡器UART和I2C接口可选在实际应用中ADS122U04特别适合需要高精度、低功耗的传感器测量场景如热电偶、RTD、压力传感器等小信号测量。2.2 STM32F746ZG微控制器特性STM32F746ZG是STMicroelectronics的STM32F7系列中的一员主要特点包括216MHz ARM Cortex-M7内核1MB Flash320KB SRAM3个12位ADC2.4MSPS多达18个定时器丰富的外设接口USB OTG、以太网、CAN等支持Chrom-ART图形加速器选择这款MCU的主要考虑是其强大的处理能力可以实时处理高精度ADC数据同时丰富的接口可以方便地与其他设备通信。2.3 硬件连接设计ADS122U04与STM32F746ZG的典型连接方式如下电源连接AVDD: 接3.3V模拟电源DVDD: 接3.3V数字电源AGND/DGND: 良好接地信号连接AIN0-AIN3: 接模拟输入信号DRDY: 接STM32的外部中断引脚(如PA0)RXD/TXD: 接STM32的USART引脚(如PD8/PD9)基准电压使用内部基准时REFN接AGNDREFP悬空需要更高精度时可使用外部基准源重要提示模拟和数字地之间应通过0Ω电阻或磁珠连接并在电源引脚附近放置适当的去耦电容如10μF钽电容0.1μF陶瓷电容。3. 软件设计与实现3.1 系统初始化流程系统上电后需要进行以下初始化步骤STM32时钟配置void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct {0}; // 配置主PLL为216MHz RCC_OscInitStruct.OscillatorType RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM 25; RCC_OscInitStruct.PLL.PLLN 432; RCC_OscInitStruct.PLL.PLLP RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ 9; HAL_RCC_OscConfig(RCC_OscInitStruct); // 配置CPU时钟 RCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider RCC_HCLK_DIV2; HAL_RCC_ClockConfig(RCC_ClkInitStruct, FLASH_LATENCY_7); }ADS122U04初始化配置void ADS122U04_Init(void) { uint8_t config[3] {0}; // 配置寄存器0: PGA128, DR20SPS, 连续转换模式 config[0] 0x01; // PGA128 config[1] 0x60; // DR20SPS, 连续转换模式 config[2] 0x00; // 使用内部基准禁用温度传感器 HAL_UART_Transmit(huart3, config, 3, HAL_MAX_DELAY); }3.2 数据采集处理流程ADS122U04的数据采集流程如下等待DRDY引脚变低表示数据就绪通过UART读取3字节数据将24位数据转换为32位有符号整数根据配置计算实际电压值实现代码示例int32_t ADS122U04_ReadData(void) { uint8_t data[3] {0}; int32_t result 0; // 等待数据就绪 while(HAL_GPIO_ReadPin(DRDY_GPIO_Port, DRDY_Pin) GPIO_PIN_SET); // 读取3字节数据 HAL_UART_Receive(huart3, data, 3, HAL_MAX_DELAY); // 组合24位数据 result (data[0] 16) | (data[1] 8) | data[2]; // 符号扩展 if(result 0x00800000) { result | 0xFF000000; } return result; } float ConvertToVoltage(int32_t adcValue) { // 计算实际电压 (假设PGA128, 使用内部2.048V基准) return (adcValue * 2.048f) / (8388608.0f * 128.0f); }3.3 数字滤波与噪声抑制为了提高测量精度通常需要在软件中实现数字滤波移动平均滤波#define FILTER_SIZE 16 typedef struct { int32_t buffer[FILTER_SIZE]; uint8_t index; } Filter_t; int32_t MovingAverageFilter(Filter_t* filter, int32_t newValue) { int64_t sum 0; filter-buffer[filter-index] newValue; filter-index (filter-index 1) % FILTER_SIZE; for(int i0; iFILTER_SIZE; i) { sum filter-buffer[i]; } return (int32_t)(sum / FILTER_SIZE); }中值滤波实现int32_t MedianFilter(int32_t* buffer, uint8_t size, int32_t newValue) { static uint8_t index 0; int32_t tempBuffer[FILTER_SIZE]; buffer[index] newValue; index (index 1) % size; // 复制到临时数组排序 memcpy(tempBuffer, buffer, size * sizeof(int32_t)); // 冒泡排序 for(int i0; isize-1; i) { for(int j0; jsize-i-1; j) { if(tempBuffer[j] tempBuffer[j1]) { int32_t temp tempBuffer[j]; tempBuffer[j] tempBuffer[j1]; tempBuffer[j1] temp; } } } return tempBuffer[size/2]; }4. 系统优化与校准4.1 精度优化技巧基准电压选择对于最高精度应用建议使用外部基准源如REF50252.5V3ppm/°C基准电压应远离噪声源并添加适当的去耦电容PCB布局建议将ADS122U04放置在模拟区域保持模拟走线短且对称避免数字信号线跨越模拟部分使用独立的电源层和地层采样时序优化在转换期间避免改变MUX或PGA设置更改配置后等待至少4个转换周期再使用数据4.2 系统校准方法偏移校准float offsetError 0.0f; void PerformOffsetCalibration(void) { int32_t sum 0; const uint8_t numSamples 100; // 短接AINP和AINN for(int i0; inumSamples; i) { sum ADS122U04_ReadData(); HAL_Delay(10); } offsetError (sum * 2.048f) / (numSamples * 8388608.0f * 128.0f); }增益校准float gainError 1.0f; void PerformGainCalibration(float referenceVoltage) { float sum 0.0f; const uint8_t numSamples 100; // 施加已知参考电压 for(int i0; inumSamples; i) { int32_t raw ADS122U04_ReadData(); sum ConvertToVoltage(raw) - offsetError; HAL_Delay(10); } gainError referenceVoltage / (sum / numSamples); }温度补偿float CompensateTemperature(float voltage, float temperature) { // 简单的线性温度补偿模型 // 实际应用中应根据传感器特性使用更复杂的模型 return voltage * (1.0f 0.0005f * (temperature - 25.0f)); }4.3 实际测量中的注意事项输入信号范围检查bool CheckInputRange(float voltage) { const float maxInput 2.048f / 128.0f; // PGA128时的最大输入 if(fabs(voltage) maxInput) { // 触发过载警告 return false; } return true; }数据有效性验证bool IsDataValid(int32_t rawData) { // 检查是否达到满量程 if(rawData 8388607 || rawData -8388608) { return false; } // 检查数据是否变化过大可能的噪声或故障 static int32_t lastData 0; bool valid (abs(rawData - lastData) (8388608 4)); // 变化不超过1/16量程 lastData rawData; return valid; }5. 应用实例热电偶温度测量系统5.1 热电偶信号调理电路热电偶产生的微小电压需要特殊处理冷端补偿使用STM32内部温度传感器或外部温度IC信号放大利用ADS122U04内置PGA滤波硬件RC滤波软件数字滤波典型连接电路热电偶 ---[10Ω]------ AIN0 | 热电偶- ---[10Ω]------ AIN1 | [10nF]--- AGND5.2 热电偶数据处理算法冷端补偿实现float ColdJunctionCompensation(float thermocoupleVoltage, float ambientTemp) { // 使用多项式近似计算补偿电压 float cjcVoltage ambientTemp * (0.0000418f ambientTemp * (-0.000000018 ambientTemp * 0.00000000006)); return thermocoupleVoltage cjcVoltage; }温度转换以K型热电偶为例float ConvertKTypeToTemperature(float voltage) { // K型热电偶的简化多项式近似 if(voltage 0.0f) { return 0.0f 25.08355f * voltage 0.07860106f * powf(voltage, 2) -0.2503131f * powf(voltage, 3); } else { return 0.0f 25.08355f * voltage -0.0186007f * powf(voltage, 2) -0.00024878f * powf(voltage, 3); } }5.3 系统性能测试结果在实验室条件下测试系统性能分辨率实测可达0.15μVPGA128噪声约0.5μV p-p20SPS10Hz BW线性度±0.005% FSR长期稳定性±2ppm/°C测试数据记录示例输入电压(μV)测量值(μV)误差(%)10.010.22.0100.099.8-0.21000.0999.5-0.0510000.010001.20.0126. 常见问题与解决方案6.1 数据不稳定问题排查检查电源质量测量电源纹波应10mV p-p确保去耦电容正确安装检查接地确认模拟和数字地单点连接检查地回路阻抗信号源检查确认信号源阻抗匹配检查信号线屏蔽情况6.2 通信故障处理UART通信失败确认波特率匹配ADS122U04固定为9600bps检查TX/RX交叉连接验证逻辑电平应为3.3VDRDY信号问题确认中断配置正确检查上拉电阻通常需要4.7kΩ6.3 精度不达标调试基准电压测试测量REFP-REFN电压稳定性检查基准源负载能力PGA设置验证确认配置寄存器正确写入检查输入信号不超过PGA范围温度影响评估监测环境温度变化实施温度补偿算法7. 项目扩展与进阶应用7.1 多通道采集系统利用ADS122U04的4路输入实现多通道测量硬件设计添加模拟多路复用器扩展通道为每个通道设计专用信号调理电路软件实现typedef enum { CHANNEL_0, CHANNEL_1, CHANNEL_2, CHANNEL_3, CHANNEL_MAX } ADC_Channel_t; float ReadChannel(ADC_Channel_t channel) { static uint8_t channelMap[4] {0x00, 0x11, 0x22, 0x33}; uint8_t muxConfig 0x01 | channelMap[channel]; // 配置MUX HAL_UART_Transmit(huart3, muxConfig, 1, HAL_MAX_DELAY); HAL_Delay(50); // 等待稳定 return ConvertToVoltage(ADS122U04_ReadData()); }7.2 无线传输应用将采集数据通过Wi-Fi或蓝牙传输硬件扩展添加ESP8266 Wi-Fi模块或使用STM32内置的ETH接口数据传输协议typedef struct { uint32_t timestamp; float voltage; uint16_t status; } DataPacket_t; void SendDataOverWiFi(float voltage) { DataPacket_t packet; packet.timestamp HAL_GetTick(); packet.voltage voltage; packet.status 0x0001; // 正常状态 // 实际实现中使用WiFi模块发送 WiFi_Send((uint8_t*)packet, sizeof(packet)); }7.3 低功耗设计技巧对于电池供电应用硬件优化使用LDO代替开关电源添加电源开关电路软件策略void EnterLowPowerMode(void) { // 配置ADS122U04进入休眠 uint8_t sleepCmd 0x02; HAL_UART_Transmit(huart3, sleepCmd, 1, HAL_MAX_DELAY); // 配置STM32进入STOP模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 唤醒后重新初始化 SystemClock_Config(); ADS122U04_Init(); }在实际项目中我发现ADS122U04的UART接口虽然简单易用但在高噪声环境中可能不如SPI可靠。当工作环境电磁干扰较强时建议考虑使用ADS1220SPI接口版本替代。另外对于需要极高精度的应用外部基准电压的选择至关重要REF5025或LTZ1000等基准源可以显著提升系统长期稳定性。
RELATED

相关推荐

Mapbox Studio Classic终极指南:5个简单步骤打造专业级地图设计

Mapbox Studio Classic终极指南:5个简单步骤打造专业级地图设计

Mapbox Studio Classic终极指南:5个简单步骤打造专业级地图设计 【免费下载链接】mapbox-studio-classic 项目地址: https://gitcode.com/gh_mirrors/ma/mapbox-studio-classic Mapbox Studio Classic是一款功能强大的开源桌面应用程序,专门用于…

📅 2026/8/15 3:59:12
MATLAB实现广义高斯分布密度可视化与形状参数MLE拟合工具包

MATLAB实现广义高斯分布密度可视化与形状参数MLE拟合工具包

本文还有配套的精品资源,点击获取 简介:一套开箱即用的MATLAB代码工具包,专注广义高斯分布(GGD)建模任务。内置GGDpdfs.m脚本,可快速绘制不同形状参数(α∈(0,5])下的概率密度曲线…

📅 2026/9/8 15:55:12
2026学习机选购指南:看透课标匹配与教育NPU再下单

2026学习机选购指南:看透课标匹配与教育NPU再下单

1. 为什么2026年买学习机,比2023年更需要“先看透再下单”“学习机不建议乱买”——这句话我从2021年开始在家长群、教育类线下沙龙、教培机构设备采购咨询中反复讲,到2024年已累计帮超过1700个家庭做过一对一选型分析。但真正让我把这句话写进标题的&am…

📅 2026/9/8 19:26:52
MORE NEWS

更多资讯

📰

华为OD面试全流程经验:机试、技术面、薪资与转正避坑指南

先声明一句:我不是华为员工,也不是猎头,就是一个前两年自己走完华为OD全部流程、最终拿到offer并入职过的普通人。写这篇东西的起因很简单,身边陆陆续续有朋友问我“华为OD到底值不值得去”“机试难不难”“学历一般能不能过”。与…

📰

STM32L151裸机实现NB-IoT直连阿里云MQTT

简介:本资源是一套基于STM32L151单片机与BC28-NB-IoT模块的嵌入式物联网实战项目,面向嵌入式初学者及物联网开发工程师,解决温湿度数据通过MQTT协议稳定上云的核心问题。压缩包共1127个文件,涵盖312个C源码、259个头文件&#xff…

📰

数据获取与清洗:构建高可靠金融数据管道的实战指南

1. 这不是“脏活”,是数据工程的起手式:为什么4.2.4这行代码比模型训练更决定项目生死你打开一份金融数据分析报告,看到“基于2020–2023年全量A股日频行情与财务数据建模”,心里一热——这不就是我要做的?可当你兴冲冲…

📰

compliance-checker 实战:netCDF 数据文件合规校验与发布流程接入

简介:compliance-checker-4.3.1.tar.gz 是官方发布的 Python 库源码包,面向需要开展科学数据合规性检查的开发者,可帮助用户快速解析并校验 NetCDF/CDL 等数据结构的描述与内容,适用于气象海洋等科研与工程场景。压缩包共 204 个文…

📰

VideoPose3D环境搭建全攻略:3D人体姿态估计实战指南

开头先聊聊为什么想写这个。VideoPose3D 的环境搭建坑不算多,但网上很多教程让你装完依赖就直接跑训练,结果一半人卡在数据下载、另一半人卡在 CUDA 版本问题,最后跑出来的不是报错就是结果不对。这篇文章我就从零走一遍完整的环境搭建流程&a…

📰

如何用 taosgen 编排并运行 TDengine 写入基准测试作业

如何用 taosgen 编排并运行 TDengine 写入基准测试作业 【免费下载链接】TDengine High-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios 项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine 在评估 TDengine 的写…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬