24位采集卡AD7190用STC51驱动的程序
一、硬件连接与配置
1. 引脚连接
AD7190与STC51的SPI接口连接如下(需根据实际硬件调整引脚):
| AD7190引脚 | STC51引脚 | 功能 |
|---|---|---|
| SCLK | P1.0 | 串行时钟 |
| DIN | P1.1 | 串行数据输入 |
| DOUT | P1.2 | 串行数据输出 |
| CS | P1.3 | 片选(低电平有效) |
| VREF+ | VCC | 参考电压(3.3V) |
| AGND | GND | 模拟地 |
2. STC51 SPI模式设置
AD7190要求SPI为软件模拟SPI(因STC51硬件SPI不支持灵活时序调整),需手动控制时钟和数据线。
二、核心代码实现
1. SPI通信函数
#include <reg51.h>
sbit SCLK = P1^0; // 时钟线
sbit DIN = P1^1; // 数据输入
sbit DOUT = P1^2; // 数据输出
sbit CS = P1^3; // 片选
// SPI写1字节(高位先发)
void SPI_WriteByte(unsigned char data) {
for (int i = 0; i < 8; i++) {
SCLK = 0;
DIN = (data & 0x80) ? 1 : 0; // 发送高位
data <<= 1;
SCLK = 1;
}
}
// SPI读1字节(高位先收)
unsigned char SPI_ReadByte() {
unsigned char data = 0;
for (int i = 0; i < 8; i++) {
SCLK = 0;
data <<= 1;
SCLK = 1;
if (DOUT) data |= 0x01;
}
return data;
}
2. AD7190复位与初始化
// 软复位AD7190(连续发送40个0xFF)
void AD7190_Reset() {
CS = 0; // 选中芯片
for (int i = 0; i < 40; i++) {
SPI_WriteByte(0xFF);
DelayUs(10); // 每个脉冲至少10us
}
CS = 1; // 释放芯片
DelayMs(1); // 等待500us以上
}
// 写入AD7190寄存器(地址+数据)
void AD7190_WriteReg(unsigned char addr, unsigned int data) {
CS = 0;
SPI_WriteByte(0x40 | addr); // 通信寄存器:写操作(0x40=01000000)
SPI_WriteByte((data >> 16) & 0xFF); // 高字节
SPI_WriteByte((data >> 8) & 0xFF); // 中字节
SPI_WriteByte(data & 0xFF); // 低字节
CS = 1;
}
// 读取AD7190寄存器(地址)
unsigned int AD7190_ReadReg(unsigned char addr) {
CS = 0;
SPI_WriteByte(0x80 | addr); // 通信寄存器:读操作(0x80=10000000)
unsigned int data = SPI_ReadByte() << 16;
data |= SPI_ReadByte() << 8;
data |= SPI_ReadByte();
CS = 1;
return data;
}
3. 关键寄存器配置
// 模式寄存器配置(连续转换模式,内部时钟,SINC4滤波器)
#define MODE_REG 0x080C05 // 0000 1000 0000 1100 0000 0101
// 配置寄存器配置(差分输入,增益1,通道AIN1-AIN2)
#define CONF_REG 0x800118 // 1000 0000 0000 0001 0001 1000
void AD7190_Init() {
AD7190_Reset();
DelayMs(1);
// 写入模式寄存器
AD7190_WriteReg(0x01, MODE_REG);
// 写入配置寄存器
AD7190_WriteReg(0x02, CONF_REG);
// 验证ID(应为0x4)
unsigned char id = AD7190_ReadReg(0x04) & 0x0F;
if (id != 0x04) {
while(1); // 初始化失败
}
}
4. 数据读取与转换
// 读取24位ADC数据(差分输入)
long AD7190_ReadADC() {
CS = 0;
SPI_WriteByte(0x58); // 通信寄存器:读数据寄存器(0x58=01011000)
long data = SPI_ReadByte() << 16;
data |= SPI_ReadByte() << 8;
data |= SPI_ReadByte();
CS = 1;
// 转换为电压值(参考电压3.3V)
return (data * 3300.0) / 16777216; // 单极性模式
}
// 主循环示例
void main() {
AD7190_Init();
while(1) {
long adc_val = AD7190_ReadADC();
printf("ADC Value: %ld mV\r\n", adc_val);
DelayMs(100);
}
}
三、关键问题与解决方案
- SPI时序不匹配
- 问题:STC51的SPI速度可能过快,导致AD7190无法解析数据。
- 解决:在
SPI_WriteByte和SPI_ReadByte中添加延时(如DelayUs(1))。
- 数据溢出
- 问题:24位数据超出8位变量范围。
- 解决:使用
unsigned long类型存储数据,并手动拼接高低字节。
- 参考电压漂移
- 问题:VREF不稳定导致测量误差。
- 解决:通过校准寄存器(0x06-0x07)进行失调和满量程校准。
参考代码 24位采集卡AD7190用STC51驱动的程序 www.youwenfan.com/contentcnq/70440.html
四、扩展功能
-
多通道切换
修改配置寄存器的
CONF_CHAN位(位8-15),支持AIN1-AIN4通道切换。#define CONF_CHAN_CH1 0x000100 // 通道1(AIN1-AIN2) #define CONF_CHAN_CH2 0x000200 // 通道2(AIN3-AIN4) -
滤波器优化
调整模式寄存器的
MODE_SINC3和MODE_RATE位,平衡噪声与带宽。#define MODE_SINC3_FILTER 0x00080000 // 启用SINC3滤波器
五、调试建议
-
逻辑分析仪验证
使用逻辑分析仪捕获SPI通信波形,确认命令和数据帧格式正确。
-
参考电压校准
通过
AD7190_WriteReg(0x06, 0x800000)写入失调校准值,补偿零点误差。 -
实时监控
在串口打印ADC值,观察是否随输入信号变化。
浙公网安备 33010602011771号