问题描述
PCF8591在循环读取两个通道时,两个通道数据出现交错问题。
例如我们想实现:第一次读取通道一、第二次读取通道二、第三次读取通道一、第四次读取通道二……依次循环
但实际数据:第一次读取的值为0x80服务器托管网、第二次读取的值为通道一的值、第三次读取的值为通道二的值、第四次读取的值为通道一的值……
解决方法
在2003版的PCF8591数据手册第九页我们可以找到如下描述:
大体为:1. 我们本次读取的ADC值为上次转换的ADC值。 2. 第一次读取的值由于没有上次转换,因此上电后第一次读取的值默认为0x80。
也就是说,由于ADC有转换时间,当我们在调用PCF的读取函数时,PCF并不能立刻采样此时的ADC值并返回给我们,而是把上次ADC转换后存储到寄存器里的值返回给了我们,第二次读取时返回的是第一次的值,第三次读取时返回的是第二次的值。但此时也出现了一个问题,我们在第一次读取时,之前并没有ADC采样,没法返回给我们相应的值。因此,PCF在制造时规定,当我们在第一次读取时,默认返回 0x80,也就是十进制的128,刚好是采样8位精度的一半即128/255,这也就是为什么当我们在刚上电时,5V系统下PCF8591读取出来的值是2.5V。
我们可以通过逻辑分析仪抓取到的数据进行验证,可以看到,在第一次读取通道三(即控制字为0x43)时读取到的值为0x80,在第二次读取通道零(即控制字为0x40)时读取到的值是0xFF,实际上这个值是通道三的值。
至此,我们已经明白了为何从PCF8591的多通道读取到的值是错误的,明白了原理,相应的解决办法也就不再困难。
最简单的方法,既然本次读取到的数据是上次的,那我们可以连续读取两次,舍弃第一次读取到的数据,保留第二次读取到的数据。因为第一次的数据是上个通道的,但第二次的数据确确实实是我们想读取的通道的。
上述方法虽然简单,但也有一个较大的缺陷,也就是两次读取到的数据中只有一个是我们想用的,另外一次的数据都是需要被舍弃的,浪费系统资源。其实我们只需要牢记本次读取的值为上次转换得到的即可,假设我们想依次读取三个通道里的值,只需要记住第一次读取的值为默认的0x80,第二次的值为通道一,第三次的值为通道二,第四次为通道服务器托管网三,第五次为通道一,第六次为通道二……以此类推,再做出相应的操作即可。
总结
对于不熟悉的芯片,杜绝主观臆断,一定要大体浏览下芯片手册,要按照芯片手册要求来。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 使用 Guava Retry 优雅的实现重试机制
王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 大家好,我是王有志。今天我会通过一个真实的项目改造案例和大家聊一聊如何优雅的实现 Java 中常用的的重试机制。 业务背景 在我们的系统中当客户完成支付后,保单管理…