电子说
在电子设计领域,时钟发生器是一个关键组件,它为各种电路提供稳定的时钟信号。今天,我们来深入了解一下Adafruit Si5351时钟发生器开发板,看看它能为我们的设计带来哪些便利。
文件下载:2045.pdf
Adafruit Si5351时钟发生器开发板是一款非常实用的工具,它让我们告别了四处寻找晶体的烦恼。这款芯片内置一个精确的25MHz晶体参考源,以及内部锁相环(PLL)和分频器,能够生成从小于8KHz到150+MHz的任意频率。
它是一款基于I2C控制的时钟发生器,通过I2C指令利用板载精确时钟驱动多个PLL和时钟分频器。通过设置PLL和分频器,我们可以创建精确且任意的频率。该开发板有三个独立的输出,每个输出都可以有不同的频率。输出信号为3Vpp,可以通过适合面包板的引脚头输出,也可以通过可选的SMA连接器用于射频工作。
开发板上集成了3.3V LDO稳压器,可使用3 - 5VDC电源供电。同时,I2C线路上还配备了电平转换电路,确保该芯片可以安全地与3V或5V逻辑电路一起使用。此外,Adafruit还提供了详细的教程和库,方便我们快速上手。
开发板上的时钟发生器需要3V电源。考虑到很多用户使用像Arduino这样的5V微控制器,开发板上集成了一个3.3V稳压器,它具有超低压降特性,因此可以使用3.3V - 5V电源供电。
如果你使用的是面包板版本的传感器,需要焊接一些引脚头,以便在面包板上使用。
可以轻松地将开发板连接到任何微控制器,这里以Arduino为例。对于其他类型的微控制器,只要确保其具有I2C功能,然后移植代码即可。
要开始读取传感器数据,需要从Arduino库管理器中下载Adafruit Si5351库。打开Arduino库管理器,搜索Adafruit Si5351库并安装。如果你需要关于Arduino库安装的详细教程,可以访问Adafruit的相关指南。
打开File -> Examples -> Adafruit_Si5351 -> Si5351,将其上传到连接了传感器的Arduino。然后以9600波特率打开串口监视器,检查输出。你可以使用示波器探测0、1和2输出引脚,但根据示波器的型号,可能无法验证112.5MHz的输出频率。
Adafruit提供的库简单易用。可以使用以下代码创建Adafruit_Si5351对象:
Adafruit_SI5351 clockgen = Adafruit_SI5351();
I2C引脚在硬件上是固定的。初始化芯片时,调用clockgen.begin(),该函数会检查是否能找到芯片,并返回true或false。建议使用一个语句来检查芯片是否被检测到:
if (clockgen.begin() != ERROR_NONE) {
Serial.print("Ooops, no Si5351 detected ... Check your wiring or I2C ADDR!");
while(1);
}
芯片使用两个部分来生成时钟输出。首先,将25MHz参考时钟乘以某个值(设置PLL),然后将新时钟除以另一个值(设置时钟分频器)。通过调整乘数和分频器,可以生成几乎任何时钟频率。有两个PLL乘数(A和B),如果需要三个输出,其中两个输出必须共享一个PLL。
clockgen.setupPLLInt(SI5351_PLL_A or SI5351_PLL_B, m);
这将PLL_A或PLL_B设置为25MHz * m,m(整数乘数)的范围为15到90。
clockgen.setupPLLInt(SI5351_PLL_A or SI5351_PLL_B, m, n, d);
这将PLL_A或PLL_B设置为25MHz * (m + n/d),其中m的范围为15到90,n的范围为0到1,048,575,d的范围为1到1,048,575。
设置好PLL后,可以将高频时钟分频以获得所需的输出频率。每个输出都有自己的分频器。可以使用更简洁的整数分频器:
clockgen.setupMultisynthInt(output, SI5351_PLL_x, SI5351_MULTISYNTH_DIV_x);
其中,output使用0、1或2,PLL输入使用SI5351_PLL_A或SI5351_PLL_B,分频器可以选择SI5351_MULTISYNTH_DIV_4、SI5351_MULTISYNTH_DIV_6或SI5351_MULTISYNTH_DIV_8。整数输出将提供最干净的时钟。如果需要更多灵活性,可以使用分数发生器/分频器:
clockgen.setupMultisynth(output, SI5351_PLL_x, div, n, d);
其中,output使用0、1或2,PLL输入使用SI5351_PLL_A或SI5351_PLL_B,最终频率等于PLL / (div + n/d),div的范围为4到900,n的范围为0到1,048,575,d的范围为1到1,048,575。
如果需要进一步分频以获得低于100KHz的频率,可以使用额外的R分频器,它会将输出再除以一个固定的数字:
clockgen.setupRdiv(output, SI5351_R_DIV_x);
output是时钟输出编号,R分频器可以是SI5351_R_DIV_1、SI5351_R_DIV_2、SI5351_R_DIV_4、SI5351_R_DIV_8、SI5351_R_DIV_16、SI5351_R_DIV_32、SI5351_R_DIV_64或SI5351_R_DIV_128。
确定PLL乘数和分频器的最佳选择可能比较麻烦。SiLabs有一个名为ClockBuilder的桌面应用程序(https://adafru.it/dPj),可以帮助我们计算PLL分频器/乘数。该应用程序仅适用于Windows,但我们只需要使用它进行一次计算。安装并运行该应用程序,选择具有3个输出的Si5351A,不连接到EVB,启用所需的输出,并设置频率为浮点数或分数,将晶体设置为25MHz(默认值为27MHz),然后点击“Create Frequency Plan”查看PLL和分频器设置。需要注意的是,早期版本的芯片只接受900或更小的分频器,Adafruit的库也不允许选择大于900的整数分频。如果从计算器中得到较高的值,可能需要进行调整。
将Si5351连接到电路板,使用I2C连接,具体接线方式与Arduino相同。例如,将Feather M0与传感器通过I2C连接时:
以Raspberry Pi为例,其I2C接线方式如下:
首先,确保运行的是适用于电路板的最新版本的Adafruit CircuitPython。然后,从Adafruit的CircuitPython库捆绑包中安装必要的库。对于非Express板,需要手动从捆绑包中安装adafruit_si5351.mpy和adafruit_bus_device。在继续之前,确保电路板的lib文件夹或根文件系统中复制了这些文件和文件夹。最后,连接到电路板的串行REPL,进入CircuitPython提示符。
需要安装Adafruit_Blinka库,该库为Python提供CircuitPython支持。这可能还需要在平台上启用I2C,并验证运行的是Python 3。由于每个平台有所不同,且Linux经常更新,请访问CircuitPython on Linux指南,使计算机做好准备。完成后,从命令行运行以下命令:
sudo pip3 install adafruit-circuitpython-si5351
如果默认Python是版本3,可能需要运行pip。请确保不要在Python 2.x上使用CircuitPython,因为它不支持。
以下是一个简单的示例,演示如何使用传感器并控制时钟输出:
import board
import busio
import adafruit_si5351
i2c = busio.I2C(board.SCL, board.SDA)
si5351 = adafruit_si5351.SI5351(i2c)
# 配置PLL
si5351.pll_a.configure_integer(20) # 设置PLL A为500 MHz
print('PLL A: {0} MHz'.format(si5351.pll_a.frequency/1000000))
si5351.pll_b.configure_fractional(20, 1, 2) # 设置PLL B为512.5 MHz
print('PLL B: {0} MHz'.format(si5351.pll_b.frequency/1000000))
# 配置时钟输出
si5351.clock_0.configure_integer(si5351.pll_a, 4) # 设置时钟0为125 MHz
print('Clock 0: {0:0.3f} MHz'.format(si5351.clock_0.frequency/1000000))
si5351.clock_1.configure_fractional(si5351.pll_b, 4, 1, 2) # 设置时钟1为113.889 MHz
print('Clock 1: {0:0.3f} MHz'.format(si5351.clock_1.frequency/1000000))
# 启用输出
si5351.outputs_enabled = True
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT
import board
import busio
import adafruit_si5351
# 初始化I2C总线
i2c = busio.I2C(board.SCL, board.SDA)
si5351 = adafruit_si5351.SI5351(i2c)
# 配置PLLs
si5351.pll_a.configure_integer(36) # 设置PLL A为900 MHz
print("PLL A frequency: {0}mhz".format(si5351.pll_a.frequency / 1000000))
si5351.pll_b.configure_fractional(24, 2, 3) # 设置PLL B为616.6667 MHz
print("PLL B frequency: {0}mhz".format(si5351.pll_b.frequency / 1000000))
# 配置时钟输出
si5351.clock_0.configure_integer(si5351.pll_a, 8) # 设置时钟0为112.5 MHz
print("Clock 0: {0}mhz".format(si5351.clock_0.frequency / 1000000))
si5351.clock_1.configure_fractional(si5351.pll_b, 45, 1, 2) # 设置时钟1为13.5531 MHz
print("Clock 1: {0}mhz".format(si5351.clock_1.frequency / 1000000))
si5351.clock_2.configure_integer(si5351.pll_b, 900) # 设置时钟2的初步分频
si5351.clock_2.r_divider = adafruit_si5351.R_DIV_64 # 设置时钟2的R分频器
print("Clock 2: {0}khz".format(si5351.clock_2.frequency / 1000))
# 启用输出
si5351.outputs_enabled = True
通过以上介绍,相信大家对Adafruit Si5351时钟发生器开发板有了更深入的了解。在实际应用中,你是否遇到过时钟信号不稳定的问题?你会尝试使用这款开发板来解决这些问题吗?欢迎在评论区分享你的经验和想法。
全部0条评论
快来发表一下你的评论吧 !