其實這部分功能我大致是會的,之前工作中在類似晶元上也實現過。今天想整理一下主要是因為我覺得我想整理一下學習的思路,可以作為其他人的乙個參考。
我覺得學習與開發在實際的操作上應該是有較大區別的。開發的目的很純粹,就是讓功能可用。但是,學習的目的與之不同,應該是以點窺面,能夠從系統觀、大局觀上掌握相應物件的全部功能並且探索使用場景。
如果是進行系統時鐘,或者說是整個fmpll的功能配置,或許開發中只是能夠實現其執行即可,但是學習我得找到一種方**。
以下是mcu手冊中的乙個機理圖:
我們需要的是最後的輸出,而向前找,其實是vco的輸出。而這個是有乙個範圍要求的,因此我們需要在這個約束條件下進行我們相應功能的探索。
而這個設計又有乙個關鍵的點,其實在於暫存器的取值約束。
綜合上面的兩個條件約束,結合手冊中給出的公式,其實這個配置就非常容易了。
既然,增強模式是手冊中推薦的,自然應該採用增強模式。而這個模式下,其實還有乙個調製的功能可以用。針對系統時鐘而言,最簡單的實現還是上述兩個約束條件加上三組公式中的後兩組。
核心設計**如下:
uint8_t fmpll_init(uint8_t ref_clock, uint8_t system_clk)}}
} }ret = fmpll_set_failed;
set_system_clk:
fmpll.esyncr1.b.clkcfg = 0b001;
fmpll.esyncr1.b.emode = 0b1;
fmpll.esyncr1.b.eprediv = eprediv;
fmpll.esyncr1.b.emfd = emfd;
fmpll.esyncr2.b.erfd = erfd;
siu.sysdiv.b.bypass = 1;
fmpll.esyncr1.b.clkcfg = 7;
while(fmpll.synsr.b.lock == 0)
/* clear loss of lock flag */
fmpll.synsr.b.lolf = 1;
/* normal mode with crystal reference */
fmpll.esyncr1.b.clkcfg = 0b111;
return ret;
}
可以通過pit的中斷看一下準確度。為了測試,我加了乙個led閃爍,簡單秒錶統計了一下。
40m:pass
50m:pass
60m:pass
70m:pass
80m:pass
有意思的是,手冊中描述了這個晶元的最高時鐘是80m,但是實際的使用中我使用了120m居然依然可以正常工作,而且計時準確。
開源工程 mpc
mpc peter lee 2008 06 05 一 簡介 遺憾的是mpc工程在2006年04月停止了更新,同時所幸的是有兩個開源工程在mpc的基礎上繼續更新,乙個是mpc2,主要是clsid2在維護,主要是修正mpc原工程中的一些bug,不新增新功能 另乙個mpc home cinema比較強了,...
控制理論 MPC(二)
假設我們車輛的制動延遲是 100ms100ms 本文中模型採用10步 每步間隔為 50ms50ms 即模型 的前兩步實際上是制動延遲的時間內,即實際上這兩步中車輛仍然在執行上乙個狀態的制動指令,那麼為了讓模型更加貼近實際,我們就約束這2步的制動指令,即 a,deltaf a,deltaf 為上一狀態...
MPC初學2(數學建模)
模型 控制系統是基於數學建模,這種模型被稱為狀態 空間模型。通過狀態 空間模型,能用當前的狀態變數和操縱變數 偏差值 來表示未來狀態量。接下裡我們舉乙個單輸入 單輸出的例子,它可以被如下描述 xm k 1 amxm k bmu k y k cmxm k 其中u k 是操縱變數,作為輸入 xm k 是...