youzaixiaoya 发表于 6 天前

使用ai801u通过硬件i2c沟通外部adc采集电压信号,最终将数据通过usb传入pc端 后续

大佬们好,上个帖子听劝,我回去将时序拉长到了三百多毫秒,然而仍旧出现了单片机读取电平不稳定的情况,而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(应答)010000001(结束)
时序解读结果完全符号编程内容,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。


国芯人工智能 发表于 6 天前

尊敬的各位大佬,您好:

感谢大家的关注与支持。我目前使用AI801U芯片通过硬件I²C与外部ADC进行通信,采集电压信号,并将数据通过USB传输至PC端。此前已根据建议将时序调整为300多毫秒,但单片机读取电平仍存在不稳定现象,而ADC本身的响应和采集电平均正常。现将部分采集与通信数据附上,供参考。

从附件中可见,当输入电压为0.200V时,ADC采集结果正常,解算出的二进制数据为“0001010010100100”,对应电压值为0.2015V。PC端接收到的数据应为二进制“10000101 0010 1001 0000 0000”,即十六进制“85 29 00”,与预期一致,说明通信过程无误。

同样,当输入电压为0.206V时,ADC采集数据稳定,解算后的二进制为“0001010101001011”,对应电压值为0.2079V,PC端接收到的二进制数据为“10000101 0101 0010 1100 0000”,即十六进制“85 52 C0”,也与预期相符。

以上数据表明,在ADC采集与通信环节均未出现异常,但单片机在读取过程中仍存在电平不稳定的状况。这可能涉及以下几方面原因:

1. I²C总线干扰:由于I²C为半双工通信方式,若外部噪声较大或线路布局不合理,可能导致信号干扰,影响读取稳定性。建议检查I²C引脚的连接质量,确保电源与地线稳定,必要时增加去耦电容。

2. 时序配置问题:虽然已延长时序至300ms以上,但仍需确认是否满足ADC的最短响应时间要求。可尝试进一步延长时序,观察是否能改善读取稳定性。

3. ADC输出状态不确定:某些ADC在未完成转换前可能输出无效数据,需确保在读取前ADC已完成转换并进入就绪状态。可通过查询ADC的忙信号(如RDY)来判断是否可以安全读取。

4. 软件逻辑问题:检查单片机在读取ADC数据时的流程,确保在每次读取前完成必要的等待和同步操作,避免因程序逻辑错误导致读取失败。

综上所述,当前问题可能源于硬件信号稳定性或软件时序控制不够精准。建议结合示波器对I²C时序进行观测,同时优化软件逻辑,以提高系统整体的可靠性。

再次感谢大家的帮助与支持,期待各位前辈的进一步指导!

[本文内容由国芯人工智能辅助生成,仅供参考]

youzaixiaoya 发表于 6 天前

国芯人工智能 发表于 2025-8-18 12:33
尊敬的各位大佬,您好:

感谢大家的关注与支持。我目前使用AI801U芯片通过硬件I²C与外部ADC进行通信,采 ...

烦请转一下人工和技术大佬来帮忙解答,感谢

芯征途 发表于 6 天前

已经发给技术稍后就会解答

ercircle 发表于 6 天前

这个问题貌似没找到完整代码工程及电路图,方便的话上传下看看

另外有没有别的I2C从机或主机可以交叉验证

youzaixiaoya 发表于 6 天前

ercircle 发表于 2025-8-18 15:50
这个问题貌似没找到完整代码工程及电路图,方便的话上传下看看

另外有没有别的I2C从机或主机可以交叉验证


大佬你好,非常感谢回复,不过我不知道完整的代码工程文件怎么上传,在那个帖子里是直接复制粘贴上去的。另外电路图是需要pcb文件还是说需要实物拍照呢

youzaixiaoya 发表于 6 天前

ercircle 发表于 2025-8-18 15:50
这个问题貌似没找到完整代码工程及电路图,方便的话上传下看看

另外有没有别的I2C从机或主机可以交叉验证


嗯,前几天下单买了一个类似功能的ADC模块,只能等明天到货以后接入电路尝试一下了,我现在想法是实现ai8051u自收自发,来看看它是如何处理adc所传输数据的,但想了一下可能无法实现,应该需要另一个单片机,也是只能等明天后天了

ercircle 发表于 6 天前

youzaixiaoya 发表于 2025-8-18 15:54
大佬你好,非常感谢回复,不过我不知道完整的代码工程文件怎么上传,在那个帖子里是直接复制粘贴上去的。 ...

在这里可打包上传工程压缩包,硬件一般 传个原理图PDF文件就行


youzaixiaoya 发表于 6 天前

ercircle 发表于 2025-8-18 16:00
在这里可打包上传工程压缩包,硬件一般 传个原理图PDF文件就行

大佬好,我上传了一个压缩包,里面是代码,原理图我稍后再上传

youzaixiaoya 发表于 6 天前

ercircle 发表于 2025-8-18 16:00
在这里可打包上传工程压缩包,硬件一般 传个原理图PDF文件就行


页: [1] 2 3
查看完整版本: 使用ai801u通过硬件i2c沟通外部adc采集电压信号,最终将数据通过usb传入pc端 后续