STM32G491RE与AD7490实现高速高精度数据采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和测试测量等领域模拟信号的快速数字化一直是关键需求。传统方案往往面临采样速率不足、精度受限或系统复杂度高等问题。AD7490这款16位高速ADC与STM32G491RE这款高性能MCU的组合恰好能解决这些痛点。AD7490是ADI公司推出的16位逐次逼近型(SAR)ADC最高采样率可达1MSPS支持±10V宽输入范围。STM32G491RE则是ST推出的Cortex-M4内核MCU主频170MHz内置数学加速器特别适合实时信号处理。这对组合能以较低成本实现高精度、高速度的数据采集系统。2. 硬件设计与接口连接2.1 关键器件选型考量选择AD7490主要基于三个因素首先其16位分辨率能满足大多数工业场景的精度需求其次1MSPS的采样率足以捕捉kHz级别的信号变化最后它支持SPI接口与STM32的硬件兼容性好。STM32G491RE则因其内置FPU和ART加速器能高效处理ADC数据流。2.2 硬件连接细节AD7490与STM32G491RE通过SPI接口连接具体引脚配置如下AD7490引脚STM32引脚功能说明SCLKPA5SPI时钟SDIPA7数据输入SDOPA6数据输出CONVSTPB0转换启动CSPA4片选信号注意AD7490的REFIN/REFOUT引脚需连接2.5V精密基准源这是保证精度的关键。推荐使用ADR425等低噪声基准芯片。3. 软件驱动实现3.1 SPI接口配置在STM32CubeIDE中配置SPI1为全双工主模式时钟极性低电平相位第1个边沿8位数据帧分频系数设为4对应42.5MHz SPI时钟hspi1.Instance SPI1; hspi1.Init.Mode SPI_MODE_MASTER; hspi1.Init.Direction SPI_DIRECTION_2LINES; hspi1.Init.DataSize SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity SPI_POLARITY_LOW; hspi1.Init.CLKPhase SPI_PHASE_1EDGE; hspi1.Init.NSS SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_4; hspi1.Init.FirstBit SPI_FIRSTBIT_MSB; hspi1.Init.TIMode SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation SPI_CRCCALCULATION_DISABLE;3.2 数据采集流程完整的采集流程包括四个步骤拉低CONVST引脚启动转换等待BUSY信号变低约650ns通过SPI读取16位数据处理数据并准备下次采集典型代码如下void AD7490_Read(uint16_t *data) { HAL_GPIO_WritePin(CONVST_GPIO_Port, CONVST_Pin, GPIO_PIN_RESET); while(HAL_GPIO_ReadPin(BUSY_GPIO_Port, BUSY_Pin) GPIO_PIN_SET); HAL_SPI_Receive(hspi1, (uint8_t*)data, 2, 100); *data (*data) 4; // 数据右移4位对齐 }4. 性能优化技巧4.1 DMA传输配置要实现1MSPS的持续采样必须使用DMA。配置SPI的DMA通道为循环模式内存地址递增hdma_spi1_rx.Instance DMA1_Channel1; hdma_spi1_rx.Init.Direction DMA_PERIPH_TO_MEMORY; hdma_spi1_rx.Init.PeriphInc DMA_PINC_DISABLE; hdma_spi1_rx.Init.MemInc DMA_MINC_ENABLE; hdma_spi1_rx.Init.PeriphDataAlignment DMA_PDATAALIGN_BYTE; hdma_spi1_rx.Init.MemDataAlignment DMA_MDATAALIGN_BYTE; hdma_spi1_rx.Init.Mode DMA_CIRCULAR; hdma_spi1_rx.Init.Priority DMA_PRIORITY_HIGH;4.2 定时器触发采样使用TIM2定时器产生1MHz的触发信号确保采样间隔精确htim2.Instance TIM2; htim2.Init.Prescaler 170-1; // 1MHz时钟 htim2.Init.CounterMode TIM_COUNTERMODE_UP; htim2.Init.Period 1-1; // 1us周期 htim2.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload TIM_AUTORELOAD_PRELOAD_DISABLE;5. 实际应用中的问题排查5.1 信号完整性问题在初期测试中发现当采样率超过500kSPS时数据出现跳变。通过示波器检查发现SPI时钟信号存在振铃。解决方案包括缩短走线长度至3cm以内在SCLK线上串联33Ω电阻在靠近ADC端放置0.1μF去耦电容5.2 基准电压稳定性当环境温度变化时发现ADC的零点漂移达5LSB。改用ADR445基准源温漂3ppm/℃后漂移控制在1LSB以内。同时需注意基准芯片的负载调整率建议驱动电流不超过5mA。6. 系统校准与数据处理6.1 两点校准法为提高精度需进行偏移和增益校准输入0V时读取代码Code_zero输入满量程时读取Code_full实际电压计算V (Raw_Code - Code_zero) * (V_ref / (Code_full - Code_zero))6.2 数字滤波实现在STM32上实现移动平均滤波窗口大小建议8点#define FILTER_SIZE 8 uint16_t filter_buffer[FILTER_SIZE]; uint8_t filter_index 0; uint16_t Moving_Average(uint16_t new_sample) { filter_buffer[filter_index] new_sample; filter_index (filter_index 1) % FILTER_SIZE; uint32_t sum 0; for(uint8_t i0; iFILTER_SIZE; i) { sum filter_buffer[i]; } return (uint16_t)(sum / FILTER_SIZE); }7. 扩展应用场景这套方案特别适合以下场景工业振动监测采样率足够捕捉机械振动特征医疗ECG采集16位精度满足微弱信号需求自动化测试设备SPI接口便于系统集成在实际的电机控制项目中我们用它来采集三相电流通过Park/Clarke变换实现了精确的FOC控制。相比传统12位ADC方案电流测量分辨率提升了16倍显著改善了低速控制性能。