在工业测量、医疗设备和自动化测试系统中,多通道高精度数据采集一直是工程师面临的核心挑战。ADI公司的EVAL-AD7616SDZ评估板配合STM32H7系列微控制器,为解决这一难题提供了优雅的硬件方案。本文将深入探讨如何构建一个基于双SPI接口的16通道同步数据采集系统,从硬件设计到软件实现的完整流程。
AD7616作为16位双通道同步采样ADC,其评估板EVAL-AD7616SDZ为快速原型开发提供了理想平台。与常见的单通道ADC相比,AD7616在性价比和性能平衡上表现出色:
在控制器选择上,STM32H743ZI凭借其双SPI外设和高达480MHz的主频成为理想搭档。特别值得注意的是其SPI4/SPI5外设对:
| 特性 | SPI4 (Master) | SPI5 (Slave) |
|---|---|---|
| 时钟源 | 共享PLL3时钟 | 共享PLL3时钟 |
| 最大速率 | 60MHz | 60MHz |
| 数据位宽 | 4-16位可调 | 4-16位可调 |
| 工作模式 | 全双工 | 只接收模式 |
硬件连接时需特别注意信号完整性:
c复制// 推荐接线配置(软件串口模式)
AD7616_EVAL STM32H743_Nucleo
---------------------------------
CNVST PE3 (TIM1_CH3)
BUSY PA5 (EXTI5)
RESET PA4
CS PE4
SCK PE2 (SPI4_SCK)
SDI PE5 (SPI4_MISO)
SDO PE6 (SPI4_MOSI)
SDI/SDOB PF6/PF7 (SPI5)
AD7616的初始化序列是系统稳定工作的基础。不同于简单的寄存器配置,这里需要严格遵循器件手册中的电源时序和信号同步要求。
完整的初始化流程:
以下是核心的SPI初始化代码示例:
c复制void SPI4_Init(void)
{
SPI_HandleTypeDef hspi;
hspi.Instance = SPI4;
hspi.Init.Mode = SPI_MODE_MASTER;
hspi.Init.Direction = SPI_DIRECTION_2LINES;
hspi.Init.DataSize = SPI_DATASIZE_16BIT;
hspi.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi.Init.NSS = SPI_NSS_SOFT;
hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
hspi.Init.FirstBit = SPI_FIRSTBIT_MSB;
HAL_SPI_Init(&hspi);
}
void SPI5_Init(void)
{
SPI_HandleTypeDef hspi;
hspi.Instance = SPI5;
hspi.Init.Mode = SPI_MODE_SLAVE;
hspi.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
// 其他参数与SPI4保持同步
HAL_SPI_Init(&hspi);
}
关键提示:STM32H7的SPI时钟配置需要特别注意APB总线时钟分频,不当的设置会导致主从时钟不同步。建议使用CubeMX工具生成初始化代码基础。
实现真正的同步采集需要精确控制转换启动(CONVST)信号与SPI时钟的相位关系。AD7616的工作时序包含几个关键阶段:
优化后的采集流程代码框架:
c复制void AD7616_AcquireDualChannel(uint16_t *chA, uint16_t *chB)
{
// 启动转换
HAL_GPIO_WritePin(CONVST_GPIO_Port, CONVST_Pin, GPIO_PIN_SET);
__NOP(); __NOP(); // 约50ns延时
HAL_GPIO_WritePin(CONVST_GPIO_Port, CONVST_Pin, GPIO_PIN_RESET);
// 等待转换完成
while(HAL_GPIO_ReadPin(BUSY_GPIO_Port, BUSY_Pin) == GPIO_PIN_SET);
// 读取双通道数据
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi4, dummyTx, chA, 1, 100);
HAL_SPI_Receive(&hspi5, chB, 1, 100);
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
}
实际测试中发现几个影响同步精度的关键因素:
将上述模块整合后,我们构建了完整的测试框架。性能测试重点关注三个维度:
1. 时序精度测试
使用逻辑分析仪捕获的信号时序显示:
2. 噪声性能测试
输入直流2.5V信号,采集1000次样本统计:
| 参数 | 通道A | 通道B |
|---|---|---|
| 平均值(mV) | 2498 | 2501 |
| 标准差(mV) | 0.78 | 0.82 |
| ENOB | 15.2 | 15.1 |
3. 长期稳定性测试
连续工作8小时,基准电压源测量显示:
对于需要更高采样率的应用,可考虑以下优化方向:
c复制// 使用DMA提升吞吐量示例
HAL_SPI_TransmitReceive_DMA(&hspi4, txBuf, rxBufA, length);
HAL_SPI_Receive_DMA(&hspi5, rxBufB, length);
在医疗ECG采集系统的实际应用中,这套方案成功实现了16导联信号的同步采集,采样率500KSPS下系统功耗仅120mW,信噪比达到85dB。