基于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, ®Addr, 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, ®Addr, 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); // 通道切换延时
}
}
三、关键参数说明
-
不连续模式配置:
MODE_DISCONTINUOUS:使能不连续转换模式。- 组大小通过
MODE_REG的0x00000F位设置(0x04表示4通道一组)。
-
数据格式:
- 单极性模式:
V = (Data × VREF) / 2²⁴ - 双极性模式:
V = (Data × VREF) / 2²⁴ - VREF/2
- 单极性模式:
-
采样率控制:
- 通过
MODE_REG的FILTER位设置输出数据速率(如4.8kHz时需配置滤波器参数)。
- 通过
四、调试与优化
1. 常见问题解决
-
数据异常:
- 检查CS时序(低电平有效,空闲高电平)。
- 验证SPI时钟频率(建议≤5MHz)。
-
噪声干扰:
- 增加参考电压滤波电容(如10μF电解电容+0.1μF陶瓷电容)。
- 在软件中添加移动平均滤波。
2. 性能优化
-
多通道同步:
// 同时触发多通道转换(需配置通道序列器) AD7190_WriteReg(AD7190_COMM_REG, 0x00); // 选择模式寄存器 AD7190_WriteReg(AD7190_MODE_REG, 0x040000 | MODE_DISCONTINUOUS | 0x0000FF); // 4通道同步 -
校准功能:
// 零点校准 AD7190_WriteReg(AD7190_COMM_REG, 0x00); // 选择模式寄存器 AD7190_WriteReg(AD7190_MODE_REG, 0x040000 | MODE_ADJUST_ZERO); // 进入校准模式 HAL_Delay(100); // 等待校准完成
参考代码 AD7190四通道不连续采集模式STM32代码 www.youwenfan.com/contentcsr/115731.html
五、完整工程示例
-
CubeMX配置:
- SPI模式:全双工,时钟极性CPOL=0,相位CPHA=0。
- 引脚配置:PA0(CS)、PA1(SCLK)、PA2(DIN)、PA4(DOUT)。
-
中断处理(可选):
void SPI1_IRQHandler(void) { HAL_SPI_IRQHandler(&hspi1); if (__HAL_SPI_GET_FLAG(&hspi1, SPI_FLAG_RXNE)) { // 数据接收完成处理 } }
六、参考资料
- AD7190数据手册(ADI官网)
- STM32 HAL库SPI驱动源码
- 中的寄存器操作示例
- 中的中断处理实现