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();
}
按照手册中的时序来看,切换通道后,要第二次读取数据是否才能读到切换通道后的数据,而上述代码中读取到的是上一次切换通道的结果。
是的,现在的用法是等待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;
}
}
我现在的问题是不能用这个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次,还是没得到结果。
经过几天的折腾,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]