ifree 发表于 2024-3-7 09:42:30

bsp_ADS1256驱动中的ADS1256_ReadAdc函数是否有误

/*
*********************************************************************************************************
*        函 数 名: ADS1256_ReadAdc
*        功能说明: 读指定通道的ADC数据
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
int32_t ADS1256_ReadAdc(uint8_t _ch)
{
        /* ADS1256 数据手册第21页 */
        //while (DRDY_IS_LOW());
               
        /* ADS1256 数据手册第21页 */
        ADS1256_WaitDRDY();                /* 等待 DRDY = 0 */
       
        ADS1256_SetChannal(_ch);        /* 切换模拟通道 */       
        bsp_DelayUS(5);
       
        ADS1256_WriteCmd(CMD_SYNC);
        bsp_DelayUS(5);
       
        ADS1256_WriteCmd(CMD_WAKEUP);
        bsp_DelayUS(25);
       
        //ADS1256_WaitDRDY();                /* 等待 DRDY = 0 */
       
        return (int32_t)ADS1256_ReadData();
}


按照手册中的时序来看,切换通道后,要第二次读取数据是否才能读到切换通道后的数据,而上述代码中读取到的是上一次切换通道的结果。


eric2013 发表于 2024-3-7 11:30:55

是的,现在的用法是等待DRDY信号触发外部中断,在中断里面读取的,区分了对应的通道号。

/*
*********************************************************************************************************
*      函 数 名: ADS1256_ISR
*      功能说明: 定时采集中断服务程序
*      形    参:无
*      返 回 值: 无
*********************************************************************************************************
*/
void ADS1256_ISR(void)
{
      /* 读取采集结构,保存在全局变量 */                                       
      ADS1256_SetChannal(g_tADS1256.Channel);      /* 切换模拟通道 */      
      bsp_DelayUS(5);
      
      ADS1256_WriteCmd(CMD_SYNC);
      bsp_DelayUS(5);
      
      ADS1256_WriteCmd(CMD_WAKEUP);
      bsp_DelayUS(25);
      
      if (g_tADS1256.Channel == 0)
      {
                g_tADS1256.AdcNow = ADS1256_ReadData();      /* 注意保存的是上一个通道的数据 */
      }
      else
      {
                g_tADS1256.AdcNow = ADS1256_ReadData();      /* 注意保存的是上一个通道的数据 */
      }
                              
      if (++g_tADS1256.Channel >= 8)
      {
                g_tADS1256.Channel = 0;
      }
}

ifree 发表于 2024-3-7 12:21:10

我现在的问题是不能用这个DRDY触发中断读取。
我在ADS1256的外部做了一个16选1,接到了ADS1256的通道1,电池电压接到了ADS1256的通道3。单独只读取通道1,或者只读取通道3都能得到正确结果,但是只要切换通道后,就不能得到正确结果了。


if(ch >= 1 && ch <= 17)
{

        analog_channel_select(ch);                        // 16路选1,切换通道
        osDelay(5);
        ADS1256_ReadAdc(1);                                        // 切换通道后,第1次读取到的是上一次的结果
        osDelay(5);

        gAdcChannelData.SampleValue = ADS1256_ReadAdc(1);        // 读取16路选1的电压

}
if(ch == CHANNEL_VIN)
{
        osDelay(5);
        ADS1256_ReadAdc(3);                                        // 切换通道后,第1次读取到的是上一次的结果
        osDelay(5);
        gAdcChannelData.SampleValue = ADS1256_ReadAdc(3);        // 读取电池电压
}

if(++ch > 17)
{
        ch = 1;
}

我切换通道后,多读取1次,还是没得到结果。

ifree 发表于 2024-3-12 00:08:59

经过几天的折腾,ADS1256在测量中,对这个电源电压检测仍然有问题,不清楚原因。电路图如下:
在DRDY触发的中断服务中,切换通道,读取电压值。如果我按照0,1,2,3,0,1,2,3,0,1,2,3这个顺序来切换通道,能够正确的读出分压电路的电压值。 由于,我在Vadc1的前面采用了一个16选1的电路。当我按照0,1,1,1,1,....,1,3,0,1,1,1,这样一个ADS1256的通道来读取结果时(其中一串1通道是在切换16选1的通道),分压器的电压值可以在板子刚刚上电一段时间测到正确值,但随着时间推移,3号通道测量的结果会越来越小,最后趋近于0,非常费解。 能不能指导一下,这是什么原因?
页: [1]
查看完整版本: bsp_ADS1256驱动中的ADS1256_ReadAdc函数是否有误