本文作者:Robert Lacoste
在本专栏最早的第一篇文章中,我谈到了晶体振荡器,并解释了晶体振荡器非常稳定,但它们的输出频率仍然与温度有关。
这个月,我提议回到这个话题:讨论如何提高晶体振荡器(简称XO)的温度稳定性。我的具体目标是解释什么是TCXOs(温度补偿晶体振荡器),以及它们是如何构建的。我甚至会向您展示如何将一个经典的微控制器(MCU)晶振转换成TCXO,而成本不到2美元。
石英晶体
让我们从简短的回顾开始,由于压电效应,石英晶体的机械收缩或膨胀取决于其两面之间施加的电压。所以,如果你在它的引脚之间施加交流信号而不是持续的电压,晶体会以信号的频率振动。当信号频率恰好等于晶体的机械共振频率时,就会发生一些有趣的事情。它的电学行为改变了。更确切地说,它显示了阻抗的急剧变化。
这种特性使我们能够建立精确的振荡器,这些振荡器被锁定在这个机械共振频率上。这就是为什么水晶通常被用作无数电子设备的参考时钟。特别是,MCU包括一个所谓的皮尔斯CMOS振荡电路,用一个简单的逻辑反相器门构成。图1显示了这种振荡器的典型配置。作为一个设计师,你所要做的就是在MCU的两个专用引脚之间连接一个晶体,并在晶体引脚和地面之间添加两个小电容器(通常为20pF左右)。但是这些电容器是做什么用的?
图1–围绕CMOS构建的基本晶体振荡器
要理解这一点,你必须知道晶振的等效电模型。在接近其谐振频率时,晶振表现为与电容并联的串联RLC网络。例如,典型的10MHz晶体的电气模型如图2(左上角)所示。这里我们有0.025H+0.01pF+640Ω,与2.5pF并联。这些组成很不寻常,但这就是晶体的模型。
图2——晶体可以模型化为RLC串行网络。并联模式谐振的频率(阻抗越高,传输比越低)随外部电容器的增加而变化。
我的这个电路在QUCS(QUCS是一个好的电路模拟器…和免费!) 上添加了一个正弦源和一个负载电阻R2,然后单击“运行”。结果如图2(右上角)所示:共振频率不是一个而是两个。第一个是10.066MHz,显示了最小阻抗。第二个频率稍高,为10.085MHz,并显示出最大阻抗。这两个频率分别是串联谐振(低阻抗)和并联谐振(高阻抗)。因此,每个晶体都可以在这两种模式中的任何一种激发,这取决于围绕它的振荡器。这些共振频率很接近,但并不完全相同。这就是为什么晶体制造商销售“串联”和“平行”晶振。别搞糊涂了。它们都可以在任何一种模式下使用。但是如果你在没有指定的模式下使用它,会有一个小的频率偏移。
现在让我们关注一下并连模式,这是CMOS振荡器使用的模式。如果你在水晶的两条腿之间加一个外部的小电容器会怎么样?参考图2(底部),我添加了10pF并重新运行了模拟。串联谐振频率不变,但并联谐振更接近串联谐振,这里是10.007MHz。这是个问题,不是吗,因为XO的频率取决于任何外部寄生电容?考虑到这一点,晶体制造商为每一个“平行”晶体规定了在它的两个支脚之间必须加上什么样的外部电容才能得到写在设备上的准确频率。这个电容通常在10pF左右。
现在你知道了每个CMOS振荡器上的两个小的20pF电容器的用途,事实上,它们是通过地串行连接的,20pF+20pF串联在一起形成10pF。使用两个电容而不是一个也有助于稳定振荡。这就是为什么总是有两个电容靠近一个MCU晶振(图3)。
图3–MikroE 24针PIC开发板上的8MHz晶体及其两个22pF电容器。
温度稳定
现在我们来看看温度稳定性。当温度变化时,晶体的尺寸和它的共振频率都会发生轻微的变化。假设您的设计必须在室外工作,温度为-20°C至+70°C。根据您的预算,您可能会发现10MHz晶体,在上述温度范围内,温度稳定度从±10ppm到±100ppm。够了吗?好吧,10ppm意味着百万分之十,所以最好的10MHz晶体的温度相关频率变化为10MHz×10/1000000=±100Hz。
变化很小,但这可能对您的项目来说太多了。如果你建造一个时钟,10ppm意味着每年误差±5分钟。如果你用的是868kHz的无线收发器,影响误差会是8.68kHz,如果是窄带无线,非常影响您的产品性能。如果使用低成本的晶体,这将是原来的10倍。
最后但并非最不重要的是,这些例子只与温度漂移有关。换句话说,晶体也会有初始频率误差,即使温度稳定(“老化”)也会随时间漂移。这些误差将增加与温度有关的漂移。
那么,如何提高XO的温度稳定性呢?首先,晶振制造商知道如何在给定的温度范围内减小这种变化。他们通过精确地切割晶体相对于其晶体轴的角度来实现。例如,通常用于低频晶体的标准AT-cut最大限度地提高了周围环境温度的稳定性。所以,一个水晶切割在正确的角度比其他的更稳定,这就是为什么它会更贵。
然而,另外两种技术可以显著提高温度稳定性。最好的方法是使用恒温晶体振荡器(OCXO)来避免所有的晶体温度变化。在这里,晶体被封闭在一个小的温控室中,并加热到稳定的温度。通常情况下,温度稳定性优于0.01ppm(10ppb),但代价是能耗增加。
第二种技术不太精确,但更节能。其原理是测量实际温度,然后根据该温度补偿振荡器的频率。这怎么可能?通过知道晶振的温度对频率的依赖性。这种振荡器被称为温度补偿晶体振荡器(TCXOs)。商用TCXO的温度稳定性为±0.1至±3ppm。这比OCXO糟糕得多,但比普通的XO要好得多。
TCXO
购买现成的TCXO可能是商业项目的最佳解决方案。但为什么不尝试从头开始构建一个呢?例如,如何利用尽可能少的外部部件来提高驱动PIC16F1788微控制器的8MHz晶体振荡器的温度稳定性?事实上,它可以用少于2美元或额外的零件完成。图4显示了我是如何做到的。虚线框中包含的所有模块都在PIC MCU内部。让我们看看这是怎么回事。
图4——实验模型的完整示意图。虚线框中包含的所有块都位于PIC16F1788 MCU内部。
通常情况下,OSC的第一个标准配置是OSC 1的石英管脚,两个经典的加载电容C1和C2,但有一个技巧。一个额外的部件D1连接在C1和地面之间。这是示意图中唯一奇特的部分:一个可变电容二极管。这样的二极管,当用反向直流电压极化时,起到一个小电容器的作用。它的电容是直流电压的函数。
我采用了NXP的BB156,当电容器从18pf降低到6pf,电容器的电压从0V增加到5V。XO依赖的是电容。所以,在水晶的一条腿上加上一个可变电容可以让我们通过施加不同的直流电压来微调它的频率,这变成了压控晶体振荡器(VCXO)。可能的频率变化很小,但仍然可以构建TCXO,我稍后将解释。
回到图4所示的示意图,可以看到直流电压来自8位数模转换器(DAC),此DAC内置于PIC中。DAC输出电压通过一个感应器(L1)施加到D1,该感应器阻断8MHz信号。在PIC运算模块中内置了一个运算放大器。通过这种配置,只需改变DAC值,就可以从PIC上运行的固件微调晶体频率。
我还需要一种精确测量晶体温度的方法。德州仪器(U1)的精密LM35模拟温度传感器完成了这项工作。该传感器每摄氏度产生10毫伏的电压,因此从-0.2伏到+0.7伏,在-20摄氏度到+70摄氏度时,0.5摄氏度的精度就足够了。我想用PIC中提供的12位ADC来测量这个温度,但如何管理传感器输出电压可能是负的呢?可以采用一个小把戏。在U1和地面之间加了一个二极管(D2),增加了大约0.6V的电压降。因此,U1的输出相对于地总是正的。这个输出电压和D2上的电压都连接到两个ADC输入端。它们的差别是温度,D2上的电压降不影响测量。顺便说一句,PIC还有一个内部4.096V参考电压(FVR),它可以设置ADC的全量程。
最后,我想用实验室频率计测量实际的晶体振荡器频率,以检查设计是否可行。将频率计直接连接到晶体振荡器引脚是一个非常糟糕的主意。你知道为什么。仪表连接会引入寄生电容,从而改变振荡器的频率。幸运的是,这个PIC有另一个内置模块,时钟分配器模块(CLKREF)。它取时钟频率,除以一个给定的数字(在本例中为8),然后将得到的时钟路由到一个外部引脚上。正是我需要的!我加了一个47Ω的电阻(R1)来匹配频率计的50Ω输入,这就是所有的零部件。
原型
我没有设计定制的PCB,而是从MikroE订购了一块“Ready for PIC”28针开发板。我用PIC16F1788替换了所提供的MCU,并在原型区焊接了一些额外的组件(图5)。但这里必须特别小心。
图5——我组装好的原型。
首先,为了获得好的结果,温度传感器必须测量晶振的温度,而不是环境空气。因此,我试图将LM35直接固定在晶体体上,如图5所示。好吧,这可能还不够完美。把晶振和石英粘在一起,甚至在这两种成分周围建立一个小的温度室,效果会好得多。
第二,组件必须尽可能地减少晶体周围以及二极管D1和直流偏置电感器L1之间的寄生电容。否则,由于寄生电容器将占主导地位,因此曲线的变化将远远小于计划。此外,XO可能根本无法运行。
图6显示了我是如何做到的。我把D1和C1焊接成一个“帐篷形状”直接接在原来的电容器垫上。然后我把它们连接到一个SMT电感器(L1),用一根细导线尽量远离地平面,以减少电容。小型的SMT元件是很有趣的,只要你有一个好的双目镜头并且稳稳地拿起烙铁。
图6–SMD组件的特写视图。
固件
最后一项工作是为PIC开发一些固件,模拟TCXO补偿环。幸运的是,Microchip提供了非常有效的工具。我从下载开始Microchip.com公司MPLAB IDE和XC8编译器的最新版本。然后我启动了MCC(MPLAB代码配置器)插件,它允许我生成PIC内部模块所需的所有代码:ADC、DAC、CLKREF、FVR、OPA、EUSART等等。这一步不到10分钟(图7)。
图7——这里显示的是Microchip的MPLAB代码配置器
我用C编写了实际的TCXO仿真程序。因为我只想验证这个概念,所以我实现了一个简单的UART驱动命令集:读取温度;手动将DAC设置为给定值;在RAM中下载温度补偿表;并运行补偿算法。这使我可以将笔记本电脑连接到板卡上,并使用终端仿真软件轻松完成所有实验。
C代码可以从Circuit Cellar的文章代码和文件网页免费下载,它更像是一个实际TCXO实现的起点。我没有将补偿表存储在非易失性内存中,但我想您自己也可以这样做!无论如何,我鼓励您阅读这个源代码,它只有两页长。主补偿循环如清单1所示,简单明了:DAC值是基于当前温度和补偿表中最接近的两个值进行线性插值的。图8显示了运行时的固件输出,包括我的补偿表值。
清单1
LISTING 1 – These lines of code are implementing the TCXO main loop, including linear regression.
case 'R':
printf("nn RUN - any key to stopnr");
while(!EUSART_is_rx_ready())
{
v=AvgAdc();
printf("ADC=%d -> ",v);
// linear regression
if (v
else
{
for(i=1;i
if(v
vout=tabdac[i-1]+
(tabdac[i]-tabdac[i-1])*
(v-tabadc[i-1])/
(tabadc[i]-tabadc[i-1]);
i=NBPOINTSMAX;
}
if (tabadc[i]==0)
{
vout=tabdac[i-1];
i=NBPOINTSMAX;
}
}
}
printf("DAC=%dnr",vout);
DAC1_SetOutput(vout);
__delay_ms(1000);
}
图8–当循环激活时固件输出的示例,显示在加热测试期间。
有效吗?
下一步,是时候测试这个概念是否有效,并确定可以实现什么样的稳定性改进。我周围没有合适的温度测试室,所以我征用了厨房冰箱和烤箱(图9)足以在0到100°C之间进行测试。我将电路板置于不同的温度下,让其稳定下来,并手动更改DAC设置,直到频率达到我想要的频率。
图9–无需昂贵的温度箱即可完成测试。事实上,你只需要一台电脑,一个频率计和一个厨房。
对于频率测量,我使用了一个很好的安捷伦(现在是Keysight)53230A频率计。这个测试给了我校准表所需的值。然后,我启动了补偿回路程序,在测量时钟频率的同时,轻轻加热电路板,使其在整个温度范围内加热。结果如图10所示。Y轴是输出频率(8MHz时钟除以REFCLK块的8),X轴是与温度成比例的ADC值(1000=0°C,2000=100°C)。虚线显示了XO在各种DAC设置下的测量稳定性,无需温度补偿程序。我测量了100°C温差下20Hz(20ppm)左右的变化。未断线表明,温度补偿运行后,稳定性提高到4Hz(4ppm)左右。
图10–虚线显示了五个DAC设置下振荡器频率与温度(6°C至60°C)的关系。当TCXO固件运行时,普通线显示振荡器的稳定性。
因为Keysight 53230A频率计有一个很好的图形特性,所以当电路板快速加热时,可以直观地看到输出频率的变化(图11)。图中显示了TCXO的行为。输出频率随时间线性增加,当固件减少DAC值时,输出频率跳下,试图补偿这种变化。
图11——加热试验期间输出频率随时间变化的近景图。小的垂直步长是当固件循环检测到温度变化时,DAC值变化的结果。
结束
当然,4ppm的稳定性不如现成的精密TCXO好,但是这个实验向你展示了如何在一个标准的低成本晶体周围实现温度补偿。我没有试图优化设计,因为我的唯一目标是向你展示概念。我怀疑这个实验中剩余频率误差的第一个原因是晶体和温度传感器之间的低质量热接触。在我的测试中,这是显而易见的,因为当温度上升或下降时,频率误差是相反的。两种成分中的一种可能有不同的热潜伏期。
不管怎样,我希望这能给你下一个项目一些想法。像往常一样,不要犹豫,自己试试吧。如果你成功地建立了一个超精密的TCXO,那就写下你是怎么做到的,然后把你的文章送到Circuit Cellar发表!
上一篇:技术文章—BJT电流镜重要特性详解
下一篇:新一代硅芯片温度传感器让测量精度更高
推荐阅读最新更新时间:2024-11-13 05:30