STM32F4实战用SPI驱动AD7606采集8路信号附完整代码与波形分析在工业测量和自动化控制领域多通道高精度数据采集是许多项目的核心需求。AD7606作为一款16位8通道同步采样ADC芯片配合STM32F4系列高性能微控制器能够构建稳定可靠的数据采集系统。本文将手把手带你完成从硬件连接到软件实现的完整流程特别针对SPI接口的16位模式配置、转换期间读取优化等关键细节进行深入解析。1. 硬件准备与电路连接AD7606模块采用50mm×48mm标准尺寸供电电压为5V支持±5V和±10V两种输入范围通过RANGE引脚电平选择。其核心特性包括分辨率16位采样率200kSPS总吞吐量接口类型SPI或并行本文采用SPI模式输入保护±16.5V箝位保护基准电压内置2.5V可外接硬件连接示意图STM32F4引脚AD7606引脚备注PC12AD_CS片选信号PC10AD_RESET复位信号PC13AD_CONVST转换启动信号PC8AD_RANGE输入范围选择PB3SCKSPI时钟PB4MISOSPI数据输入注意CONVST A和CONVST B需短接以实现8路同步采样BUSY引脚可连接PA5用于状态监测非必需2. SPI接口的16位模式配置STM32F4的SPI外设支持8位或16位数据传输AD7606在SPI模式下需要16位数据帧。以下是关键配置代码void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; // 启用GPIOB和SPI1时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // 配置PB3(SCK), PB4(MISO)为复用功能 GPIO_InitStructure.GPIO_Pin GPIO_Pin_3 | GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd GPIO_PuPd_UP; GPIO_Init(GPIOB, GPIO_InitStructure); // 引脚复用映射 GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI1); GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_SPI1); // SPI参数配置 SPI_InitStructure.SPI_Direction SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode SPI_Mode_Master; SPI_InitStructure.SPI_DataSize SPI_DataSize_16b; // 关键配置16位模式 SPI_InitStructure.SPI_CPOL SPI_CPOL_High; // 时钟极性高 SPI_InitStructure.SPI_CPHA SPI_CPHA_1Edge; // 第一边沿采样 SPI_InitStructure.SPI_NSS SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_64; SPI_Init(SPI1, SPI_InitStructure); SPI_Cmd(SPI1, ENABLE); }3. 数据采集与转换优化AD7606的典型转换时序包含两个关键阶段转换启动(CONVST)和数据读取。通过转换期间读取技术可显著提升系统吞吐率。标准采集流程拉低CONVST至少50ns启动转换等待BUSY信号变低转换完成拉低CS并发送16个SCK时钟读取数据优化后的转换期间读取流程uint16_t AD_ReadDuringConversion(void) { uint16_t data; AD_CS_Low(); data SPI1_ReadWriteByte(0xFFFF); // 发送哑数据读取 AD_CS_High(); return data; }电压值转换公式±10V范围实际电压(V) (原始值 × 10) / 32768对应的代码实现float ConvertToVoltage(uint16_t raw) { if(raw 32768) { return (raw * 10.0f) / 32768; } else { return ((~raw 1) * -10.0f) / 32768; } }4. 定时采样与波形捕获使用TIM3定时器实现精确采样间隔控制以下配置产生2kHz采样率0.5ms间隔void TIM3_Init(void) { TIM_TimeBaseInitTypeDef TIM_InitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_InitStruct.TIM_Period 500 - 1; // 自动重装载值 TIM_InitStruct.TIM_Prescaler 84 - 1; // 分频系数 TIM_InitStruct.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, TIM_InitStruct); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); TIM_Cmd(TIM3, ENABLE); }中断服务程序中实现数据采集#define SAMPLE_COUNT 1024 volatile uint16_t sampleBuffer[SAMPLE_COUNT]; volatile uint32_t sampleIndex 0; void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM3, TIM_IT_Update)) { sampleBuffer[sampleIndex] AD_ReadDuringConversion(); if(sampleIndex SAMPLE_COUNT) { TIM_Cmd(TIM3, DISABLE); // 采集完成停止定时器 } TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } }5. 数据处理与可视化采集到的原始数据可通过串口发送到上位机使用Excel或专业工具进行可视化分析。对于1Hz正弦波信号在2kHz采样率下可获得高分辨率波形。Excel处理技巧将原始数据粘贴到A列B列使用公式进行电压转换A1*10/32768插入折线图观察波形添加趋势线进行谐波分析实际项目中这种采集方案在电机控制、振动监测等场景表现优异。特别是在需要多通道同步采样的场合AD7606的8通道同步特性配合STM32F4的DMA传输可以构建出高性能的数据采集系统。