找回密码
 立即注册
查看: 174|回复: 18

Ai8051 ADC/DMA数据问题

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-08-17 18:18:56

18

主题

58

回帖

323

积分

中级会员

积分
323
发表于 2025-8-12 14:59:08 | 显示全部楼层 |阅读模式
使用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


程序如下:
截图202508121454437515.jpg

截图202508121455048087.jpg

截图202508121455256228.jpg



回复

使用道具 举报 送花

3

主题

2031

回帖

910

积分

等待验证会员

积分
910
发表于 2025-8-12 15:03:00 | 显示全部楼层
尊敬的用户,您好!

感谢您对国芯人工智能(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月

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

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-08-17 18:18:56

18

主题

58

回帖

323

积分

中级会员

积分
323
发表于 2025-8-12 15:17:11 | 显示全部楼层
Ai说一堆啥呀,几乎跟没说一样
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:276
  • 最近打卡:2025-08-23 14:05:57
已绑定手机

80

主题

2983

回帖

6363

积分

荣誉版主

无情的代码机器

积分
6363
发表于 2025-8-12 16:41:44 | 显示全部楼层

ADC_DMA的数据解析看这一章节,另外上传下完整工程可帮测试下
截图202508121641132409.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-08-17 18:18:56

18

主题

58

回帖

323

积分

中级会员

积分
323
发表于 2025-8-12 17:27:43 | 显示全部楼层
erci*** 发表于 2025-8-12 16:41
ADC_DMA的数据解析看这一章节,另外上传下完整工程可帮测试下


工程请见下面,我以为不能上传附件。原来可以
dma.7z (117.95 KB, 下载次数: 5)
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:158
  • 最近打卡:2025-08-23 11:06:14

76

主题

6636

回帖

1万

积分

超级版主

积分
13863
发表于 2025-8-12 17:37:47 | 显示全部楼层
你将数据发串口,使用AiCube-ISP-v6.95Z里的串口绘图功能就可以看到图形。
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-08-17 18:18:56

18

主题

58

回帖

323

积分

中级会员

积分
323
发表于 2025-8-12 17:54:09 | 显示全部楼层
梁*** 发表于 2025-8-12 17:37
你将数据发串口,使用AiCube-ISP-v6.95Z里的串口绘图功能就可以看到图形。

串口绘图看到的图形也不对,因为本身数据就不对。不可能正常数据里面,夹着0000的数据

点评

这样解析,第一个00是通道号,第二个00是余数 [attachimg]111609[/attachimg] adc初始化修改两行就清晰了, DMA_ADC_CFG2 = 8; 转换次数改为2, DMA_ADC_SetChannels(0x0003); 多开一个通道 [attachimg]111610[/a  详情 回复 发表于 2025-8-12 18:05
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:276
  • 最近打卡:2025-08-23 14:05:57
已绑定手机

80

主题

2983

回帖

6363

积分

荣誉版主

无情的代码机器

积分
6363
发表于 2025-8-12 18:05:42 | 显示全部楼层
firef*** 发表于 2025-8-12 17:54
串口绘图看到的图形也不对,因为本身数据就不对。不可能正常数据里面,夹着0000的数据 ...


这样解析,第一个00是通道号,第二个00是余数
截图202508121804203777.jpg


adc初始化修改两行就清晰了,
DMA_ADC_CFG2 = 8; 转换次数改为2,
DMA_ADC_SetChannels(0x0003); 多开一个通道
截图202508121805379553.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-08-17 18:18:56

18

主题

58

回帖

323

积分

中级会员

积分
323
发表于 2025-8-12 18:16:36 | 显示全部楼层
erci*** 发表于 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)

点评

你应该想设置的其实是这个转换次数DMA_ADC_CFG2 ,最高支持256次,这个参数暂时AiCube上还没配置的地方,已反馈后续版本会加上。 [attachimg]111616[/attachimg] 代码里500配置的是扫描次数: [attachimg]111617[/  详情 回复 发表于 2025-8-12 18:45
03和转换次数是我 改的,为了你方便观察数据格式  详情 回复 发表于 2025-8-12 18:28
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:276
  • 最近打卡:2025-08-23 14:05:57
已绑定手机

80

主题

2983

回帖

6363

积分

荣誉版主

无情的代码机器

积分
6363
发表于 2025-8-12 18:28:44 | 显示全部楼层
firef*** 发表于 2025-8-12 18:16
我不知道是我理解的不对还是大佬看错了
我设置的dma采样是500次,也就是前1000个数据都是采样数据。1001才 ...

03和转换次数是我 改的,为了你方便观察数据格式
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-8-24 06:42 , Processed in 0.150599 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表