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);
    }
}

三、关键问题与解决方案

  1. SPI时序不匹配
    • 问题:STC51的SPI速度可能过快,导致AD7190无法解析数据。
    • 解决:在SPI_WriteByteSPI_ReadByte中添加延时(如DelayUs(1))。
  2. 数据溢出
    • 问题:24位数据超出8位变量范围。
    • 解决:使用unsigned long类型存储数据,并手动拼接高低字节。
  3. 参考电压漂移
    • 问题:VREF不稳定导致测量误差。
    • 解决:通过校准寄存器(0x06-0x07)进行失调和满量程校准。

参考代码 24位采集卡AD7190用STC51驱动的程序 www.youwenfan.com/contentcnq/70440.html

四、扩展功能

  1. 多通道切换

    修改配置寄存器的CONF_CHAN位(位8-15),支持AIN1-AIN4通道切换。

    #define CONF_CHAN_CH1 0x000100  // 通道1(AIN1-AIN2)
    #define CONF_CHAN_CH2 0x000200  // 通道2(AIN3-AIN4)
    
  2. 滤波器优化

    调整模式寄存器的MODE_SINC3MODE_RATE位,平衡噪声与带宽。

    #define MODE_SINC3_FILTER 0x00080000  // 启用SINC3滤波器
    

五、调试建议

  1. 逻辑分析仪验证

    使用逻辑分析仪捕获SPI通信波形,确认命令和数据帧格式正确。

  2. 参考电压校准

    通过AD7190_WriteReg(0x06, 0x800000)写入失调校准值,补偿零点误差。

  3. 实时监控

    在串口打印ADC值,观察是否随输入信号变化。

posted @ 2026-02-03 16:04  修BUG狂人  阅读(0)  评论(0)    收藏  举报