硬汉嵌入式论坛

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

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

[复制链接]

20

主题

94

回帖

154

积分

初级会员

积分
154
发表于 2024-3-7 09:42:30 | 显示全部楼层 |阅读模式
[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
*	函 数 名: 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();
}



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

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106757
QQ
发表于 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[7] = ADS1256_ReadData();        /* 注意保存的是上一个通道的数据 */
        }
        else
        {
                g_tADS1256.AdcNow[g_tADS1256.Channel-1] = ADS1256_ReadData();        /* 注意保存的是上一个通道的数据 */
        }
                                
        if (++g_tADS1256.Channel >= 8)
        {
                g_tADS1256.Channel = 0;
        }
}
回复

使用道具 举报

20

主题

94

回帖

154

积分

初级会员

积分
154
 楼主| 发表于 2024-3-7 12:21:10 | 显示全部楼层
我现在的问题是不能用这个DRDY触发中断读取。
我在ADS1256的外部做了一个16选1,接到了ADS1256的通道1,电池电压接到了ADS1256的通道3。单独只读取通道1,或者只读取通道3都能得到正确结果,但是只要切换通道后,就不能得到正确结果了。


[C] 纯文本查看 复制代码
if(ch >= 1 && ch <= 17)
{

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

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

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

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


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

使用道具 举报

20

主题

94

回帖

154

积分

初级会员

积分
154
 楼主| 发表于 2024-3-12 00:08:59 | 显示全部楼层
经过几天的折腾,ADS1256在测量中,对这个电源电压检测仍然有问题,不清楚原因。电路图如下:

屏幕截图 2024-03-11 235912.png
DRDY触发的中断服务中,切换通道,读取电压值。
如果我按照0,1,2,3,0,1,2,3,0,1,2,3这个顺序来切换通道,能够正确的读出分压电路的电压值。
由于,我在Vadc1的前面采用了一个161的电路。当我按照
01111....130111,这样一个ADS1256的通道来读取结果时(其中一串1通道是在切换161的通道),分压器的电压值可以在板子刚刚上电一段时间测到正确值,但随着时间推移,3号通道测量的结果会越来越小,最后趋近于0,非常费解。
能不能指导一下,这是什么原因?

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 19:02 , Processed in 0.276108 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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