测试AI8051U的双路 ADC的DMA功能
本文测试了AI8051U单片机的双路ADC DMA功能,旨在验证其八路信号采集能力。通过设计单面PCB测试板,设置外部32MHz晶体时钟,成功验证了单片机运行在外部时钟下的性能。测试显示ADC采集时间与分频系数和DMA通道数相关,八路ADC数据在10kHz时同相,150kHz时出现相位差。实验利用USB直接通讯,但发现添加DMA功能后程序偶发异常,具体原因尚待排查。该方案为后续四通道导航信号采集板
简 介: 本文测试了AI8051U单片机的双路ADC DMA功能,旨在验证其八路信号采集能力。通过设计单面PCB测试板,设置外部32MHz晶体时钟,成功验证了单片机运行在外部时钟下的性能。测试显示ADC采集时间与分频系数和DMA通道数相关,八路ADC数据在10kHz时同相,150kHz时出现相位差。实验利用USB直接通讯,但发现添加DMA功能后程序偶发异常,具体原因尚待排查。该方案为后续四通道导航信号采集板设计奠定了基础。
关键词: AI8051U
??AI8051U??ADC
**AD\Test\2026\January\TestAI80512CHDMAADC.SchDoc ***
01 AI8051U双路ADC的DMA功能
一、测试目的
后面需要利用 AI8051U单片机设计四通道导航信号的采集板。 下面需要对它能够完成八路 ADC信号采集进行测试。 完成测试之后, 可以将现在的两通道信号采集板移植到 AI8051U单片机。 这样便可以完成电磁导航信号双点磁场数据测量的需要了。

二、测试电路
设计测试电路。 将外部的八个通道的 ADC 都连接到同一个外部输入信号端口。 此外为了保证采集 150kHz信号的精度, 设置了外部的 32MHz的晶体时钟电路。 铺设单面PCB, 使用一分钟制板方法得到测试电路板。

一分钟之后得到测试电路板。 电路板制作的非常完美。

三、焊接测试
焊接电路。 使用弹簧夹子将单片机接入计算机USB 端口。 单片机可以被计算机识别。 下载基础程序, 单片机运行正常。 后面测试单片机的 ADC的基本功能。

通过软件设置系统时钟, 使用外部 32MHz的晶体时钟。 设置内部系统时钟经过八分频之后, 从P4.7 端口输出。 测量该端口的信号, 为 4MHz, 正好为内部系统时钟的八分之一。 由此验证了 AI8051U 单片机现在能够运行在 外部晶体时钟信号上。

四、ADC采集
使用外部LED的高电平指示 ADC 采集时间。 设置八个通道的 ADC, 利用 DMA 将信号传输到内存。 所需要的时间大约为28ms。 下面,修改ADC的分频时钟。 由原来设置参数 0x20 修改为 0x28。 令人感到奇怪的是, ADC转换时间居然没有改变。

不过再次测量, 改变 ADC 的分频系数。 可以看到采集时间随着分频系数的增加逐步增加。 也许刚才测试的时候没有能够记录下正确的数值。 现在都正常了。 此外ADC采集时间也与 ADC设置的DMA 通道数成正比。

五、读取波形
读取 AI8051U内部 ADC缓冲区。 设置输入信号为 10kHz, 可以看到 八路 ADC的数据几乎是同相的。 当输入信号的频率提高到 150kHz的时候, 每一路ADC之间的时间差就造成了他们之间存在的相位差。 八个ADC通道相位差是相同的。

※ 总 结 ※
本文测试了基于 AI8051U单片机进行八个通道数据采集的方案。 利用了 AI8051U 能够直接连接 USB 的特性, 可以直接利用 USB对 AI8051U进行程序下载以及数据通讯。 但是在添加了 ADC的DMA 功能之后, 也出现了程序运行不正常的情况。 具体原因现在还不太清楚。

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY -- by Dr. ZhuoQing 2026-01-17
#
# Note:
#============================================================
from headm import *
from tsmodule.tsstm32 import *
#------------------------------------------------------------
ispsend("s")
time.sleep(1)
def getdata(n):
ispclearreceive()
ispsend('a %d'%n)
time.sleep(.5)
ispcopyreceive()
time.sleep(.1)
s = clipboard.paste().split("\r\n")
data = []
for ss in s:
if len(ss) < 10: continue
sss = ss.split(' ')
for a in sss:
if len(a) == 0: continue
data.append(int(a, 16))
data = [a*256+b for a,b, in zip(data[::2], data[1::2])]
return data[:256]
#------------------------------------------------------------
for i in range(8):
d = getdata(i)
plt.plot(d, lw=3)
plt.xlabel("N", color="steelblue", fontsize=24)
plt.ylabel("data", color="steelblue", fontsize=24)
plt.grid(True, which='both', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
#------------------------------------------------------------
# END OF FILE : TEST1.PY
#============================================================
更多推荐



所有评论(0)