简 介: 本文介绍了导航信号采样系统的设计与测试。系统采用STC32G12单片机作为核心,通过两级放大电路(包括可编程运放MCP6S21)采集150kHz导航信号。电路设计中包含LC谐振接收回路、ADC缓冲隔离和TL431提供的2.5V参考地。实验结果表明,增加ADC缓冲能有效隔离接收信号,防止阻抗变化影响。通过采集256个数据点进行傅里叶变换分析,可准确计算出信号幅度。该系统能实现大动态范围内高频导航信号的稳定测量,为导航信号处理提供了有效的硬件解决方案。

关键词 150kHz导航信号MCP6S21

基于MCP6S21的导航信号采集

AD\Test\2025\December\Sample150kHzSTC32G12MCP6S21.SchDoc

 

01 航信号采样


一、背景介绍

  前面测试了带有外部晶体的 STC32G 单片机采集 150kHz导航信号的稳定性。  通过对采集到的 256 个信号数据,  与 同频率的 cosine,sine 信号进行相关, 从而计算出对应的信号的幅度。 在计算过程中,  通过选择适当的数据窗口以及数据长度, 可以获得非常稳定的信号测量结果。 下面设计一个带有两级放大环节的信号采集电路, 特别是其中一个环节可以通过软件编程改变放大系数, 从而可以测量很大动态范围内的 高频导航信号。

GG00005861586_1920_1080.MP4|_-5

二、电路设计

  设计测试电路。  MCU依然采用 STC32G12 单片机。  导航信号采用 LC 谐振回路接收。  2.5V参考地是由 TL431提供。  原始信号、放大10倍信号以及有 MCP6S21 提供的 可编程放大信号, 分别输入到单片机的三个 ADC 通道。 最后,由单片机从采集到的信号中估计出 150kHz 导航信号的幅度。

GG00006861355_1920_1080.MP4|_-6

  设计单面PCB, 由于线路比较密集,  其中包括有很多跳线。  后面将会 使用 0欧姆电阻完成跳线。  一分钟之后得到实验电路板。  电路板制作的非常完美。

GG00005860828_1920_1080.MP4|_-5

三、焊接测试

  焊接电路,  清洗之后进行调试。  使用 ISP 程序下载模块验证了单片机现在工作正常了。 使用外部晶体工作模式。

GG00003870385_1920_1080.MP4|_-3
  在这次设计中,  LC接收回路的信号经过 ADC 缓冲之后连接到单片机的 ADC 输入。  设置 ADC 分频系数为 2, 采集 256个数据,  可以看到 采集到的数据幅度是恒定的。 这说明了增加了 ADC 缓冲对于接收信号进行隔离, 防止 ADC 输入通道的阻抗变化对于接收信号的 影响的确有效果。
GG00004873157_1920_1080.MP4|_-4

▲ 图1.3.1 采集到的数据 256个数据, ADC分频系数:2

▲ 图1.3.1 采集到的数据 256个数据, ADC分频系数:2

from headm import *
from tsmodule.tsstm32       import *

def getdata():
    ispclearreceive()
    ispsend()
    time.sleep(.5)
    ispcopyreceive()
    time.sleep(.25)

    strall = clipboard.paste().split("\r\n")

    data = []

    for s in strall:
        if len(s) < 20: continue
        ss = s.split(" ")

        for sss in ss:
            if len(sss) != 2: continue
            data.append(int(sss, 16))

    return [a*256+b for a,b, in zip(data[:-1:2], data[1::2])]

ddim = []

for i in range(1):
    d = getdata()
    ddim.append(d[:256])
    printf(i)

tspsave("sample7", ddim=ddim)

printf(d, len(d))

plt.plot(d[:256], lw=3)

plt.xlabel("N", color="steelblue", fontsize=24)
plt.ylabel("ADC", color="steelblue", fontsize=24)
plt.grid(True, which='both', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()

四、输出处理

  首先对采集到的 256 个数据通过补零, 扩展长度 128倍, 通过求取傅里叶变换,  可以得到对应的峰值频率。 这个频率就是采集数据的归一化频率, 为 0.17545。

GG00002873467_1920_1080.MP4|_-2

from headm import *

ddim = tspload('sample7', 'ddim')

d = ddim[0] - mean(ddim[0])
d0 = [0] * len(d)
d = list(d)

for _ in range(127):
    d.extend(d0)

dfft = abs(fft.fft(d))
dfft2 = dfft[:len(dfft)//2]
maxid = where(dfft2==max(dfft2))[0][0]

omiga = maxid/128*2*pi/256
printf(omiga)

plt.plot(dfft, lw=3)

plt.xlabel("N", color="steelblue", fontsize=24)
plt.ylabel("ADC", color="steelblue", fontsize=24)
plt.grid(True, which='both', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
from headm import *
from tsmodule.tsstm32       import *

ispclearreceive()
ispsend()
time.sleep(.5)
ispcopyreceive()
time.sleep(.25)

strall = clipboard.paste().split("\r\n")

printf(strall)

fdim = []

for s in strall:
    if len(s) < 15: continue

    ss = s.split(' ')
    for sss in ss:
        if len(sss) > 0:
            fdim.append(float(sss))

plt.plot(fdim, lw=3)

printf(fdim, len(fdim))

plt.xlabel("N", color="steelblue", fontsize=24)
plt.ylabel("Value", color="steelblue", fontsize=24)
plt.grid(True, which='both', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
from headm import *

strall = clipboard.paste().split("\r\n")

fdim = []

for s in strall:
    if len(s) < 10: continue
    for ss in s.split(" "):
        if len(ss) > 0:
            fdim.append(float(ss))

printf(len(fdim))
printff(mean(fdim), std(fdim))

plt.plot(fdim, lw=3)

plt.xlabel("N", color="steelblue", fontsize=24)
plt.ylabel("Value", color="steelblue", fontsize=24)
plt.grid(True, which='both', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()

  根据之前讨论的方法,  对采集到的数据分别使用 sine,cosine 数据进行加权累加, 计算两个分量,  对数据使用三角形加窗, 这样可以得到信号中 150kHz 正弦信号的分量。  这里采集了 256 次数据。 平均值为 448.1, 标准方差为 0.2242.  由此, 验证了电路板中的 硬件和软件的功能都正常了。

GG00005875195_1920_1080.MP4|_-5
  利用电路板上的 LCD显示三个通道的 信号幅度。  第一个通道是 接收到信号跟随放大信号, 第二个通道是放大11倍之后的信号, 第三个通道是经过 MCP6S21的信号, 现在选择放大倍数为 1.  可以看到, 三个通道测量到的数据的大小, 满足他们之间相互的增益比例关系。

GG00003876420_1920_1080.MP4|_-3
  通过单片机, 设置 MCP6S21内部放大倍数为 3,  此时可以看到, 经过MCP6S21放大之后的信号幅度是前面信号的 3倍。 验证了MCP6S21放大增益是正确的。

GG00002876741_1920_1080.MP4|_-2
  设置MCP6S21放大倍数为 8, 可以看到此时, 原始信号的幅度降低到 5, 经过两级放大后的信号幅值达到了418左右。  数据波动表明电路内部信号中的噪声很小。

GG00002876920_1920_1080.MP4|_-2

▲ 图1.4.1 增益参数与实际放大倍数

▲ 图1.4.1 增益参数与实际放大倍数

  最后, 设置MCP6S21放大倍数为 16倍,  可以看到实际采集到的信号数据还是非常稳定的。

GG00002877161_1920_1080.MP4|_-2

五、采集速度

  利用LED的高电平, 显示采集信号的时间。  这个时间包括有ADC采集, 数据计算在内的时间。 可以看到,采集一个通道的数据消耗大约 10ms 的时间。 三个通道采集需要大约 30ms。  利用这种方式, 可以实时达到每秒钟采集 30 个数据。  用于将来的车模控制是足够了。

GG00004877485_1920_1080.MP4|_-4

 

结    ※


  文测试了利用 MCP6S21作为第二级可编程放大器采集导航信号的方案。  通过优化后的算法, 大大提高了信号幅值检测的精度。  实验结果表明, 即使达到了 将近 150倍的放大,  测量信号幅度仍然非常稳定。

GG00004877603_1920_1080.MP4|_-4


■ 相关文献链接:

● 相关图表链接:

Logo

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

更多推荐