Ai8051 ADC/DMA数据问题
使用AiCube生成的Ai8051的程序,P1.0(ADC0)输入1Hz三角波,但使用usb_cdc输出的数据怎么有点乱,里面很多0000数据不知道为什么。研究好久没找到原因,哪位大佬帮忙看下(里面的程序基本都是AiCube生成的)工程文件下载链接
输出的数据如下(1004个,我只了截取一部分,头和尾)
0C39
0000
0C39
0C2C
0000
0C2C
0C1C
0000
0C1C
0C12
0000
0C12
0C07
0000
0C07
0BFD
。。。。。。。
0000
03F4
03E9
0000
03E9
03DC
0000
03DC
03CF
程序如下:
尊敬的用户,您好!
感谢您对国芯人工智能(AiCore)产品的关注与支持。关于您在使用Ai8051芯片时遇到的ADC/DMA数据异常问题,我们已仔细阅读您的描述,并结合技术原理进行分析,以下为可能的原因及建议:
一、问题概述
您提到使用AiCube生成的程序配置了P10(ADC0)采集1Hz三角波,并通过USB CDC输出数据。但实际输出中出现了大量“0000”数据,导致数据不完整或异常。
从您提供的部分数据来看,存在明显的“0000”间隔,且数值波动规律性较强,这可能是由于ADC采样未正确触发、DMA传输异常或USB通信机制未同步所导致。
二、可能原因分析
1. ADC采样频率与信号频率不匹配
您提到输入的是1Hz三角波,而ADC采样频率若设置不当(如低于奈奎斯特频率),可能导致采样点丢失或数据失真。
建议检查ADC的采样率配置是否合理,确保其高于被测信号的两倍频率(即至少2Hz以上)。对于低频信号,可适当提高采样率以增强数据完整性。
2. DMA配置异常或未正确启用
在Ai8051中,DMA用于高效传输ADC采集的数据至内存缓冲区。若DMA未正确初始化或中断未处理,可能导致数据丢失或读取错误。
检查DMA通道是否已正确配置,包括源地址、目标地址、传输长度、触发方式等参数。
确保DMA中断已使能,并在中断服务函数中处理数据缓冲区的读取逻辑。
3. USB CDC通信速率或缓冲区不足
USB CDC接口的数据传输依赖于主机端的接收能力。如果缓冲区大小不足或传输速率不匹配,可能导致部分数据丢失或被丢弃。
检查USB CDC的发送缓冲区大小,确保其足够容纳ADC采集的数据量。同时确认主控端程序是否及时读取数据,避免溢出。
4. ADC通道未正确选择或配置
P10(ADC0)作为ADC输入通道,需确保在代码中正确选择了该通道,并设置了正确的参考电压、分辨率等参数。
若ADC通道配置错误,可能导致采样值始终为零或无效数据。
5. 程序逻辑中存在数据覆盖或读取错误
AiCube生成的代码可能存在逻辑缺陷,例如在DMA完成前就尝试读取数据,或在循环中未正确管理数据指针。
建议检查ADC数据存储区域的访问逻辑,确保在DMA完成后再进行读取操作,避免数据覆盖或读取空值。
三、建议排查步骤
1. 检查ADC配置
确认ADC0通道已启用,并配置了正确的参考电压和分辨率。
验证ADC采样率是否满足信号要求。
2. 验证DMA功能
检查DMA通道是否正常工作,确保ADC数据能够正确传输到缓冲区。
添加调试信息,观察DMA中断是否被触发,以及数据是否被正确写入。
3. 优化USB CDC传输
提高USB CDC的发送缓冲区大小,确保数据不会因缓冲区满而丢失。
在PC端使用串口调试工具(如Putty、XCOM等)实时监控输出数据,判断是硬件问题还是软件问题。
4. 添加调试输出
在关键位置添加打印语句,如ADC采集状态、DMA传输状态、USB发送状态等,帮助定位问题所在。
5. 测试其他ADC通道
尝试使用其他ADC通道(如ADC1、ADC2)进行测试,排除P10本身是否存在硬件或配置问题。
四、总结
您遇到的“0000”数据问题,很可能由ADC采样、DMA传输或USB通信中的某个环节异常引起。建议按照上述步骤逐一排查,重点检查ADC与DMA的协同工作情况,以及USB CDC的数据传输稳定性。
如您愿意提供更详细的代码片段或配置信息,我们将进一步协助您定位问题根源。
如果您有其他技术问题或需要进一步支持,请随时联系我们,国芯人工智能将竭诚为您服务。
国芯人工智能(AiCore)技术团队
2025年4月
[本文内容由国芯人工智能辅助生成,仅供参考] Ai说一堆啥呀,几乎跟没说一样
ADC_DMA的数据解析看这一章节,另外上传下完整工程可帮测试下
ercircle 发表于 2025-8-12 16:41
ADC_DMA的数据解析看这一章节,另外上传下完整工程可帮测试下
工程请见下面,我以为不能上传附件。原来可以
你将数据发串口,使用AiCube-ISP-v6.95Z里的串口绘图功能就可以看到图形。 梁工 发表于 2025-8-12 17:37
你将数据发串口,使用AiCube-ISP-v6.95Z里的串口绘图功能就可以看到图形。
串口绘图看到的图形也不对,因为本身数据就不对。不可能正常数据里面,夹着0000的数据 firefly2k 发表于 2025-8-12 17:54
串口绘图看到的图形也不对,因为本身数据就不对。不可能正常数据里面,夹着0000的数据 ...
这样解析,第一个00是通道号,第二个00是余数
adc初始化修改两行就清晰了,
DMA_ADC_CFG2 = 8; 转换次数改为2,
DMA_ADC_SetChannels(0x0003); 多开一个通道
ercircle 发表于 2025-8-12 18:05
这样解析,第一个00是通道号,第二个00是余数
我不知道是我理解的不对还是大佬看错了
我设置的dma采样是500次,也就是前1000个数据都是采样数据。1001才是通道号,1002是余数,1002-1004是平均值吧?我一次打印的是1004个数据 "USB_SendData(pu8ADCDMABuffer,1004);"
另外,我DMA明明只开启了一个通道,不知道大佬那里怎么变成2个了,说我多开了个通道(0x0003)? DMA_ADC_SetChannels(0x0001)
firefly2k 发表于 2025-8-12 18:16
我不知道是我理解的不对还是大佬看错了
我设置的dma采样是500次,也就是前1000个数据都是采样数据。1001才 ...
03和转换次数是我 改的,为了你方便观察数据格式
页:
[1]
2