简 介: 本文测试了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单片机。  这样便可以完成电磁导航信号双点磁场数据测量的需要了。

GG00004640813_1920_1080.MP4|_-4

二、测试电路

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

GG00004624304_1920_1080.MP4|_-4
  一分钟之后得到测试电路板。  电路板制作的非常完美。

GG00002624863_1920_1080.MP4|_-2

三、焊接测试

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

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

GG00003634915_1920_1080.MP4|_-3

四、ADC采集

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

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

GG00005636444_1920_1080.MP4|_-5

五、读取波形

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

GG00004640489_1920_1080.MP4|_-4
 

  结 ※


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

GG00004640673_1920_1080.MP4|_-4

#!/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
#============================================================


Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐