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);
}
}
#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 cubeMX 前期项目未生成部分模块,后期需要添加功能模块时出现L6218E错误问题的解决方法
- 解决 在Ubuntu上执行 $adb shell 出现 error:insufficient permissions for device 问题
- 在控制器中添加过滤器,解决中文由jsp到action进而到数据库传输过程中出现的乱码问题(Struts)
- windows8 RP版使用中出现死机问题的解决方法
- java与json互相转换(解决日期问题),js显示json数据时出现日期类型显示[object,object]现象解决!
- 解决qt mysql出现的:无法加载驱动问题
- Ubuntu执行sudo apt-get update出现Failed to fetch.......的问题的解决
- ie7 xp下使用CHtmlView浏览网页,出现崩溃及内存泄漏的问题,仅描述现象,未解决
- 解决ExcuteFile执行命令时出现“无效字符”的问题
- 解决eclipse中执行sql语句时出现中文乱码的问题
- jsonp跨域问题【主要解决的是返回状态码是200,但是js脚本仍然是执行error模块问题】
- Python解决安装模块scikit-learn和python-Levenshtein出现的问题
- BLUENESSG 早一日受苦、早一日解决、早一日浴火重生 Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出现的问题
- bugzilla更新出现perl模块无法安装问题解决办法
- HP M128a打印机安装官网原版驱动出现无法打印的问题解决
- hid keyboard device异常,电脑键盘驱动出现问题,无法输入,利用虚拟键盘解决问题
- 关于VS调试时出现的找不到可执行文件问题的可能的解决办法
- 解决大量TCPIP连接后出现“因为系统缺乏足够缓冲区空间或者因为队列已满无法执行套接字上操作”的问题
- win7 驱动出现问题解决办法
- 编译hadoop-0.20.2源码时执行ant eclipse-files出现.eclipse.templates does not exist问题解决方案