小窺STM32內部時鐘

2021-08-15 08:19:30 字數 2528 閱讀 2015

在電子設計競賽中,我們有時候希望能夠對機械人雲台發射機構的摩擦輪進行測速,一是為了摩擦輪斜坡啟動不至於啟動電流過大,二是為了防止摩擦輪在發射子彈過程中轉速受到撥彈的影響以致轉速波動。

在初期,我們的方案有兩個,一是使用as5048編碼器測量轉速,二是使用霍爾感測器測量轉速。在對兩個方案進行**驗證時,由於as5048在國內的使用較少,資料很少,硬著頭皮看它的英文資料,發現as5048實際上是絕對式編碼器,並不適於測量轉速如此之快的摩擦輪,但是鑑於stm32f4的強大(高頻處理能力),最後還是使用兩次平均的方法求取出了摩擦輪的轉速,關於as5048的相關測速方法以及**有機會再說。

接著好好談一下我們所使用的霍爾感測器測速。在深入了解後發現,霍爾感測器測速實際上有兩種方法,一是測頻法,二是測周法

所謂測頻法,即,使用兩個定時器,例如tim2與tim3,其中,tim2用於捕捉霍爾感測器的下降沿,並在捕獲中斷中對下降沿計數,tim3用於計一段固定的時間,如此便可以做到測量一定時間內得到的脈衝個數。設tim3計時時間為t,摩擦輪上安裝的磁鐵個數為n,得到的脈衝個數為p,則可知摩擦輪轉速為(p*60)/(n*t)。

所謂測周法,即,僅使用乙個定時器,如tim2,並使用tim2輸入捕獲霍爾感測器的下降沿輸出,但是此時我們並非對下降沿計數,而是直接計算兩次輸入捕獲之間的時間,而這個時間即轉動1/n圈所使用的時間,如此也可得到轉速,且僅僅使用了乙個定時器。但是,在寫測周法的**時,我意識到了一件比較重要的事情,那就是系統時鐘的頻率會直接影響測周法的準確性。

這裡需要補充一些關於系統時鐘的重要資訊。通過閱讀《stm32f4開發指南-庫函式版本》p108可知,「stm32f4有兩個pll,第乙個是主pll(pll)由hse或者hsi提供時鐘訊號,並具有兩個不同的輸出時鐘,其第乙個輸出pllp用於生成高速的系統時鐘(最高168mhz),第二個輸出pllq用於生成usb otg fs的時鐘(48mhz),隨機數發生器的時鐘和sdio時鐘;第二個是專用pll(plli2s)用於生成精確時鐘,從而在i2s介面實現高品質音訊效能」,我們在輸入捕獲時使用的是timx所使用的時鐘,這個時鐘實際上是從上述主pll時鐘的第乙個輸出分頻後得到的。那麼問題來了,主時鐘的頻率是多少?timx的分頻係數又是多少?只有確定了這兩個量,才能正確初始化我們的輸入捕獲函式。

同樣根據《stm32f4開發指南-庫函式版本》p108可以得到主pll生成的第乙個輸出高速時鐘pllp的計算公式pll=e*n/(m*p),其中e為外部晶振頻率,n為倍頻器倍頻係數,m與p均為分頻器分頻係數(其具體位置參見《stm32f4開發指南-庫函式版本》p108的stm32系統時鐘圖)。在**層面,e為外部晶振頻率,參照核心板原理圖即可得到,而n、m、p均可在system_stm32f4xx.c檔案中看到。這個檔案中還提供了f4各類mcu的匯流排分頻係數,如apb1 prescaler,apb2 prescaler等等,均可查詢到並進行修改。

了解以上這些的必要性在於,由於學習者一般使用的是正點原子提供的stm32f407核心板,其外部晶振頻率為8mhz,另外三個係數分別為m=8,n=336,p=2。代入上述計算公式得到主pll時鐘為168mhz,而apb1的分頻係數為2。但是,我們要進行**移植時,則不可避免地會遇到這些值都發生改變的情況。如大疆公司提供的stm32f427板子,其外部晶振頻率為12mhz,為了保證之前在f407的**依舊可以使用,我們就要使得通過一定的**設定,使得計算出來的主pll仍為168mhz,簡單地設定為,將system_stm32f4xx.c檔案中第316行的pll_m值設為12,第335行pll_n值設為336,代入主pll計算公式可知計算結果為168mhz。這個值一般即系統時鐘的頻率。如此便可以輕鬆地將f407的**直接移植到f427身上。需要注意,f407與f427的各匯流排對於主pll的分頻係數也是不同的,所以在初始化時鐘使,需要格外留意。如,經過以上設定,f407的apb1分頻係數為4,而f401則為2,這在有關時鐘的各類初始化中都非常需要留意,除非apb1的分頻係數是1,否則通用定時器的時鐘等於apb1時鐘的2倍

還有一點需要格外留意,一般來說,輸入捕獲的計數值越大越好,在通用定時器中,tim2和tim5均是32位定時器,應當盡量使用這兩個計時器進行測速。如,我們初始化tim5時鐘為tim5_ch2_cap_init(0xffffffff,42-1),簡單計算可知計數0xffffffff需要的時間大約要4000多秒,對於測量大多數訊號頻率綽綽有餘。而如果使用16位定時器,其最大計數值為0xffff,計數時間則大大縮減,大約只有66ms,一般是不適於用於輸入捕獲的。

通過了解上述知識點,就可以在使用測周法測速時獲得準確的脈衝週期,精確地獲得速度並進行反饋控制了。

綜合而言,測頻法僅適合於測試頻率較高的訊號,能夠在固定時間內給出速度值,而測周法則對於低頻高頻訊號都有較高的適用性,但是其測量速度的速度是受所測脈衝控制的。在mcu資源較為稀缺的情況下,使用測周法更加合適。

stm32 內部時鐘的使用

include system clock.h include stm32f10x.h define sys default count freq 285522 系統上電後預設時鐘計數頻率hz,測試得出 define vect tab offset 0x0 vector table base offs...

STM32系統時鐘

1 參考資料 stm32f1開發指南 庫函式版本 4.3小節 時鐘系統 stm32中文參考手冊v10 第六章 復位和時鐘控制 rcc 2 時鐘系統知識總結 1 stm32有5個時鐘源 hsi hse lsi lse pll hsi是高速內部時鐘,rc振盪器,頻率為8mhz,精度不高 hse是高速外部...

stm32系統時鐘

hsi 約等於8mhz rc振盪器產生的時鐘 hse 外部時鐘 css 如果檢測到外部時鐘的損壞,自動切換到hsi 系統時鐘和rtc時鐘 均有三個 systick定時器 簡單的定時器,常用來做延時和心跳時鐘 24位的倒計時定時器 ctrl暫存器 其實滴答定時器很簡單,就是設定初值,然後延遲,最後就是...