在工业自动化、医疗设备和精密测量领域,多通道高精度数据采集系统往往面临通道扩展和信号同步的挑战。本文将分享一个基于STM32硬件SPI接口驱动三片ADS8688 ADC芯片的完整解决方案,通过菊花链连接实现21通道同步采集的实战经验。
菊花链拓扑是解决多片ADC同步采集的经典方案。三片ADS8688通过SDO串联形成数据链路,仅需共用一组SPI总线(SCLK、SDI)和片选信号(CS)。这种设计显著减少MCU引脚占用,同时保证所有ADC的采样时钟严格同步。
关键硬件连接要点:
注意:菊花链长度超过3片时,建议在SDO-SDI间加入74LVC245缓冲器提升信号完整性
针对ADS8688的16位数据帧特性,需对STM32 SPI进行特殊配置。以下为CubeMX配置的核心参数:
c复制/* SPI1 parameter configuration */
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; // 10.5MHz @84MHz PCLK
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
关键时序调试技巧:
c复制__asm volatile("nop"); // 插入1个时钟周期延迟
ADS8688的灵活配置需要通过程序寄存器实现。以下为关键寄存器设置示例:
| 寄存器地址 | 配置值 | 功能说明 |
|---|---|---|
| 0x05<<1 | VREF_U_0_125 | 通道0输入范围0-1.25×VREF |
| 0x06<<1 | VREF_B_25 | 通道1输入范围±2.5×VREF |
| 0x02<<1 | 0x7F | 使能通道0-6(bit0-bit6) |
| 0x01<<1 | 0x7F | 自动序列扫描通道0-6 |
配置代码片段:
c复制void ADS8688_Init(void) {
// 设置各通道输入范围(需两次写入规避首次写入异常)
ADS8688_WriteReg(Channel_0_Input_Range, VREF_U_0_125);
ADS8688_WriteReg(Channel_0_Input_Range, VREF_U_0_125);
// 启用自动序列扫描模式
ADS8688_WriteReg(AUTO_SEQ_EN, 0x7F);
ADS8688_SendCommand(AUTO_RST);
}
三片ADS8688在菊花链模式下,每次采集返回63字节数据(3芯片×21通道×16位)。需要特殊处理数据重组:
数据帧结构分析
数据缓冲区管理
c复制#pragma pack(push, 1)
typedef struct {
uint16_t data :14; // 转换结果
uint16_t ovr :1; // 溢出标志
uint16_t ch_id :1; // 通道ID高位
} ADS8688_DataFrame;
#pragma pack(pop)
ADS8688_DataFrame adc_data[21]; // 21通道数据容器
c复制void Read_ADS8688_Chain(void) {
uint16_t raw_data[63];
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET);
HAL_SPI_Receive(&hspi1, (uint8_t*)raw_data, 63, 100);
HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
// 数据重组(示例处理前7通道)
for(int i=0; i<7; i++) {
adc_data[i].data = (raw_data[i*3] >> 2) & 0x3FFF;
adc_data[i].ovr = raw_data[i*3+1] >> 15;
adc_data[i].ch_id = (raw_data[i*3+2] >> 14) & 0x01;
}
}
在实际部署中遇到以下典型问题及解决方案:
问题1:菊花链末端数据异常
问题2:通道间串扰
c复制ADS8688_WriteReg(Channel_Power_Down, 0x55); // 交替关闭通道
问题3:采样值非线性
c复制float calibrated_value = (raw_data - N1) * K + 0.5;
在完成所有调试后,系统可实现21通道16位精度同步采集,单次采样周期控制在50μs以内。通过合理配置ADS8688的自动序列模式,STM32仅需触发单次SPI传输即可获取全部通道数据,极大减轻CPU负载。