您的位置:首页 > 其它

stm32F407控制器在驱动电机等执行机构时,ADS1256采集模块出现死机现象,问题待解决

2018-03-23 15:38 841 查看
原代码段
#define WaitDRDY  while((GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY))){;}
//一旦ADS1256出现死机,会出现DRDY低电平高不到,从而陷入死循环。建议更改下面的有限循环代码段
void WaitDRDY_Process(void)
{
while((GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY)))
  {
WaitDRDYcount++;
 if(WaitDRDYcount>0xfdd)
{
WaitDRDYcount=0;
break;
}
}
WaitDRDYcount=0;
}
读取ADS1256某一通道数据代码
long double tRDATA(unsigned char channel)
{
static u32 stsum=0,ch;
ch=((channel << 4) | ADS1256_MUXN_AINCOM);
stsum=0;
CS_ADS1256;//片选
//WaitDRDY;//用下面代码代替
WaitDRDY_Process();
ADS1256WREG(ADS1256_MUX,ch);//通道选择
ADS1256_Delay_us(5);
ADS1256WCMD(ADS1256_CMD_SYNC); //0xfc 心跳
ADS1256_Delay_us(5);
ADS1256WCMD(ADS1256_CMD_WAKEUP); //0x00 唤醒
stsum=ADS1256ReadData();
ADS1256_Delay_us(10);
deCS_ADS1256;
return int_longdouble(stsum);
}
问题:
ADS1256在控制器驱动执行机构时,可能会引入有线传导干扰,出现 WaitDRDY 或  WaitDRDY_Process(void) 读取不到高电平,导致进入死循环。
从而导致ADS1256读取到的数据为异常值,全111111111/22222222、fffffffff之类的。
分析: WaitDRDY 或  WaitDRDY_Process(void) 读取不到高电平,说明此时ADS1256数据不可用。读出来的数据非常大是正常的。
       此时应该中止继续读取ADS1256的值,直接return跳出。

建议 程序更改:

u8 WaitDRDY_Process(void)
{
while((GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY)))
       {
WaitDRDYcount++;
       if(WaitDRDYcount>0xfdd)
{
WaitDRDYcount=0;
return 1;
}
}
WaitDRDYcount=0;
        return 0;
}

long double tRDATA(unsigned char channel)
{
static u32 stsum=0,ch;
        u8 ret=0;
ch=((channel << 4) | ADS1256_MUXN_AINCOM);
stsum=0;
CS_ADS1256;
//WaitDRDY;
ret=WaitDRDY_Process();//读取不到低电平,直接返回1,否则返回0
        if(ret)  
       {
        deCS_ADS1256;
        return;
        }
        else
{
        ADS1256WREG(ADS1256_MUX,ch);
ADS1256_Delay_us(5);
ADS1256WCMD(ADS1256_CMD_SYNC); //0xfc
ADS1256_Delay_us(5);
ADS1256WCMD(ADS1256_CMD_WAKEUP); //0x00
stsum=ADS1256ReadData();
ADS1256_Delay_us(10);
deCS_ADS1256;
return int_longdouble(stsum);
        }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stm32 AD
相关文章推荐