How to compute crystal load capacitors using Python
The UliEngineering library provides a convenient way to compute which load capacitors are suitable for a given crystal oscillator circuit.
First, install UliEngineering using
sudo pip3 install UliEngineering
Now you need to find out the following parameters:
- The load capacitance from the crystal’s datasheet. Typical values would be
7pF
or12.5pF
or20pF
- The pin capacitance
CPin
from the datasheet of the IC your crystal is connected to (e.g. your Ethernet PHY or your RTC). Typical values would be between0.5pF
to5pF
- Estimate the stray capacitance
CStray
from the board (that is the capacitance of each crystal oscillator pin to the PCB ground). You typically just take an educated guess here, so here are some values to start at:- Start at
3pF
- If you have a 4+ layer board (as opposed to a two layer board), add
2pF
(since the distance to the ground plane below is much smaller on 4 layer boards - If you have long traces >1cm (long traces to the crystal should be avoided at all costs!), add
4pF
for each cm of trace beyond 1cm for 2-layer boards or add6pF
for each cm of trace beyond 1cm for 4+ layer boards
- Start at
Now we’ll plug those values into UliEngineering and compute the load capacitance:
from UliEngineering.Electronics.Crystal import load_capacitors
from UliEngineering.EngineerIO import auto_print
auto_print(load_capacitors, cload="9 pF", cpin="1 pF", cstray="5 pF")
This will print 7.00 pF
If you just want to the the value and not an auto-formatted string, use load_capacitors()
directly:
capacitor = load_capacitors(cload="9 pF", cpin="1 pF", cstray="5 pF")
In this example, we’ll get capacitor == 7e-12
.
Note that 7pF
means that you have to add a 7pF
capacitor at each side of the crystal. I recommend to use only NP0/C0G capacitors here since X5R/X7R capacitors and other high-k-dielectric ceramic capacitors not only have a high temperature coefficient but also they are not as suitable for analog applications since their capacitance will change with the voltage being applied.
Note that we used a lot of guesswork in the PCB stray capacitance estimation above, so if you need high accuracy, you need to tune your crystal oscillator to work best with your specific board. See our followup post on How to tune your crystal oscillator to get the best possible frequency accuracy for further reading.