关于软件识别下降沿动作一个注意事项总结

项目背景是写一个测量阻抗的ADC芯片(AFE模拟前端)芯片驱动。


问题背景:

测量原理是该ADC芯片可以测量外接阻容网络的阻抗和相位,将外接阻抗的阻值(模拟量)转化为AD值(数字量),以80hz或者160hz或者320hz输出。并在AD转换完成后拉高GPIOx 25.12us。转换动作如下:

 因此在读取AD时,检测识别该GPIOx的下降沿,识别到后说明AD转换完成,可以进行读取数据操作。


软件代码如下:

U8 CS1259Ready()
{
	SDAInput;
	uint8 adcReadyFlag=0;
	if (SDAInputHigh)
		{
		//DelayTimeUs(50);
		if (SDAInputLow)
			{
			adcReadyFlag=1;
			//myPrintf(MY_PRINTF_ERROR,"%s(%d) CS1259 conmunication result is %d ;\r\n",__func__,__LINE__,adcReadyFlag);
			}
		}
	SDAOutput;
	return adcReadyFlag;
}

出现的问题是:在320zh的情形下,本来应该是转换完成一个AD值,读取AD值进行处理。但是如下图所示,出现了丢点的情况,而且丢点严重!(备注:该电平为读取AD一次,有一个拉高另一个GPIOx1的动作)

 


问题的原因分析:

为什么会出现丢点严重? 因为实际上,检测下降沿时,分步走应该是检测高电平 -> 检测低电平的过程,而且高电平到低电平形成的下降沿在模拟上是一个缓变的过程。但是该程序中,检测完高电平未做任何延时就直接检测低电平,条件太过苛刻,造成符合该条件的下降沿非常少,造成了严重丢点的情况。


解决的方法:

       在检测完高电平时,延时50us,再检测低电平,可解决上述问题。

U8 CS1259Ready()
{
	SDAInput;
	uint8 adcReadyFlag=0;
	if (SDAInputHigh)
		{
		DelayTimeUs(50);
		if (SDAInputLow)
			{
			adcReadyFlag=1;
			//myPrintf(MY_PRINTF_ERROR,"%s(%d) CS1259 conmunication result is %d ;\r\n",__func__,__LINE__,adcReadyFlag);
			}
		}
	SDAOutput;
	return adcReadyFlag;
}

解决后的现象如下:


总结:

     在解决问题时,需从问题的本质入手,拿这个问题来说,本质上,下降沿从模拟上来说就是一个缓变的过程,因此在软件处理上也要遵从此原则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值