有关光照模块的具体问题及解决方案
问题1:串口助手无法打印出数据
分析问题:串口未接通,或许是缺少了什么必要的东西,找串口相关知识,
解决过程:重新定义光照模块引脚,更改数据处理的位置(采集数据就直接处理),直接在mread()函数内完成对对数据的处理,并进行测试;
解决方法:Use MicroLIB未被选中,是KEIL自带的一个简易的库,:使用printf的时候重映像使用;选中后,使用printf函数时,就会从串口1输出字符串,直接默认定向到串口1,在串口助手上打印出来1;
结 果:可以打印数据,产生问题2;
问题2:数据接收不稳定,时好时坏
分析问题:接触不良,包括USB与电脑,杜邦线与芯片上的排针,模块与芯片之间的杜邦线连接,都会导致数据传输不稳定的情况;
采取措施:使用万用表测量模块vcc与gnd两端电压,与数据手册相对应(光照模块正常工作的额定电压范围);使用标有二极管的那个档位检查模块线路的通断情况,模块与32 芯片的连接情况,得出的结果是,模块与32板子的接触不良,不稳定;使用万用表电压档位,测量模块工作电压,在额定值范围内;,二极管图标档位检测线路,断断 续续,不稳定;(线路接通则响,断路则不响)
解决方法:更换下载器与电脑的接口,更换杜邦线,使各个接线点接触良好,排除线路连接问题;
结 果:打印数据稳定,产生问题三。
问题3:数据打印,但一直打印同一组数据
可能原因:1》可以打印出东西来,说明串口到电脑是相通的,排除串口的问题;2》一直回显变量的初始值0,可能是模块采集的数据没有传到串口中,打印之前变量未被重新赋值;
解决过程:使用示波器采集sda与scl端口的波形,未采集到任何波形,说明光照模块与单32单片机之间没有数据的传输;
左图为引脚初始化后,右图为引脚未初始前;
解决办法:检查代码,发现是引脚未被初始化,导致光照模块采集的数据发送不出去,导致这个问题的产生,将引脚初始化加进去之后再次用示波器检测,得到两次不同的结果,如上图:
结 果:运行结果如下,产生问题4;
问题4:数据一直是一个特殊值65535(2^16-1)
可能原因:写测量指令与读测量结果都是由IIC接口完成,查阅IIC资料得,模块从地址不对应时会通过IIC传输数据的初始值0xFFFF,即65535;指令下达的不正确会产生类似的问题,包括 IIC从属地址与命令,(可以再数据手册中找到对应的功能代码及指令);
解决过程:从最终打印的变量一步一步往回倒推,找到最初的变量将其打印出来,是符号? F B,(无符号字符型数据);
一步一步打印出数据,查看是哪一部出路问题;
解决办法:根据数据手册所描述,ADDR接GND时从属地址为0x46,接vcc端时从属地为0xA8;根据数据手册所提供的信息将其修改过来;
结 果:得到的数值是固定值,数值没有实时更新;
问题5:数值不实时更新,如上图
可能原因:数值未被实时赋值,打印出来的数据没变化一直没有更改;
解决过程:认为是延时的问题,延时太短数据来不及重新赋值;
更改延时函数,使用Systick普通计数模式控制延时,这样比之前的while(i--)循环延时要精确一些,增加延时间隙,让变量能够被实时赋值;
改变延时并未达到理想的效果;
解决方法:mread()函数里面,划红线部分是对数据dis_data进行处理赋值给date[0],没有再对其进行改变,之后通过串口打印date[0],造成上述结果;
将date [0]更改为date,i与for循环中的i一致,取得三次数据的平均值后,打印出date[0];date随着for循环i的增加而实时变换,就达到了数据实时变换的供能;
得到最终结果:
改变外界环境(用手电筒补光,或拿东西盖住光照传感器),使得数据有变换,模块调通,还缺一个步骤,需要一个转换公式,采集数据总结规律,将公式写进代码之中,就可以得到想要的结果。