多通道信号采集系统设计与PIC24 MCU应用

📅 2026/7/6 7:11:31 👁️ 阅读次数 📝 编程学习
多通道信号采集系统设计与PIC24 MCU应用

1. 项目背景与核心需求

在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与实时处理一直是关键需求。传统方案面临两大痛点:一是通道数量受限,难以扩展;二是高采样率下数据处理压力大。TPAFE0808(8通道模拟前端)与PIC24FV16KA304(高性能16位MCU)的组合,为解决这些问题提供了新思路。

TPAFE0808是一款集成PGA(可编程增益放大器)和24位Σ-Δ ADC的模拟前端,支持±10V输入范围,适用于振动监测、ECG等场景。PIC24FV16KA304则具备16MIPS处理能力、丰富外设接口和低功耗特性,是嵌入式控制的理想选择。

2. 硬件架构设计

2.1 信号链搭建

典型信号通路如下:

传感器 → 信号调理电路 → TPAFE0808(PGA+ADC) → SPI接口 → PIC24FV16KA304 → 上位机
  • 前端处理:每路信号需配置RC低通滤波(截止频率=1/(2πRC)),抑制高频噪声。例如使用1kΩ电阻+100nF电容组合,实现1.6kHz截止频率。
  • 基准电压:采用REF5025提供2.5V精密基准,TPAFE0808内部PGA增益设置建议:
    • 振动信号:增益=16(±1.25V范围)
    • 温度信号:增益=1(±10V范围)

2.2 关键硬件连接

信号线PIC24引脚TPAFE0808引脚备注
SPI_CLKRB15SCLK时钟线(最大10MHz)
SPI_MOSIRB13DIN配置寄存器写入
SPI_MISORB14DOUT数据输出
CSRB12CS片选(低有效)
DRDYRB11DRDY数据就绪中断(下降沿触发)

注意:PCB布局时需将模拟地(AGND)与数字地(DGND)通过0Ω电阻单点连接,避免地环路干扰。

3. 固件实现要点

3.1 SPI通信配置

PIC24的SPI模块需设置为模式1(CPOL=0, CPHA=1):

void SPI_Init() { SPI1CON1 = 0x0137; // 主模式, 8位传输, 时钟=FPB/4 SPI1STATbits.SPIEN = 1; // 使能SPI }

3.2 数据采集流程

  1. 初始化配置
void TPAFE0808_Config(uint8_t ch, uint8_t gain) { uint8_t cfg = (ch << 4) | (gain & 0x0F); CS_LOW(); SPI_Write(0x01); // 写配置寄存器 SPI_Write(cfg); CS_HIGH(); }
  1. 中断驱动采集
void __attribute__((interrupt, auto_psv)) _INT1Interrupt(void) { int32_t raw_data = 0; CS_LOW(); raw_data = SPI_Read() << 16; raw_data |= SPI_Read() << 8; raw_data |= SPI_Read(); CS_HIGH(); // 数据转换(24位补码→有符号整数) if(raw_data & 0x800000) raw_data |= 0xFF000000; IFS1bits.INT1IF = 0; // 清除中断标志 }

3.3 多通道轮询策略

采用时间片轮转方式管理8个通道:

void Task_ADC_Poll() { static uint8_t current_ch = 0; TPAFE0808_Config(current_ch, gain_settings[current_ch]); delay_us(50); // 等待建立时间 if(DRDY_READ() == 0) { adc_values[current_ch] = Read_ADC_Data(); } current_ch = (current_ch + 1) % 8; }

4. 系统监测功能实现

4.1 实时诊断参数

通过PIC24内置外设监测系统状态:

  • 电源监测:ADC测量VDD电压(分压比1/2):
    float Read_VDD() { AD1CHS = 0x0E; // 选择AVDD/2通道 AD1CON1bits.SAMP = 1; while(!AD1CON1bits.DONE); return (float)ADC1BUF0 * 3.3 / 1024 * 2; }
  • 温度监测:利用片内温度传感器(精度±2℃):
    AD1CHS = 0x1D; // 选择温度传感器通道

4.2 看门狗配置

启用窗口看门狗防止程序跑飞:

#pragma config WDTPS = 512 // 约16ms超时 #pragma config WINDIS = OFF // 关闭窗口模式 void Enable_WDT() { RCONbits.SWDTEN = 1; }

5. 性能优化技巧

5.1 采样率提升方案

  • SPI时钟优化:将SPI时钟提升至10MHz(PIC24最大支持),单通道采样率可达5kSPS
  • DMA传输:使用PIC24的DMA模块实现自动数据传输:
    DmaChnOpen(0, DMA_CH_PRI3, DMA_OPEN_DEFAULT); DmaChnSetTxfer(0, (void*)&SPI1BUF, adc_buffer, 256);

5.2 数据滤波处理

在MCU端实现移动平均滤波:

#define FILTER_SIZE 8 int32_t Moving_Average(int32_t new_val, uint8_t ch) { static int32_t history[8][FILTER_SIZE] = {0}; static uint8_t idx[8] = {0}; history[ch][idx[ch]] = new_val; idx[ch] = (idx[ch] + 1) % FILTER_SIZE; int64_t sum = 0; for(uint8_t i=0; i<FILTER_SIZE; i++) { sum += history[ch][i]; } return (int32_t)(sum / FILTER_SIZE); }

6. 调试与问题排查

6.1 常见问题分析

现象可能原因解决方案
DRDY无信号SPI模式配置错误确认CPHA=1, CPOL=0
数据跳动大参考电压不稳定增加基准源退耦电容(10μF+0.1μF)
多通道串扰采样保持时间不足配置后增加50μs延时

6.2 示波器诊断要点

  1. SPI信号质量检测:检查SCLK边沿是否陡峭(上升时间<50ns)
  2. 电源纹波测量:VDD峰峰值应<50mV(建议使用10x探头)
  3. DRDY时序验证:从CS下降沿到DRDY响应应<100μs

7. 上位机通信协议

采用Modbus RTU协议传输采集数据,帧格式示例:

[设备地址][功能码][数据长度][数据Hi][数据Lo][CRC16]

CRC16计算函数:

uint16_t Calc_CRC16(uint8_t *buf, uint8_t len) { uint16_t crc = 0xFFFF; while(len--) { crc ^= *buf++; for(uint8_t i=0; i<8; i++) crc = (crc & 0x0001) ? (crc >> 1) ^ 0xA001 : (crc >> 1); } return crc; }

通过实际项目验证,该方案在8通道1kSPS采样率下,CPU利用率约65%,可稳定运行。关键点在于精确控制SPI时序和合理分配中断优先级。对于更高通道数需求,可考虑级联多个TPAFE0808,通过GPIO扩展片选信号。