AD5934阻抗变换模块实验电路板

举报
tsinghuazhuoqing 发表于 2021/12/27 00:47:51 2021/12/27
【摘要】   ■ 前言 本文讨论了基于AD5934构建阻抗变换模块。并对于它测试相应的阻抗进行实验。   01电路设计 1.原理图设计1 ▲ 实验电路板 原理图 ...

 

■ 前言


本文讨论了基于AD5934构建阻抗变换模块。并对于它测试相应的阻抗进行实验。

 

01电路设计


1.原理图设计1

▲ 实验电路板 原理图

▲ 实验电路板 原理图

2.PCB版图

▲ 实验电路板PCB

▲ 实验电路板PCB

电路板输出接口从右到左,前四个的功能定义如下表。后面四个是用于调试使用。

管脚(从右到左) 符号 功能
1 MCLK 转换时钟。从DS345给出
2 VOUT 激励信号。从板上AD8606运放输出
3 GNDA 模拟地
4 VIN 信号输入。进入板上AD8606跟随

3.C51程序

  • 时钟频率35MHz, UART:460800

C51程序以及Python程序详见后面的附录。

▲ 基于面包板进行测试和实验

▲ 基于面包板进行测试和实验

 

02测试结果


1. AD5934与AD5933区别

  • 1. AD5934只能使用外部时钟信号
    如果没有外部时钟信号,AD534将不会工作。Init(10,1)与init(10,0)作用是相同的;

  • 2.时钟设置是,需要使用DIV=16
    在吊桶setsweep()时,需要提供div=16(缺省为4)。这使得AD5934的AD采样速率也比起AD5933减少了4倍;

  • 3.激励信号扫描范围比起AD5933降低4倍
    使用AD5933分析复阻抗的时钟频率设置 给出了扫描时钟工作的范围。相遇AD5934需要将所有的时钟频率降低4倍。比如给定了 f o s c f_{osc} fosc,那么激励信号的范围:


其中 f o s c f_{osc} fosc的单位是MHz。

DS345时钟幅度设置:Amplitude:2Vpp; Offset:1V。

▲ MCLK时钟的波形:Amplitude=2Vpp, Offset=1V

▲ MCLK时钟的波形:Amplitude=2Vpp, Offset=1V

在博文 AD5933阻抗模块测量值校正 给出了校正与计算相关的公式。

2.一些典型的测量数据

  • 校正电阻采集数据和测量数据

工作条件: f o s c = 1 M H z f_{osc} = 1MHz fosc=1MHz;扫频范围:(100,5100);扫描模式:SWEEP_MODE:1
输出信号的幅值:Vpp=2V

▲ 输出信号的波形和幅值

▲ 输出信号的波形和幅值

下面是采集到的在10kΩ分压下的采集信号。▲ 使用两个10kΩ电阻进行的校正数据。

▲ 使用两个10kΩ电阻进行的校正数据。

▲ 对校正电阻自身测量的结果

▲ 对校正电阻自身测量的结果

▲ 测量带有谐振腔的压电陶瓷蜂鸣器

▲ 测量带有谐振腔的压电陶瓷蜂鸣器

▲ 测量电容222对应的结果

▲ 测量电容222对应的结果

▲ 测量电感的感抗0.1H

▲ 测量电感的感抗0.1H

3.测量一些低阻器件

▲ 使用51欧姆的分压采集到的校正数据

▲ 使用51欧姆的分压采集到的校正数据

▲ 对于51欧姆校正电阻的测量数据

▲ 对于51欧姆校正电阻的测量数据

▲ 测量3Ω扬声器的数据

▲ 测量3Ω扬声器的数据

▲ 测量低音扬声器的阻抗

▲ 测量低音扬声器的阻抗

▲ 测试51欧姆电阻

▲ 测试51欧姆电阻

4.测量一些高阻谐振器件

▲ 使用100kΩ采集到的校正数据

▲ 使用100kΩ采集到的校正数据

▲ 对于20kHz工字电感谐振电磁传感器的测量

▲ 对于20kHz工字电感谐振电磁传感器的测量

 

※ 结论


通过上面的实验,可以看到模块设计达到了对应的功能。

#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# TEST1.PY                     -- by Dr. ZhuoQing 2020-06-25
#
# Note:
#============================================================

from headm import *
import ad5933
from tsmodule.tsstm32       import *
from tsmodule.tsvisa        import *
from tsmodule.tsdraw        import *

#------------------------------------------------------------
printf('Begin testing:\a')

#------------------------------------------------------------
calflag = 0
if len(sys.argv) > 1:
    calflag = int(sys.argv[1])

calname = 'testcal'
SWEEP_MODE = 1

Resistor=100e3
fosc = 10

startf = 15e3
stepf = 20
numf = 500

#------------------------------------------------------------
if calflag == 0:
    f1, R1, I1, A1 = tspload(calname, 'f', 'R', 'I', 'A')
    R1 = list(R1)
    I1 = list(I1)

    if len(f1) != numf+1:
        printf("NUMF is not equal to calibrate length:(%d,%d)"%(len(f1), numf))
        exit()

#------------------------------------------------------------
ad5933.init(20, 1)

#------------------------------------------------------------

while True:
    f = ad5933.setsweep(startf, stepf, numf, oscf=fosc, div=16)
    time.sleep(1.5)

    ad5933.sweep(SWEEP_MODE)

    while True:
        time.sleep(.5)
        val = stm32val()
        if val[12] > 0: break

    printf('\a')

    R,I = stm32memo(2)

    if len(R) == len(f): break
    else:
        printf('ERROR: %d != %d.\a'%(len(R), len(f)))
        if len(R) < len(f) / 2: continue;

        if calflag == 0:
            f = linspace(f[0], f[-1], len(f1))
            R = linspace(R[0], R[-1], len(f1))
            I = linspace(I[0], I[-1], len(f1))

            break

#------------------------------------------------------------
A = [sqrt(r**2+i**2) for r,i in zip(R,I)]
if calflag == 1:
    tspsave(calname, f=f, R=R, I=I, A=A)

#------------------------------------------------------------
if calflag != 0:
    plt.plot(f, R, label="Real")
    plt.plot(f, I, label="Imaginary")
    plt.plot(f, A, label='Amplitude')
    plt.xlabel("Frequency(Hz)")
    plt.ylabel("Value")
    plt.grid(True)
    plt.legend(loc="upper right")
    plt.show()
    exit()

#------------------------------------------------------------
Xabs = []
Xphase = []
for Rc,Ic,Rm,Im in zip(R1,I1,R,I):
    a = Resistor * Rm
    b = Resistor * Im
    c = 2*Rc - Rm
    d = 2*Ic - Im
    ccdd = c*c+d*d
    x = a*c/ccdd + b*d/ccdd
    y = -a*d/ccdd + b*c/ccdd

    Xabs.append(sqrt(x*x+y*y))
    Xphase.append(arctan2(y, x)*180/pi)

tspsave('Impedance',f=f, xabs=Xabs, xphase=Xphase)

#------------------------------------------------------------
plt.subplot(311)
plt.plot(f, R, label="Real")
plt.plot(f, I, label="Imaginary")
plt.plot(f, A, label='Amplitude')
plt.xlabel("Frequency(Hz)")
plt.ylabel("Value")
plt.grid(True)
plt.legend(loc="upper right")

plt.subplot(312)
plt.plot(f, Xabs)
plt.xlabel("Frequency(Hz)")
plt.ylabel("Amplitude(ohm)")
plt.grid(True)

plt.subplot(313)
plt.plot(f, Xphase)
plt.xlabel("Frequency(Hz)")
plt.ylabel("Phase")
plt.grid(True)

#------------------------------------------------------------
plt.show()

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


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# AD5933.PY                    -- by Dr. ZhuoQing 2020-06-25
#
# Note:
#============================================================

from head import *
from tsmodule.tsstm32       import *

#------------------------------------------------------------

def init(settletime=100, extclock=0):
    if extclock > 0:
        stm32cmd('writeb 81 8')
    else:
        stm32cmd('writeb 81 0')

    time.sleep(0.02)
    stm32cmd('writeb 80 b1')    # Enter standby mode
    stm32cmd('writei 8a %x'%settletime)
    time.sleep(0.02)

def temperature():
    data = stm32cmdata('readt', wait=200)
    if len(data) > 0:
        return data[0] / 32
    else: return 0

def setsweep(startf, incf, num=100, oscf=16.557, div=4):
    startn = int(startf * (2**27) * div / (oscf*1e6))
    incn   = int(incf * (2**27) * div / (oscf*1e6))

    stm32cmd('writel 82 %x'%startn)
    time.sleep(.02)
    stm32cmd('writel 85 %x'%incn)
    time.sleep(.02)
    stm32cmd('writei 88 %x'%num)
    time.sleep(.02)

    stm32cmd('writeb 80 b1')        # Standby

    time.sleep(.02)
    stm32cmd('writeb 80 11')
    time.sleep(.02)

    fdim = []
    for n in linspace(startn, startn + incn * num, num+1, endpoint=True):
        fdim.append(n * oscf * 1e6/div/(2**27))

    return fdim

def startf(resultflag = 0):
    if resultflag > 0:
        stm32cmd('writeb 80 21 1')
    else:
        stm32cmd('writeb 80 21')

def incf(resultflag = 0):
    if resultflag > 0:
        stm32cmd('writeb 80 31 1')
    else:
        stm32cmd('writeb 80 31')

def repeatf(resultflag = 0):
    if resultflag > 0:
        stm32cmd('writeb 80 41 1')
    else:
        stm32cmd('writeb 80 41')

def readdata():
    return stm32cmdata('readd', wait=100)

def sweep(code=0x1):
    stm32cmd('CLEAR')
    time.sleep(.02)

    stm32cmd('sweep %x'%code)

#------------------------------------------------------------

if __name__ == '__main__':

    tdim = []

    for i in range(10):
        data = temperature()
        tdim.append(data)
        time.sleep(.1)

    printf(tdim)

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


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97

  1. AD工程文件:AD\Test\2020\AD5933\AD59348G1k.PcbDoc * ↩︎

文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。

原文链接:zhuoqing.blog.csdn.net/article/details/107022358

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。