AD5933使用外部时钟获得更低的分析频率
■ 前言
在博文 AD5933不同频率下转换结果 中分析了 AD5933阻抗变换模块 使用内部时钟(fosc=16.776MHz)时,测量结果受到采集时间窗口的影响,所能够达到的最低阻抗激励正弦信号频率。
那么,在有些应用中,对象的带宽和工作频率会很低,那么如果能够使用AD5933对这些对象进行测量呢?
虽然,AD5933内部的DSS(数字信号合成 )器可以输出很低的频率,但受到前面提到的数据采集窗口的窗口的影响,所以还是不能够使用。
一种可行的方式就是利用AD5933外部时钟,来降低内部ADC采样的频率,从而可以有效扩大数据采集时间窗口,减少因为 频谱泄漏 对于测量结果的影响。
通过实验验证MCLK对于AD5933的影响
验证AD5933究竟是否可以达到很低的分析能力?
01使用STC8G1K08的T0输出脉冲信号1,2
在 AD5933阻抗转换器、网络分析仪初步实验 中给出了基于STC8G1K081K(SOP8)的实验电路,完成对AD5933模块的I2C总线命令的控制。实验电路板还包括有T0/T1CLKO管脚输出,这部分可以用来产生AD5933的MCLK的时钟信号。
▲ 设置T1CLKO的STC8G相关寄存器
在STC8G1K08的main程序初始化子程序中,定义如下命令,设置T1CLKO为输出信号。
▲ 实验电路板 STC8G1K08
#define T1CLKO_PIN 5,4
void MainInit(void) {PM_BIDIR(LED);AD5933Init();INTCLKO |= 0x2;PM_PP(T1CLKO_PIN);}
测量P5.4(T1CLKO)管脚的波形如下。频率为:ft1=921.3kHzf_{t1} = 921.3kHzft1=921.3kHz。
由于此时T1用于UART1的波特率(460800bps),所以它的频率为921.3Khz。
▲ STC8G1k的P5.4(T1CLKO)管脚的输出波形
02产生输出信号
1.设置输出激励正弦信号
在初始化AD5933中,选择外部CLK。在设置SetSweep的时候,设置参数oscf=0.92。输出3kHz。
ad5933.init(20, 1)
stm32cmd('reada')
startf = 2000
stepf = 100
numf = 10ad5933.setsweep(startf, stepf, numf, oscf=0.9216)
ad5933.sweep(1)
下面是采集到的输出波形。它的频率为3KHz。这说明AD5933的确是按照外部得始终产生激励信号的。
▲ 输出3KHz的正弦波形
2. 测试新的最低工作频率
内部工作频率 fin=16.776Mhzf_{in} = 16.776Mhzfin=16.776Mhz时,按照AD5933不同频率下转换结果 中的结果,最低工作频率大约是:fmin=2kHzf_{\min } = 2kHzfmin=2kHz左右。现在外部时钟频率为:fext=0.9216MHzf_{ext} = 0.9216MHzfext=0.9216MHz。那么对应的最低工作频率:
下面是在不同的输出工作频率下,测量负载为无穷大时,测到所得到的电流幅度。可以看到在频率大约为110Hz的时候,输出接近于零。这与上述计算结果是相符合的。
▲ 在不同的工作频率下测量结果,此时工作电阻为无穷大
3.修改模块中的耦合电容
使用AD5933上的运放缓冲电路的时候,由于AD5933通过 0.01uF的电容耦合到AD8606运放。当输出频率很低的时候,会极大衰减输出信号。
将该耦合电容修改到20uF;这样对应的截止频率为:C0=20uFC_0 = 20uFC0=20uF,后期的分压电阻为R0=10kΩR_0 = 10k\OmegaR0=10kΩ。后期的截止频率为:
▲ 不同频率下输出激励电压
▲ 不同频率下输出激励电压
从上图来看,输出信号的截止频率大约是10Hz左右。
为了进一步降低截止频率,将原来的分压电压的电阻从原来的22kΩ,修改成200kΩ.
▲ 修改缓冲运放
经过改造之后,重新测量输出电压与激励信号频率之间的关系。可以看到截止频率降低到1Hz左右。
▲ 不同频率输出激励电压幅值
03使用信号源产生工作频率
1.工作时钟频率
使用DS345产生AD5933的工作时钟信号。首先设置输出频率:100kHz, 幅度:Vpp=2V;偏置:1V。
▲ 信号源DS345
由于输出信号是按照负载为50Ω来设定的。带动AD5933工作时,由于负载远远大于50Ω,所以输出的幅值基本上是上述设置两倍。
下图是实际测量DS345输出的时钟信号。Vpp大约为2V,重心偏移量为2V。
▲ 工作时钟信号
通过测试,需要将时钟的幅值设置为峰峰值2V才能够满足触发AD5933的工作。
▲ 设置信号的幅值和波形
如果输入信号超过的3.3V,有可能导致电流回灌。
- 正确的设置方式:Vpp:1.5V,Vbias=1V,方波。
2.测试输出信号频率
在Vin,Vout之间连接Rload=300kΩR_{load} = 300k\OmegaRload=300kΩ。在不同的频率下测量的结果如下图所示。
工作频率:0.1MHz
▲ 不同频率下测量的结果
根据在 AD5933不同频率下的转换结果 测量结果,在fosc=16.776MHzf_{osc} = 16.776MHzfosc=16.776MHz下,频率泄露所引起的最低工作频率为2000Hz。那么工作在f1=0.1Mhzf_1 = 0.1Mhzf1=0.1Mhz下的最低工作频率为:
从前面的测量结果来看,的确最低的工作频率大约10Hz左右。
(1)工作频率0.01MHz:
下面显示了在不同的频率下的测量结果。
在工作频率为fosc=16.776MHzf_{osc} = 16.776MHzfosc=16.776MHz下,数据采样频率为1MHz。在工作频率f1=0.01MHzf_1 = 0.01MHzf1=0.01MHz时,对应的数据采样频率为:
▲ 不同频率下测量的结果
▲ 普通频率下的测量结果
下图显示了在596MHz下,对应的采集到的数据。其中存在两个奇怪的地方:
测量结果中存在一个线性相位
这可能是由于转换过程存在一个特定的时间延时tADt_{AD}tAD。从图像中可以看到该延迟大约是2ms。也就是在1000Hz的时候,相位相差了2个2π2\pi2π。当频率大于550Hz长辈,结果中存在噪声
由于采集频率为596Hz,所以当信号的频率超过500Hz之后,实际上信号已经处于欠采样过程。所以这个过程存在着比较明显的噪声。
▲ 普通频率下的测量结果
(2)工作频率:0.02MHz:
从测量结果来看:
- 存在着 一个1ms左右的延迟
可以猜测,固定的延迟大约等于两个工作时钟信号周期。
▲ 普通频率下的测量结果
下图显示了最低的工作频率大约在2.5Hz。
▲ 普通频率下的测量结果
(3)工作频率:0.05MHz
最低的工作频率大约E座5.5Hz.
▲ 普通频率下的测量结果
3. AD5933的工作频率对结果的影响
工作频率:0.01MHz
▲ 不同频率下的测量结果
工作频率:0.02MHz
▲ 不同频率下的测量结果
工作频率:0.05MHz
▲ 不同频率下的测量结果
※ 结论
可以使用外部加入测MCLK信号,来改变AD5933的测量信号频率范围。
输入信号的幅度需要尽可能解决0~3.3V,可以使用正弦波,或者方波信号来驱动MCLK。
- 总结上述测量结果,可以近似得到如下的结果:
-
(1)AD5933存在一个固定的延迟tdelayt_{delay}tdelay,这与工作频率fMCLKf_{MCLK}fMCLK之间的关系为:tdelay=20fMCLt_{delay} = {20 \over {f_{MCL} }}tdelay=fMCL20。
(2) 数据采样频率:fs=fMCL/16.776×106Hzf_s = f_{MCL} /16.776 \times 10^6 Hzfs=fMCL/16.776×106Hz。 fMCLf_{MCL}fMCL的单位MHz。 输入信号的频率需要小于fs的一半。
(3)最低工作频率:fmin=fMCL/16.776×2000f_{\min } = f_{MCL} /16.776 \times 2000fmin=fMCL/16.776×2000。 fMCLf_{MCL}fMCL的单位MHz。
(4)测量保证数据精确性,至少在采样数据中,正弦信号的周期:最小5个;最大的周期512(满足采样定理)。因此AD5933的测量信号的频率范围大约是100倍(两个数量级)。
#!/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 *#------------------------------------------------------------
printf('\a')
ad5933.init(2, 1)startf = 5
stepf = 2
numf = 200#------------------------------------------------------------
freqn = ad5933.setsweep(startf, stepf, numf, oscf=1)
#printf(freqn)#------------------------------------------------------------
ad5933.sweep(1)while True:time.sleep(.5)val = stm32val()if val[12] > 0: breakR,I = stm32memo(2)
printf(R, I)#------------------------------------------------------------#f = linspace(startf, startf + stepf * numf, len(R), endpoint=True)
f = freqnA = [sqrt(r**2+i**2) for r,i in zip(R,I)]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()#------------------------------------------------------------
# END OF FILE : TEST1.PY
#============================================================
#!/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 modestm32cmd('writei 8a %x'%settletime)time.sleep(0.02)def temperature():data = stm32cmdata('readt', wait=200)if len(data) > 0:return data[0] / 32else: return 0def setsweep(startf, incf, num=100, oscf=16.557):startn = int(startf * (2**27) / (oscf*1e6/4))incn = int(incf * (2**27) / (oscf*1e6/4))# printff('%x %x %x'%(startn, incn, num))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 81 0') # D3: 0:Internal system clock 1:External
# time.sleep(.02)stm32cmd('writeb 80 b1') # Standbytime.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/4/(2**27))return fdimdef 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
#============================================================
实验STC8G1K08 Keil工程文件:C51\STC\Test\2020\AD5933\AD59338G1K\AD59338G1K.uvproj ↩︎
实验AD电路工程文件:AD\Test\2020\AD5933\AD59338G1K.SchDoc ↩︎
AD5933使用外部时钟获得更低的分析频率相关推荐
- mpc5774时钟监控寄存器_单片机如何才能不死机之内外部时钟
1. 前言 时钟是嵌入式系统中非常重要,但又常常被忽视的地方.它的成本只占整个系统的一个零头,但由于时钟的停振,或其它异常最终导致厂商付出高昂代价的案例却并不少见.下面我们看一下在时钟设计中应该注意的 ...
- 内部时钟和外部时钟隔离的Σ-Δ调制器
"在本文中,将详细研究这两类隔离Σ-Δ调制器的输出数据信号完整性.并通过简单的电磁干扰(EMI)测试设置.对由这两类Σ-Δ调制器的高频时钟信号产生的EMI进行比较. 对输出数据信号完整性和时 ...
- 浅谈晶振作用功能、晶体和晶振、外部时钟和内部时钟、分频倍频预分频后分频、定时器和计数器
Fosc=frequence oscillate 晶振频率 晶振是用来起振的,只是振荡电路的一种,还有自激振荡器.电容三点式振荡器.LC振荡器.RC振荡器......其作用是通电才产生原始时钟频率,这 ...
- 51单片机(8051系列)外部时钟
OUT(输出引脚),IN(输入引脚)的区别 OUT(输出引脚) 输入引脚连接输入设备 IN(输入引脚) 输出引脚连接输出设备 外部时钟和内部时钟的区别 1.XTAL1和XTAL2引脚 内部时钟方式:必 ...
- STM32入门笔记04_TIM定时器+案例:TIM定时器定时中断、定时器外部时钟
TIM定时器 TIM简介 TIM(Timer) 定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器.预分频器.自动重装寄存器的时基单元,在72MHz(系统主频)计数时 ...
- 单片机之外部时钟与内部时钟
1.晶振 首先,单片机能正常工作的必要条件之一就是时钟电路,时钟是单片机的脉搏,是单片机的驱动源,单片机工作是在统一的时钟脉冲控制下一拍一拍进行工作的.这个脉冲由单片机控制器中的时序电路发出的.所以单 ...
- 华为鸿蒙2.0打游戏,网友Mate X2升级鸿蒙2.0:部分游戏体验比EMUI更好 功耗却更低...
近日,华为的鸿蒙2.0系统已经开始公测,不少用户已经报名参加并收到了华为的推送,系统由基于安卓定制的EMUI 11切换到鸿蒙OS. 对网友来说,升级鸿蒙OS会有什么变化?这个问题是最关键,也最影响他们 ...
- qt 显示加速_新能源 | 吉利星越ePro上市 补贴后17.58万起售 加速更快油耗更低
点击上方"蓝字"关注我们 新车速递 | 车市速报 吉利星越ePro上市 补贴后17.58万起 加速更快油耗更低 编辑 | 马 妍 排版 | 马 妍 「本文阅读时长约为3分钟 ...
- 比英伟达便宜4000元、功耗更低、游戏性能相同,AMD发布RX 6900 XT旗舰显卡
晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI AMD全新Radeon RX 6000系列显卡来了! 今天凌晨,苏妈携RX 6800.RX 6800 XT.RX 6900 XT三款新显卡 ...
最新文章
- Chameleon跨端框架——壹个理想主义团队的开源作品
- c语言猜拳游戏中出现的关键词,C语言猜拳游戏代码及分析
- 用新语法写更简洁的ABAP代码
- [算法 笔记]字符串表达式计算(简易版)
- Blazor WebAssembly 3.2.0 正式起飞,blazor 适合你吗?
- [Abp vNext 源码分析] - 4. 工作单元
- 数据结构—— 基于二叉树的算术表达式求值
- 洛谷 P1939 【模板】矩阵加速(数列)
- 前端学习(2849):简单秒杀学习之浮动
- 源码安装mysql数据库_Linux下源码安装mysql数据库
- 阿里云搭建视频网站和视频服务的省钱方案
- 史密斯圆图串并联口诀_史密斯圆图基本原理及应用.ppt
- VS2017社区版许可证过期问题
- 深入Bert实战(Pytorch)----WordPiece Embeddings
- 精灵骑士二觉_精灵骑士二觉版本小百科,先睹为快
- 亲测有效,最简单的Win10系统下的IDEA Ultimate2019.1.3安装和破解秘籍
- win7怎么修改锁定计算机时间,锁定Windows7系统时间教程
- 启动Intel TV-x设置
- Office显示未授权,需要激活这种情况应该怎么处理
- Adobe Premiere Pro 2020(PR)系统兼容性报告(不支持的视频驱动程序)完美解决方案
热门文章
- 设计模式(一)-单例模式
- 多个Silverlight应用程序如何共享一个DomainService
- Windows Server应用之32位系统如何安装64位打印机驱动
- [你必须知道的.NET]第二十一回:认识全面的null
- 并发编程(九)—— Java 并发队列 BlockingQueue 实现之 LinkedBlockingQueue 源码分析...
- 区块链教程Fabric1.0源代码分析scc(系统链码)
- zabbix添加自定义监控项目-配置邮件告警-测试告警
- SVG(H5可缩放的矢量图形)
- HTML-CSS-JS-PHP的顺序及相关网址(转)
- shell for循环案例:自动批量添加iptables应用端口规则