■ 前言


在博文 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​=fMCL​20​。
(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
#============================================================

  1. 实验STC8G1K08 Keil工程文件:C51\STC\Test\2020\AD5933\AD59338G1K\AD59338G1K.uvproj ↩︎

  2. 实验AD电路工程文件:AD\Test\2020\AD5933\AD59338G1K.SchDoc ↩︎

AD5933使用外部时钟获得更低的分析频率相关推荐

  1. mpc5774时钟监控寄存器_单片机如何才能不死机之内外部时钟

    1. 前言 时钟是嵌入式系统中非常重要,但又常常被忽视的地方.它的成本只占整个系统的一个零头,但由于时钟的停振,或其它异常最终导致厂商付出高昂代价的案例却并不少见.下面我们看一下在时钟设计中应该注意的 ...

  2. 内部时钟和外部时钟隔离的Σ-Δ调制器

    "在本文中,将详细研究这两类隔离Σ-Δ调制器的输出数据信号完整性.并通过简单的电磁干扰(EMI)测试设置.对由这两类Σ-Δ调制器的高频时钟信号产生的EMI进行比较. 对输出数据信号完整性和时 ...

  3. 浅谈晶振作用功能、晶体和晶振、外部时钟和内部时钟、分频倍频预分频后分频、定时器和计数器

    Fosc=frequence oscillate 晶振频率 晶振是用来起振的,只是振荡电路的一种,还有自激振荡器.电容三点式振荡器.LC振荡器.RC振荡器......其作用是通电才产生原始时钟频率,这 ...

  4. 51单片机(8051系列)外部时钟

    OUT(输出引脚),IN(输入引脚)的区别 OUT(输出引脚) 输入引脚连接输入设备 IN(输入引脚) 输出引脚连接输出设备 外部时钟和内部时钟的区别 1.XTAL1和XTAL2引脚 内部时钟方式:必 ...

  5. STM32入门笔记04_TIM定时器+案例:TIM定时器定时中断、定时器外部时钟

    TIM定时器 TIM简介 TIM(Timer) 定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器.预分频器.自动重装寄存器的时基单元,在72MHz(系统主频)计数时 ...

  6. 单片机之外部时钟与内部时钟

    1.晶振 首先,单片机能正常工作的必要条件之一就是时钟电路,时钟是单片机的脉搏,是单片机的驱动源,单片机工作是在统一的时钟脉冲控制下一拍一拍进行工作的.这个脉冲由单片机控制器中的时序电路发出的.所以单 ...

  7. 华为鸿蒙2.0打游戏,网友Mate X2升级鸿蒙2.0:部分游戏体验比EMUI更好 功耗却更低...

    近日,华为的鸿蒙2.0系统已经开始公测,不少用户已经报名参加并收到了华为的推送,系统由基于安卓定制的EMUI 11切换到鸿蒙OS. 对网友来说,升级鸿蒙OS会有什么变化?这个问题是最关键,也最影响他们 ...

  8. qt 显示加速_新能源 | 吉利星越ePro上市 补贴后17.58万起售 加速更快油耗更低

    点击上方"蓝字"关注我们 新车速递 | 车市速报 吉利星越ePro上市 补贴后17.58万起 加速更快油耗更低 编辑 | 马   妍 排版 | 马   妍 「本文阅读时长约为3分钟 ...

  9. 比英伟达便宜4000元、功耗更低、游戏性能相同,AMD发布RX 6900 XT旗舰显卡

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI AMD全新Radeon RX 6000系列显卡来了! 今天凌晨,苏妈携RX 6800.RX 6800 XT.RX 6900 XT三款新显卡 ...

最新文章

  1. Chameleon跨端框架——壹个理想主义团队的开源作品
  2. c语言猜拳游戏中出现的关键词,C语言猜拳游戏代码及分析
  3. 用新语法写更简洁的ABAP代码
  4. [算法 笔记]字符串表达式计算(简易版)
  5. Blazor WebAssembly 3.2.0 正式起飞,blazor 适合你吗?
  6. [Abp vNext 源码分析] - 4. 工作单元
  7. 数据结构—— 基于二叉树的算术表达式求值
  8. 洛谷 P1939 【模板】矩阵加速(数列)
  9. 前端学习(2849):简单秒杀学习之浮动
  10. 源码安装mysql数据库_Linux下源码安装mysql数据库
  11. 阿里云搭建视频网站和视频服务的省钱方案
  12. 史密斯圆图串并联口诀_史密斯圆图基本原理及应用.ppt
  13. VS2017社区版许可证过期问题
  14. 深入Bert实战(Pytorch)----WordPiece Embeddings
  15. 精灵骑士二觉_精灵骑士二觉版本小百科,先睹为快
  16. 亲测有效,最简单的Win10系统下的IDEA Ultimate2019.1.3安装和破解秘籍
  17. win7怎么修改锁定计算机时间,锁定Windows7系统时间教程
  18. 启动Intel TV-x设置
  19. Office显示未授权,需要激活这种情况应该怎么处理
  20. Adobe Premiere Pro 2020(PR)系统兼容性报告(不支持的视频驱动程序)完美解决方案

热门文章

  1. 设计模式(一)-单例模式
  2. 多个Silverlight应用程序如何共享一个DomainService
  3. Windows Server应用之32位系统如何安装64位打印机驱动
  4. [你必须知道的.NET]第二十一回:认识全面的null
  5. 并发编程(九)—— Java 并发队列 BlockingQueue 实现之 LinkedBlockingQueue 源码分析...
  6. 区块链教程Fabric1.0源代码分析scc(系统链码)
  7. zabbix添加自定义监控项目-配置邮件告警-测试告警
  8. SVG(H5可缩放的矢量图形)
  9. HTML-CSS-JS-PHP的顺序及相关网址(转)
  10. shell for循环案例:自动批量添加iptables应用端口规则