基于MCP6S21制作150kHz采集电路
简 介: 本文介绍了导航信号采样系统的设计与测试。系统采用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 信号进行相关, 从而计算出对应的信号的幅度。 在计算过程中, 通过选择适当的数据窗口以及数据长度, 可以获得非常稳定的信号测量结果。 下面设计一个带有两级放大环节的信号采集电路, 特别是其中一个环节可以通过软件编程改变放大系数, 从而可以测量很大动态范围内的 高频导航信号。


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

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

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

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

▲ 图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。

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. 由此, 验证了电路板中的 硬件和软件的功能都正常了。

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

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

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


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

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

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

■ 相关文献链接:
● 相关图表链接:
更多推荐



所有评论(0)