电磁信号检波方案:是否多此一举?

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了电磁信号检波方案:是否多此一举?相关的知识,希望对你有一定的参考价值。

电磁信号放大检波方案对比

 

01 大检波


一、背景介绍

  今天看到同学们留言询问关于电磁组信号调理电路的问题。 在这个电路中,运放采用了单电源输出轨到轨放大器形式。 当零偏置LC谐振电压信号输入放大器之后, 运放的输出信号是放大后的半波整流信号。 因此后面的倍压整流电路 实际上就没有作用了, 只需通过一个RC低通滤波电路,便可以获得放大后直流信号了。

  对于这个电路来说, 所使用的运放型号为OPA340。 这是TI公司出品的CMOS轨到轨运算放大器。 这是官网给出的工作范围。 运放工作电压范围从2.7V到5.5V, 频带宽度为5.5MHz, 输入输出电压范围都可以满足轨到轨。  因此这颗芯片还是比较和适用于电磁信号放大检波的。

  但这里留下一个问题, 那就是这个集成了半波放大与倍压整流的电路是否属于脱了裤子放屁,多此一举呢?它的实际效果如何呢? 下面通过仿真来测试一下。

二、初步仿真

  这是利用AD824在LTspice搭建半波放大电路, 输入幅值0.1V,20kHz正弦波,它的输出的确是放大11倍的半波正弦。 将运放型号改为LT1677, 对应的放大波形正半周信号更大一些。 下面就在此基础上搭建被压检波电路。

▲ 图1.2.1 基于LT1677半波放大整流电路

▲ 图1.2.2 仿真后的输入输出波形

  这是在前面半波放大检波电路之后增加了两组电路, 一个是对半波信号进行倍压整流, 另一个是对检波信号直接进行滤波。 下面对比两者所能够得到的信号特点。 这是LTspice给出的仿真信号。 蓝色是半波信号, 绿色是倍压整流后的直流信号信号, 橙色是直接滤波后的直流信号。 可以看到倍压整流后的信号是直接滤波直流信号幅值大约3倍。 因此,利用背压整流还是有一定的优势的。

▲ 图1.2.3 测试仿真电路

▲ 仿真电路中的波形

三、动态范围

  那么问题来, 这两种方案, 究竟哪一种更优呢? 如果从电路实现上来看, 显然直接滤波电路会更加简单,只需要一个电阻和电容即可。 如果觉得这种方案输出电压增益不够,可以通过改变前级放大倍数来弥补。 下面我们通过逐步增加输入电压幅值, 来绘制出两种方案对应的输入输出检波曲线。 从而可以获得两种检波方案动态范围, 然后进行性能对比分析。

  这是仿真结果,橙色曲线是倍压检波输出直流信号,蓝色是阻容滤波直流信号。 可以看两者具有大体相同的线性建波范围,在0.02V到0.45V之间,输出电压与输入交流信号幅值大体呈现线性关系。 在小信号下,倍压检波有一个死区,大约为20mV左右。 中间部分,倍压检波放大倍数较大。 当输入信号比较大时,可以看到倍压检波输出饱和了,而直接滤波的输出电压则呈现较为温和的上升。 从这一点来讲,直接滤波对于输入信号动态范围要比倍压检波更宽。这是它的优点。 但直接滤波方法, 它的输出电压最高之比2V多一点,因此对于3.3V,或者更高单片机ADC输入范围来讲,直接滤波后的信号进行一级2倍的放大效果会更好一些。 反而对于倍压检波,如果对于3.3V的ADC输入则需要进行限幅处理。 可以看到两种方法各自具有不同的优缺点。

1、仿真结果

(1)处理TXT文件的程序

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# EXEC1.PY                     -- by Dr. ZhuoQing 2022-12-16
#
# Note:
#============================================================

from headm import *

txtfile = r'D:\\Temp\\AmplifyRect.txt'

tdim = []
out1dim = []
out2dim = []
outdim = []
vdim = []
ldim = []

with open(txtfile, 'r') as f:

    t = []
    v1 = []
    v2 = []
    v = []

    for l in f.readlines():
        if l.find('time') >= 0: continue
        if l.find('Step Information:') >= 0:
            #------------------------------------------------
            if len(t) > 0:
                ldim.append(len(t))
                tdim.extend(t)
                out1dim.extend(v1)
                out2dim.extend(v2)
                outdim.extend(v)


            t = []
            v1 = []
            v2 = []
            v = []
            #------------------------------------------------
            id = l.find('V=')
            if id >= 0:
                value = l[id+2:].split(' ')[0]

                ratio = 1.0
                if value[-1] == 'm':
                    ratio = 1e-3
                    value = value[:-1]

                vval = float(value) * ratio

                vdim.append(vval)
                printf(vval)
            continue

        lseg = l.split()
        t.append(float(lseg[0]))
        v1.append(float(lseg[1]))
        v2.append(float(lseg[2]))
        v.append(float(lseg[3]))


#------------------------------------------------------------
tspsave('measure2', vdim=vdim, ldim=ldim, t=tdim, out1=out1dim, out2=out2dim, out=outdim)
printf('\\a')





#------------------------------------------------------------
#        END OF FILE : EXEC1.PY
#============================================================

(2)绘制仿真结果

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# PROC1.PY                     -- by Dr. ZhuoQing 2022-12-16
#
# Note:
#============================================================

from headm import *

vdim, ldim, t, out1, out2, out = tspload('measure1', 'vdim', 'ldim', 't', 'out1', 'out2', 'out')

printf(vdim, ldim)
#------------------------------------------------------------
def segdata(sid):
    if sid < 0 or sid >= len(vdim): return [],[],[],[]

    startid = sum(ldim[:sid])
    endid = sum(ldim[:sid+1])

#    printf(startid, endid)

    return t[startid:endid], out1[startid:endid], out2[startid:endid], out[startid:endid]

#------------------------------------------------------------
'''
t,o1,o2,o = segdata(20)

printf(t)

plt.plot(t, o1, label='Out1')
plt.plot(t, o2, label='Out2')
plt.plot(t, o, label='Out')

plt.xlabel("Time(s)")
plt.ylabel("Output(V)")
plt.grid(True)
plt.tight_layout()
plt.legend(loc='upper right')
plt.show()
'''
#------------------------------------------------------------
vindim = []
v1dim = []
v2dim = []
for i in range(len(vdim)-1):
    t,o1,o2,o = segdata(i)
    seglen = len(o1)//8
    v1 = mean(o1[-seglen:-1])
    v2 = mean(o2[-seglen:-1])
    vindim.append(vdim[i])
    v1dim.append(v1)
    v2dim.append(v2)

    printff(v1,v2)


plt.plot(vindim, v1dim, label='Out1')
plt.plot(vindim, v2dim, label='Out2')

plt.xlabel("Input(V)")
plt.ylabel("Output(V)")
plt.grid(True)
plt.legend(loc="upper right")
plt.tight_layout()
plt.show()






#------------------------------------------------------------
#        END OF FILE : PROC1.PY
#============================================================

▲ 图1.3.1 第一次仿真结果

▲ 图1.3.2 第二次仿真结果

▲ 图1.3.3 第三次测量结果

 

  结 ※


  文对于20kHz电磁导航信号放大检波两种方案进行仿真对比, 可以看到它们各自有不同的优缺点。 直接滤波方案电路简单,检测信号动态范围较大,但输出直流信号较低; 倍压检波则输出直流信号范围大,但电路复杂,小信号下有死区。 好的检测硬件方案还需要配合后期的处理软件才能够发挥更大的优势。


● 相关图表链接:

以上是关于电磁信号检波方案:是否多此一举?的主要内容,如果未能解决你的问题,请参考以下文章

基于8002B完成 20kHz电磁导航信号检测

是否可以使用 8002B 完成电磁信号放大检波?

是否可以使用 8002B 完成电磁信号放大检波?

全距离测量150kHz导航信号放大检波能力

信号调制与二极管检波电路的multisim仿真

信号调制与二极管检波电路的multisim仿真