基于STM32的AD7190四通道不连续采集模式实现代码

基于STM32的AD7190四通道不连续采集模式实现代码


一、硬件连接与初始化

1. 硬件连接

STM32引脚 AD7190引脚 功能说明
PA0 CS 片选信号(低电平有效)
PA1 SCLK SPI时钟
PA2 DIN 串行数据输入
PA4 DOUT 串行数据输出
3.3V VDD/VREF+ 电源与参考电压
GND GND

2. 寄存器配置

// AD7190寄存器地址定义
#define AD7190_COMM_REG        0x00  // 通信寄存器
#define AD7190_MODE_REG        0x01  // 模式寄存器
#define AD7190_CONFIG_REG      0x02  // 配置寄存器
#define AD7190_DATA_REG        0x03  // 数据寄存器
#define AD7190_ID_REG          0x04  // ID寄存器

// 关键寄存器配置值
#define MODE_CONTINUOUS        0x00  // 连续模式
#define MODE_DISCONTINUOUS     0x04  // 不连续模式
#define CONFIG_CH0_1_2_3       0x80  // 使能通道0-3(差分输入)
#define CONFIG_GAIN_128        0x07  // 增益128倍

二、核心代码实现

1. SPI通信函数

// SPI写寄存器函数
void AD7190_WriteReg(uint8_t regAddr, uint32_t data) {
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // CS拉低
    HAL_SPI_Transmit(&hspi1, &regAddr, 1, 100);          // 发送寄存器地址
    HAL_SPI_Transmit(&hspi1, (uint8_t*)&data, 3, 100);   // 发送24位数据
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);  // CS拉高
}

// SPI读寄存器函数
uint32_t AD7190_ReadReg(uint8_t regAddr) {
    uint32_t data = 0;
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // CS拉低
    HAL_SPI_Transmit(&hspi1, &regAddr, 1, 100);          // 发送寄存器地址(读模式)
    HAL_SPI_Receive(&hspi1, (uint8_t*)&data, 3, 100);    // 接收24位数据
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);  // CS拉高
    return data;
}

2. 初始化配置

void AD7190_Init(void) {
    // 1. 复位AD7190
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
    for (int i = 0; i < 50; i++) {
        HAL_SPI_Transmit(&hspi1, (uint8_t*)0xFF, 1, 100);
        HAL_Delay(1);
    }
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
    HAL_Delay(1);

    // 2. 配置模式寄存器(不连续模式)
    AD7190_WriteReg(AD7190_MODE_REG, 0x040000 | MODE_DISCONTINUOUS); // 使能不连续模式

    // 3. 配置通道(差分输入,增益128)
    AD7190_WriteReg(AD7190_CONFIG_REG, CONFIG_CH0_1_2_3 | CONFIG_GAIN_128);

    // 4. 设置不连续组(4通道分1组)
    AD7190_WriteReg(AD7190_COMM_REG, 0x00); // 选择模式寄存器
    AD7190_WriteReg(AD7190_MODE_REG, 0x040000 | MODE_DISCONTINUOUS | 0x00000F); // 组大小=4
}

3. 数据采集函数

float AD7190_ReadChannel(uint8_t channel) {
    uint32_t rawValue;
    float voltage;

    // 1. 触发单次转换
    AD7190_WriteReg(AD7190_COMM_REG, 0x00); // 选择数据寄存器
    HAL_Delay(1); // 等待转换完成(根据时钟调整)

    // 2. 读取数据
    rawValue = AD7190_ReadReg(AD7190_DATA_REG);

    // 3. 数据转换(单极性模式)
    voltage = (rawValue * 3.3f) / 0xFFFFFF; // 24位数据转换

    return voltage;
}

// 四通道轮询采集示例
void AD7190_MultiRead(float* results) {
    for (int i = 0; i < 4; i++) {
        results[i] = AD7190_ReadChannel(i); // 依次读取通道0-3
        HAL_Delay(10); // 通道切换延时
    }
}

三、关键参数说明

  1. 不连续模式配置

    • MODE_DISCONTINUOUS:使能不连续转换模式。
    • 组大小通过MODE_REG0x00000F位设置(0x04表示4通道一组)。
  2. 数据格式

    • 单极性模式:V = (Data × VREF) / 2²⁴
    • 双极性模式:V = (Data × VREF) / 2²⁴ - VREF/2
  3. 采样率控制

    • 通过MODE_REGFILTER位设置输出数据速率(如4.8kHz时需配置滤波器参数)。

四、调试与优化

1. 常见问题解决

2. 性能优化

参考代码 AD7190四通道不连续采集模式STM32代码 www.youwenfan.com/contentcsr/115731.html

五、完整工程示例

  1. CubeMX配置

    • SPI模式:全双工,时钟极性CPOL=0,相位CPHA=0。
    • 引脚配置:PA0(CS)、PA1(SCLK)、PA2(DIN)、PA4(DOUT)。
  2. 中断处理(可选):

    void SPI1_IRQHandler(void) {
        HAL_SPI_IRQHandler(&hspi1);
        if (__HAL_SPI_GET_FLAG(&hspi1, SPI_FLAG_RXNE)) {
            // 数据接收完成处理
        }
    }
    

六、参考资料

  1. AD7190数据手册(ADI官网)
  2. STM32 HAL库SPI驱动源码
  3. 中的寄存器操作示例
  4. 中的中断处理实现

专注于matlab/simulink,电子电路,编程