AD5934阻抗变换模块实验电路板
■ 前言
本文讨论了基于AD5934构建阻抗变换模块。并对于它测试相应的阻抗进行实验。
01电路设计
1.原理图设计1
▲ 实验电路板 原理图
2.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
在博文 AD5933阻抗模块测量值校正 给出了校正与计算相关的公式。
2.一些典型的测量数据
-
校正电阻采集数据和测量数据
工作条件: f o s c = 1 M H z f_{osc} = 1MHz fosc=1MHz;扫频范围:(100,5100);扫描模式:SWEEP_MODE:1
输出信号的幅值:Vpp=2V
▲ 输出信号的波形和幅值
下面是采集到的在10kΩ分压下的采集信号。
▲ 使用两个10kΩ电阻进行的校正数据。
▲ 对校正电阻自身测量的结果
▲ 测量带有谐振腔的压电陶瓷蜂鸣器
▲ 测量电容222对应的结果
▲ 测量电感的感抗0.1H
3.测量一些低阻器件
▲ 使用51欧姆的分压采集到的校正数据
▲ 对于51欧姆校正电阻的测量数据
▲ 测量3Ω扬声器的数据
▲ 测量低音扬声器的阻抗
▲ 测试51欧姆电阻
4.测量一些高阻谐振器件
▲ 使用100kΩ采集到的校正数据
▲ 对于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
AD工程文件:AD\Test\2020\AD5933\AD59348G1k.PcbDoc * ↩︎
文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。
原文链接:zhuoqing.blog.csdn.net/article/details/107022358
- 点赞
- 收藏
- 关注作者
评论(0)