TI论坛
直播中

张辉

8年用户 1436经验值
私信 关注
[问答]

使用STM32F103的SPI3与ADS1248通讯,读取的ADC值波动很大,为什么?


  • 使用STM32F103的SPI3与ADS1248通讯,可以下发、读取寄存器的值。
    但是连接上四线制温度传感器后,采用Burnout Current source检测温度传感器的是否连接,读取ADC的数值跳变、甚至出现负值。
    将MUX1设置为0x37,使用内部时钟、使用内部参考源、参考源一直开启、system monitor选择DVDD测量,然后调用读取ADC值的函数,得到的仍然是0x7FFFFF;之后把system monitor选择为AVDD、temperature diode,读取的ADC值依然是0x7FFFFF。
    硬件电路之间的连接是参照ti官方文档上的接线图,万用表测量没有断路。
    读取寄存器的函数为:
    u8 ADS1248_ReadREG(u8 regName, u8 byteToRead)
    {
        SPI3_ReadWriteByte(ADS_RREG | regName);
        if(byteToRead == 1)
        {
            SPI3_ReadWriteByte(0x00);
        }
        else if(byteToRead == 2)
        {
            SPI3_ReadWriteByte(0x01);
            SPI3_ReadWriteByte(0xFF);
        }

        return SPI3_ReadWriteByte(0xFF);
    }
    读取ADC值的函数为
    s32 ADS1248_ReadADC(void)
    {
        u8 temp[3];
        s32 adcVal = 0;

        while(ADS1248_READY_PIN()) //DRDY引脚高电平表示数据没准备好
        {
        }

        SPI3_ReadWriteByte(ADS_RDATA);
        temp[0] = SPI3_ReadWriteByte(0xFF);
        temp[1] = SPI3_ReadWriteByte(0xFF);
        temp[2] = SPI3_ReadWriteByte(0xFF);
        adcVal = (s32)(temp[0] << 24) + (temp[1] << 16) + (temp[2] << 8); // 左移8位,放大256倍识别正负号
       
        return (adcVal >> 8); // 右移8位恢复原值
    }


    希望各位大神可以指点迷津!!

回帖(3)

甘孟杰

2024-12-23 14:36:50
读取的ADC值依然是0x7FFFFF。 是代表 ADC 模拟通道信号超出最大允许范围了, 检查一下信号吧
举报

陈萌

2024-12-23 14:37:06
是VREFout与VREFCOM之间的参考电压不稳定,增大电容就可以解决
举报

王越建

2024-12-23 17:43:59
根据您提供的信息,您在使用STM32F103的SPI3与ADS1248通信时,读取的ADC值波动很大,甚至出现负值。以下是一些可能的原因和解决方案:

1. 硬件连接问题:请确保您的硬件连接正确,包括电源、地线、SPI接口等。您可以使用万用表检查连线是否正确连接,确保没有短路或断路。

2. 时钟问题:请检查您的STM32F103的SPI时钟设置是否正确。确保SPI时钟频率与ADS1248的时钟频率兼容。您可以在STM32F103的SPI配置中设置时钟频率,以确保与ADS1248的时钟频率匹配。

3. ADS1248配置问题:请检查您的ADS1248配置是否正确。根据您的描述,您已经设置了MUX1为0x37,使用内部时钟、内部参考源、参考源一直开启、system monitor选择DVDD测量。请确保这些设置正确无误。

4. 温度传感器问题:您提到使用了四线制温度传感器,并且采用了Burnout Current source检测温度传感器是否连接。请检查温度传感器的连接是否正确,以及Burnout Current source是否正常工作。

5. 读取ADC值函数问题:您提到了读取寄存器的函数为u8 ADS1248_ReadR。请检查该函数的实现是否正确,确保SPI通信正常进行,并且正确读取ADC值。

6. 干扰问题:请检查您的电路是否存在电磁干扰,这可能导致ADC值波动。您可以尝试使用屏蔽线、地线等方法减少干扰。

7. 软件滤波:如果硬件连接和配置都正确,您可以尝试在软件层面对ADC值进行滤波处理,以减少波动。例如,您可以使用滑动平均滤波、中值滤波等方法。

综上所述,您需要检查硬件连接、时钟设置、ADS1248配置、温度传感器连接、读取ADC值函数以及干扰问题。如果问题仍然存在,您可以尝试在软件层面对ADC值进行滤波处理。希望这些建议能帮助您解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分