基于ADS8665与TM4C1299的高精度数据采集系统设计

发布时间:2026/7/9 12:56:03
基于ADS8665与TM4C1299的高精度数据采集系统设计 1. 项目背景与硬件选型在工业测量和自动化控制领域高精度模拟信号采集一直是关键环节。ADS8665作为TI推出的16位、1MSPS SAR型ADC配合TM4C1299KCZAD这款Cortex-M4内核的MCU构成了一个高性能的信号采集系统解决方案。ADS8665的主要特性包括16位无失码分辨率1MSPS采样率单通道±10V/±5V/0-10V可编程输入范围内置2.5V基准电压最大温漂5ppm/℃SPI兼容接口最高50MHz时钟TM4C1299KCZAD的优势在于120MHz Cortex-M4内核带FPU1MB Flash 256KB SRAM8个独立硬件SPI控制器12位ADC和16位PWM等丰富外设工业级温度范围-40℃~85℃这种组合特别适合需要多通道高精度采集的场景比如工业过程控制PLC系统电力监测设备自动化测试设备医疗仪器前端2. 硬件电路设计要点2.1 模拟前端设计对于±10V输入范围推荐使用以下前端电路Vin ────╱╲ 10kΩ ───┬─── ADS8665 AINx ╲╱ │ ┌┴┐ │ │ 4.7nF └┬┘ ┴ GND关键设计考虑输入RC滤波10kΩ4.7nF构成约3.4kHz截止频率的低通滤波过压保护可在输入端添加TVS二极管如SMBJ15CA共模抑制差分输入时需保持阻抗对称2.2 电源设计ADS8665需要三组电源AVDD5V±5%模拟供电DVDD2.7V-5.25V数字供电REF2.5V基准推荐电源方案5V主电源 ── TPS7A4700(5V) ── AVDD └ TPS7A4700(3.3V) ── DVDD └ REF5025 ── REF2.3 SPI接口设计TM4C1299与ADS8665的连接方式TM4C1299 SPI0_CLK ─── ADS8665 SCLK SPI0_MOSI ─── CNVST SPI0_MISO ─── DOUT GPIO_PA2 ─── /RST GPIO_PA3 ─── /CS注意要点使用硬件SPI控制器非模拟SPI保持走线长度10cm必要时加33Ω串联电阻避免与高频信号平行走线3. 软件驱动实现3.1 初始化配置// TM4C1299 SPI初始化 void ADS8665_Init(void) { // 使能SPI0外设时钟 SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); // 配置GPIO引脚 GPIOPinConfigure(GPIO_PA2_SSI0CLK); GPIOPinConfigure(GPIO_PA5_SSI0TX); GPIOPinConfigure(GPIO_PA4_SSI0RX); GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_5 | GPIO_PIN_4); // 配置SPI控制器 SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 1000000, 16); SSIEnable(SSI0_BASE); // 配置控制引脚 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_3); // CS GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_2); // RST GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3); // CS高 GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2, GPIO_PIN_2); // 释放复位 }3.2 数据采集流程uint16_t ADS8665_ReadChannel(uint8_t ch) { uint32_t command (ch 13) | 0x0000; // 通道选择模式 GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, 0); // CS拉低 // 发送转换命令24个SCLK周期 SSIDataPut(SSI0_BASE, command 8); SSIDataPut(SSI0_BASE, command 0xFF); SSIDataPut(SSI0_BASE, 0x00); // 读取转换结果 uint32_t rxData; SSIDataGet(SSI0_BASE, rxData); // 丢弃第一个字节 SSIDataGet(SSI0_BASE, rxData); // 读取高字节 uint16_t result (rxData 0xFF) 8; SSIDataGet(SSI0_BASE, rxData); // 读取低字节 result | (rxData 0xFF); GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3); // CS拉高 return result; }4. 性能优化技巧4.1 采样时序优化ADS8665的典型时序参数t_CONV710ns最大t_ACQ290ns最小t_CNVST20ns最小脉冲宽度推荐采用DMA传输模式// 配置DMA传输 void ConfigureDMA(void) { // 启用DMA控制器 SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); // 配置DMA控制表 uDMAChannelAssign(UDMA_CH8_SSI0RX | UDMA_PRI_SELECT); uDMAChannelAttributeDisable(UDMA_CH8_SSI0RX, UDMA_ATTR_ALTSELECT | UDMA_ATTR_HIGH_PRIORITY); // 配置传输控制 uDMAChannelControlSet(UDMA_CH8_SSI0RX | UDMA_PRI_SELECT, UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_4); // 设置传输缓冲区 uDMAChannelTransferSet(UDMA_CH8_SSI0RX | UDMA_PRI_SELECT, UDMA_MODE_BASIC, (void *)(SSI0_BASE SSI_O_DR), g_pui8RxBuffer, sizeof(g_pui8RxBuffer)); // 启用DMA通道 uDMAChannelEnable(UDMA_CH8_SSI0RX); SSIDMAEnable(SSI0_BASE, SSI_DMA_RX); }4.2 噪声抑制措施PCB布局建议使用4层板信号-地-电源-信号模拟和数字地平面单点连接基准电压源加π型滤波10Ω10μF0.1μF软件滤波算法#define SAMPLE_COUNT 16 uint16_t ADS8665_ReadAverage(uint8_t ch) { uint32_t sum 0; for(int i0; iSAMPLE_COUNT; i) { sum ADS8665_ReadChannel(ch); // 插入适当延迟保证采样间隔 SysCtlDelay(SysCtlClockGet() / 1000000); // 1us延迟 } return (sum SAMPLE_COUNT/2) / SAMPLE_COUNT; // 四舍五入 }5. 实际应用中的问题排查5.1 常见故障现象及解决采样值跳动大检查电源纹波应10mVpp验证输入信号是否稳定尝试增加前端RC滤波时间常数SPI通信失败用逻辑分析仪抓取波形确认相位和极性设置SSI_FRF_MOTO_MODE_0检查CS信号是否正常切换线性度不达标执行满量程校准0V和满量程点检查参考电压稳定性确保输入信号在允许范围内5.2 校准流程零点校准void CalibrateZero(void) { uint32_t sum 0; for(int i0; i32; i) { sum ADS8665_ReadChannel(0); // 短路输入到GND } g_i16ZeroOffset sum / 32; }增益校准void CalibrateGain(float refVoltage) { float fsReading 0; for(int i0; i32; i) { fsReading ADS8665_ReadChannel(0); // 输入精确参考电压 } fsReading / 32; g_fGainFactor refVoltage / (fsReading - g_i16ZeroOffset); }6. 进阶应用多通道同步采样利用TM4C1299的多个SPI控制器可实现多ADC同步// 配置两个ADS8665同步采样 void SyncSamplingInit(void) { // 共用SCK使用不同CS GPIOPinConfigure(GPIO_PA2_SSI0CLK); GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2); // ADC1使用SPI0 GPIOPinConfigure(GPIO_PA5_SSI0TX); GPIOPinConfigure(GPIO_PA4_SSI0RX); // ADC2使用SPI1 GPIOPinConfigure(GPIO_PF3_SSI1TX); GPIOPinConfigure(GPIO_PF2_SSI1RX); // 同步触发使用同一个GPIO GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0); } void SyncSampling(uint16_t *results) { // 同时拉低两个CS GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, 0); // ADC1 CS GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0, 0); // ADC2 CS // 发送转换命令 SSIDataPut(SSI0_BASE, 0x00); SSIDataPut(SSI1_BASE, 0x00); // 读取数据... // 同时释放CS GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3); GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0, GPIO_PIN_0); }通过这种设计系统可以达到16位有效分辨率500kSPS/ch的采样率双通道±0.05%的典型精度85dB以上的SNR性能