STM32系列處理好像都有內(nèi)置的RC振蕩器,這個內(nèi)置RC振蕩器可以代替外置晶振,可以節(jié)省成本和PCB空間。
我之前有幾個設(shè)計(jì)都是使用的內(nèi)置的晶振,覺得使用起來很方便,我也知道內(nèi)置振蕩器的精度不如外置的晶振晶振精度,但是一直沒有遇到對于振蕩器的精度有十分嚴(yán)格的要求的應(yīng)用。不過這次對付一個對時間精度要求比較高的應(yīng)用,我發(fā)現(xiàn)了內(nèi)置RC振蕩器和外置晶振的差別還是很大的,而其我使用的還是最廉價的外置晶振,其精度就遠(yuǎn)高于內(nèi)置振蕩器。
例如有個應(yīng)用我需要精確延時9999秒鐘,使用定時器進(jìn)行定時中斷,設(shè)置10ms的定時周期,需要經(jīng)過9999 / 10 * 1000=999900個定時周期才能完成。而定時器的時鐘源是由APB2(文檔上寫的是APB1,程序上是APB2)提供的,APB2的時鐘最終來自HSI、PLL、HSE三個時鐘源。因此我簡單測試了一下使用HSI和HSE通過PLL倍頻之后得到的時鐘的精度。但是直接測量9999秒鐘的時間有點(diǎn)麻煩,我就測量2秒鐘的時間即可,看看定時2秒鐘,內(nèi)外時鐘源分別能提供什么樣的精度,采集設(shè)備使用邏輯分析儀或者示波器即可。
下面是使用HSI時鐘測到的2秒鐘的波形:
可以看到實(shí)際定時時間為2.004270583秒鐘,規(guī)定 α = Ta / Tb,其中Ta表示設(shè)定的定時時間,Tb表示實(shí)際定時時間晶振精度,阿爾法為比例系數(shù),我們大致按照比例縮放來計(jì)算如果定時9999秒的話實(shí)際定時時間為Ta = Tb * α =10020.3507797085秒,誤差為21秒鐘,說實(shí)話,這誤差已經(jīng)很大了。
使用外置晶振進(jìn)行測試結(jié)果如下:
可以看到實(shí)際定時時間為2.000074417秒,按照同樣的方法進(jìn)行計(jì)算可以得到Ta = Tb * α =9999.3720477915秒,誤差0.372秒,這個是完全可以接受的,如果還要更高精度的定時時間可以使用更高精度的晶振,也可以使用頻率值高一點(diǎn)的晶振,然后下調(diào)PLL倍頻系數(shù),因?yàn)榫д竦恼`差是固定的,經(jīng)過PLL倍頻之后,誤差同樣被放大了,降低PLL倍頻系數(shù)可以減少誤差的放大。同樣的還可以直接選取48MHz的晶振,然后SYSCLK的時鐘源直接選擇HSE即可,這樣誤差可以做到更小,但是STM32能支持最大的晶振是有限制的。
文章由啟和科技編輯