1. AD7490与STM32F091RC的硬件协同设计AD7490是一款12位高速低功耗SAR型ADC最高采样率可达1MSPS。在实际项目中我选择这款芯片主要基于三个考量首先它的并行接口模式可以直接与STM32的FSMC总线对接省去额外的电平转换电路其次内置的2.5V基准电压源精度达到±1mV能满足大多数工业场景需求最后其功耗曲线在1MSPS全速运行时仅消耗3.5mA电流非常适合电池供电设备。STM32F091RC的FSMCFlexible Static Memory Controller配置是关键所在。这里有个细节需要注意FSMC默认的地址数据复用模式在访问AD7490时需要特别处理。我的做法是在CubeMX中将Bank1设置为NOR Flash/PSRAM模式具体参数如下hsram1.Instance FSMC_NORSRAM_DEVICE; hsram1.Extended FSMC_NORSRAM_EXTENDED_DEVICE; hsram1.Init.NSBank FSMC_NORSRAM_BANK1; hsram1.Init.DataAddressMux FSMC_DATA_ADDRESS_MUX_DISABLE; hsram1.Init.MemoryType FSMC_MEMORY_TYPE_SRAM;硬件连接上有个容易踩的坑是信号完整性处理。AD7490的CONVST转换启动信号必须用50Ω阻抗匹配否则在1MSPS速率下会出现边沿振铃。我在实际PCB布局时采用了以下方案使用4层板设计单独划分模拟地层CONVST信号走线长度控制在50mm以内在STM32输出端串联33Ω电阻在AD7490输入端并联10pF电容到地2. 低噪声模拟前端设计要点很多工程师忽略了一个事实ADC的性能上限90%取决于模拟前端设计。在采集低频信号100kHz时我推荐使用这种抗混叠滤波器结构信号源 → 100Ω限流电阻 → AD8021运放(单位增益缓冲) → 2阶巴特沃斯LPF(fc200kHz) → AD7490输入运放选型有个经验公式运放的建立时间必须小于1/(2×ADC采样周期)。对于1MSPS采样率AD8021的600ns建立时间完全够用。但要注意其输入偏置电流会引入直流误差解决方法是在运放输入端到地接10kΩ电阻提供泄放通路。基准电压的处理更考验细节功夫。虽然AD7490内置基准但在多通道采样时我建议外接REF1955V基准源通过电阻分压获得2.5V参考电压。这样做的优势是降低通道间串扰提高温度稳定性外置基准温漂通常优于5ppm/℃方便系统校准可通过调整分压电阻微调量程3. STM32的DMA传输优化技巧要实现真正的快速转换必须用好DMA控制器。STM32F091RC的DMA1通道1支持从FSMC到内存的数据搬运配置时要注意三个关键点数据宽度匹配AD7490输出是12位数据但FSMC接口是16位总线。需要设置DMA的源数据宽度为HalfWord目标宽度为Word并在内存中定义uint16_t数组接收数据。循环模式下的中断处理建议使用DMA半传输和全传输中断而不是每个数据都触发中断。我的典型配置如下hdma_adc.Init.Mode DMA_CIRCULAR; hdma_adc.Init.PeriphInc DMA_PINC_DISABLE; hdma_adc.Init.MemInc DMA_MINC_ENABLE; hdma_adc.Init.PeriphDataAlignment DMA_PDATAALIGN_HALFWORD; hdma_adc.Init.MemDataAlignment DMA_MDATAALIGN_WORD; hdma_adc.Init.Priority DMA_PRIORITY_HIGH;内存对齐优化将DMA目标缓冲区定义在CCM RAM中能减少总线冲突。实测表明使用__attribute__((aligned(32)))定义缓冲区可使传输效率提升15%__attribute__((aligned(32))) uint16_t adc_buffer[1024];4. 采样时序的精确控制AD7490的转换时序需要精确协调CONVST和RD信号。通过分析芯片手册的时序图我总结出这个最佳操作序列拉低CONVST至少20ns启动转换等待BUSY信号变高表示转换开始BUSY变低后延迟10ns再发出RD脉冲RD脉冲宽度必须大于15ns在STM32中我用TIM1的OC1输出产生CONVST信号配置为PWM模式1关键参数计算如下htim1.Instance TIM1; htim1.Init.Prescaler 0; htim1.Init.CounterMode TIM_COUNTERMODE_UP; htim1.Init.Period SystemCoreClock/1000000 - 1; // 1MHz时钟 htim1.Init.RepetitionCounter 0;对于需要严格等间隔采样的应用建议启用HRTIM高分辨率定时器触发ADC。我在电机控制项目中实测发现使用HRTIM比普通定时器的时序抖动降低了一个数量级从50ns降至5ns。5. 数据处理与校准实战原始ADC数据需要经过三个处理阶段才能获得精确结果偏移校准在输入端短路时记录1000个样本的平均值作为零偏增益校准输入精确的2.4V基准电压调整斜率系数非线性校正采用分段线性插值法在0.5V、1V、1.5V、2V设置校准点我的校准函数实现如下float ADC_Calibrate(uint16_t raw) { static const float cal_points[] {0.5f, 1.0f, 1.5f, 2.0f}; static const uint16_t adc_values[] {820, 1638, 2456, 3274}; if(raw adc_values[0]) { return (raw - offset) * cal_points[0] / adc_values[0]; } for(int i1; i4; i) { if(raw adc_values[i]) { float segment_gain (cal_points[i]-cal_points[i-1])/(adc_values[i]-adc_values[i-1]); return cal_points[i-1] (raw-adc_values[i-1])*segment_gain; } } return 2.0f (raw-adc_values[3])*(3.3f-2.0f)/(4095-adc_values[3]); }对于高频噪声抑制我开发了一种混合滤波算法先进行移动平均滤波窗口大小8再用IIR低通滤波器α0.1处理。在STM32上采用Q15定点数运算实现既保证实时性又节省资源。