Adafruit Si5351时钟发生器开发板:设计与使用指南

电子说

1.4w人已加入

描述

Adafruit Si5351时钟发生器开发板:设计与使用指南

在电子设计领域,时钟发生器是一个关键组件,它为各种电路提供稳定的时钟信号。今天,我们来深入了解一下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电源供电。

  • Vin:电源引脚。由于芯片使用3VDC,板上的稳压器会将3 - 5VDC安全地转换为所需电压。为开发板供电时,应使用与微控制器逻辑电平相同的电源,例如对于像Arduino这样的5V微控制器,使用5V电源。
  • GND:电源和逻辑的公共接地引脚。

(二)I2C引脚

  • SCL:I2C时钟引脚,连接到微控制器的I2C时钟线。该引脚进行了电平转换,可使用3 - 5V逻辑,并且有一个10K上拉电阻。
  • SDA:I2C数据引脚,连接到微控制器的I2C数据线。同样进行了电平转换,可使用3 - 5V逻辑,也有一个10K上拉电阻。

(三)时钟输出引脚

  • 0、1和2:这是三个独立的时钟输出引脚,输出0 - 3V的方波信号。这些引脚也引出到PCB另一侧的SMA边缘发射连接器上。如果需要将信号传输到射频电缆,可以购买并焊接一些边缘发射SMA连接器。

三、组装步骤

如果你使用的是面包板版本的传感器,需要焊接一些引脚头,以便在面包板上使用。

  1. 准备引脚头:如有必要,将引脚头裁剪到合适的长度。将引脚头插入面包板,长引脚朝下,这样焊接会更容易。
  2. 安装开发板:将开发板放在引脚头上,使短引脚穿过开发板的焊盘。
  3. 焊接:确保焊接所有引脚,以实现可靠的电气连接。先焊接较长的电源/数据线引脚。如果你需要焊接技巧方面的帮助,可以查看Adafruit的《优秀焊接指南》。焊接完成后,检查焊点,然后继续下一步。

四、Arduino代码使用

(一)接线

可以轻松地将开发板连接到任何微控制器,这里以Arduino为例。对于其他类型的微控制器,只要确保其具有I2C功能,然后移植代码即可。

  • Vin:连接到3 - 5V电源,使用与微控制器逻辑电平相同的电压。对于大多数Arduino,使用5V。
  • GND:连接到公共电源/数据接地。
  • SCL:连接到Arduino的I2C时钟SCL引脚。在基于UNO和'328的Arduino上,该引脚也称为A5;在Mega上,称为数字21;在Leonardo/Micro上,称为数字3。
  • SDA:连接到Arduino的I2C数据SDA引脚。在基于UNO和'328的Arduino上,该引脚也称为A4;在Mega上,称为数字20;在Leonardo/Micro上,称为数字2。

(二)下载Adafruit_Si5351库

要开始读取传感器数据,需要从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);
}

(五)设置PLL

芯片使用两个部分来生成时钟输出。首先,将25MHz参考时钟乘以某个值(设置PLL),然后将新时钟除以另一个值(设置时钟分频器)。通过调整乘数和分频器,可以生成几乎任何时钟频率。有两个PLL乘数(A和B),如果需要三个输出,其中两个输出必须共享一个PLL。

  • 整数模式设置PLL:最简洁的方法是进行直接的整数乘法:
    clockgen.setupPLLInt(SI5351_PLL_A or SI5351_PLL_B, m);

    这将PLL_A或PLL_B设置为25MHz * m,m(整数乘数)的范围为15到90。

  • 分数模式设置PLL:这种模式允许使用分数乘数进行更灵活的PLL设置,但输出可能会有轻微的抖动。
    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。

(七)额外的R分频器

如果需要进一步分频以获得低于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的整数分频。如果从计算器中得到较高的值,可能需要进行调整。

五、CircuitPython代码使用

(一)接线

1. CircuitPython微控制器接线

将Si5351连接到电路板,使用I2C连接,具体接线方式与Arduino相同。例如,将Feather M0与传感器通过I2C连接时:

  • Board 3V:连接到传感器的VIN。
  • Board GND:连接到传感器的GND。
  • Board SCL:连接到传感器的SCL。
  • Board SDA:连接到传感器的SDA。

2. Python计算机接线

以Raspberry Pi为例,其I2C接线方式如下:

  • Pi 3V3:连接到传感器的VIN。
  • Pi GND:连接到传感器的GND。
  • Pi SCL:连接到传感器的SCL。
  • Pi SDA:连接到传感器的SDA。对于其他平台,可以访问CircuitPython on Linux指南,查看是否支持。

(二)安装库

1. CircuitPython安装SI5351库

首先,确保运行的是适用于电路板的最新版本的Adafruit CircuitPython。然后,从Adafruit的CircuitPython库捆绑包中安装必要的库。对于非Express板,需要手动从捆绑包中安装adafruit_si5351.mpyadafruit_bus_device。在继续之前,确保电路板的lib文件夹或根文件系统中复制了这些文件和文件夹。最后,连接到电路板的串行REPL,进入CircuitPython提示符。

2. Python安装SI5351库

需要安装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时钟发生器开发板有了更深入的了解。在实际应用中,你是否遇到过时钟信号不稳定的问题?你会尝试使用这款开发板来解决这些问题吗?欢迎在评论区分享你的经验和想法。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分