硬汉嵌入式论坛

 找回密码
 立即注册
查看: 182|回复: 3
收起左侧

ADS1256轮询切换4组差分通道问题

[复制链接]

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2025-5-15 17:09:40 | 显示全部楼层 |阅读模式
你好,想请教一下,我现在轮询切换4组差分输入,然后想把第3、4这2组差分输入需要改变PGA,然后读出来的数据时错乱的,如果单纯切换4组差分输入,不增加修改PGA又可以正常读取数据,这个是什么原因呢?

void ADS1256_SetDiffChannal(uint8_t _ch,uint8_t SPIx)
{
        if (_ch == 0)
        {
                ADS1256_WriteReg(REG_MUX, (0 << 4) | 1,0x04,SPIx);        /* 差分输入 AIN0, AIN1 ,PGA=16倍 */
        }
        else if (_ch == 1)
        {
                ADS1256_WriteReg(REG_MUX, (2 << 4) | 3,0x04,SPIx);        /* 差分输入 AIN2, AIN3 ,PGA=16倍 */
        }
        else if (_ch == 2)
        {
                ADS1256_WriteReg(REG_MUX, (4 << 4) | 5,0x06,SPIx);        /* 差分输入 AIN4, AIN5 ,PGA=64倍 */
        }
        else if (_ch == 3)
        {
                ADS1256_WriteReg(REG_MUX, (6 << 4) | 7,0x06,SPIx);        /* 差分输入 AIN6, AIN7 ,PGA=64倍*/
        }
}
void ADS1256_WriteReg(uint8_t _RegID, uint8_t _RegValue,uint8_t _RegValue1,uint8_t SPIx)
{
        ADS1256_Send8Bit(CMD_WREG | _RegID,SPIx);        /* 第1个命令:写寄存器的命令, 并发送寄存器地址 */
        ADS1256_Send8Bit(0x01,SPIx);                /* 第2个命令:寄存器个数 - 1, 此处写1个寄存器 */
        ADS1256_Send8Bit(_RegValue,SPIx);        /* 第3个命令:发送寄存器值 */
    ADS1256_Send8Bit(_RegValue1,SPIx);        /* 第4个命令:发送寄存器值 */
}
void ADS1256_ReadData(int32_t *p,u8 ADCx )
{
        int32_t read = 0;
    select_ads1256(10);//拉低片选,选通MISO,主入从出
        Ddl_Delay1us(1);  
        ADS1256_WaitDRDY_1(10);
       
    ADS1256_SetDiffChannal(ADCx,10);//差分4通道
        Ddl_Delay1us(5);
        ADS1256_Send8Bit(CMD_SYNC,10);
        Ddl_Delay1us(5);
        ADS1256_Send8Bit(CMD_WAKEUP,10);       
        Ddl_Delay1us(25);

        ADS1256_Send8Bit(CMD_RDATA,10);        /* 读数据的命令 */
        Ddl_Delay1us(10);

        /* 读采样结果,3个字节,高字节在前 */
        read += ADS1256_Recive8Bit(10) << 16;
        read += ADS1256_Recive8Bit(10) << 8;
        read += ADS1256_Recive8Bit(10) << 0;
    unselect_ads1256(10);//读完数据拉高片选
        //CS_1();        /* SPI片选 = 1 */
       
        /* 负数进行扩展。24位有符号数扩展为32位有符号数 */
        if (read & 0x800000)
        {
                read += 0xFF000000;
        }

    if(ADCx==0){p[3] =  read/32;}
        else{
            p[ADCx-1] =  read/32;}
}


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2025-5-16 08:46:57 | 显示全部楼层
没留意过这个问题。后面我测试下
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2025-5-28 13:14:44 | 显示全部楼层
等待稳定的时间不够,请看数据手册,数据稳定的时间是多少,切换后等待的时间必须大于这个值
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2025-5-29 09:37:54 | 显示全部楼层
yuguoliang 发表于 2025-5-28 13:14
等待稳定的时间不够,请看数据手册,数据稳定的时间是多少,切换后等待的时间必须大于这个值

谢谢分享,还真有可能是这个问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-9 19:53 , Processed in 0.272883 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表