大佬们好,上个帖子听劝,我回去将时序拉长到了三百多毫秒,然而仍旧出现了单片机读取电平不稳定的情况,而ADC响应和采集的电平都是正常的。希望各位大佬能够再次给予帮助,非常感谢。
以下是采集和通信均正常的数据,附上一些解算
0.200V波形 采集正常
对应时序解读出电压信号对应值为0001010010100100,转换为电压值为:0.2015V 相应的,pc对应二进制应当为10000101 0010 1001 0000 0000, 对应十六进制数为85 29 00
0.200V电脑接收到单片机的数据 正常,与解算数据相符
0.206V 采集正常
对应时序解读出电压信号对应值为0001010101001011,转换为电压值为:0.2079V 相应的,pc对应二进制应当为10000101 0101 0010 1100 0000, 对应十六进制数为85 52 C0
0.206V电脑接收到单片机的信号 正常(可能是我延迟截图了)
下面附上不正常的数据:
1V 对应时序(局部)
1V 对应时序(整体)
1V对应时序(局部)PC端采集异常
2V 对应 PC 端采集异常
2V 对应时序波形正常
对应时序解读出电压信号对应值为1100111000100111,转换为电压值为:2.013V 相应的,pc端对应二进制应当为10110011 1000 1001 1100 0000
解算时序各电平代表的信息如下:
以0.5V为例:0(起始) 01001000(地址+写) 0(应答位) 10110000(通道选择:10+使能+单通道+0端采集) 0(应答) 10(重复起始) 01001001(地址+读) 0(应答)10001100 0(应答)11100011 0(应答)01000000 1(结束)
时序解读结果完全符号编程内容,ADC传输出来的数据亦符合设定结果,下面根据数据手册对采集的ADC数据进行换算。思路为扣除前面两位符号位,舍弃最后六位固定为0的数据,中间应答位也需扣除,得到ADC所采集电压信息对应的二进制数。之后依照手册中电压对应范围,将二进制数转换为十进制数X,依据钻换关系得到电压大小:X*2.5/2^16 我个人困惑的地方: 1、adc响应根据示波器来看是没有问题的,但是问题是出在传给单片机时候出问题,还是单片机在处理数据时候出现了问题呢? (代码在上上篇帖子:使用ai801u通过硬件i2c沟通外部adc采集电压信号,最终将数据通过usb传入pc端 https://www.stcaimcu.com/thread-19594-1-1.html (出处: 国芯人工智能技术交流网站)
2、如果是单片机处理数据时候出现了问题,我个人有个猜测是不是数据位中间穿插的ack应答位导致的?adc发出来的数据是24bit,但是中间他们会每8位插入一个应答,似乎是硬件要求。但这个在我的代码上,我只调用了寄存器去收发24bit数据,我并没有手动加入ack的代码。会不会是单片机没有处理好ack(并且ack附近经常出现尖峰)。另外我之前还使用过软件ic协议,当时编写代码也没有加入ack,而且能pc端和单片机能正常采到数据,只是后来因为位数不够所以更换了单片机,并且改成了硬件i2c。
|