最近發現有不少朋友在問,STC單片機(具有PCA功能的),怎么硬件實現可變頻率的PWM輸出。很多朋友還在使用定時器做可變頻PWM。 這里我就具體并僅介紹,怎么使用硬件PWM,在定時器0的分頻基數下設計PWM。
首先看CMOD這個寄存器,這里我們主要關注 CPS0,CPS1,CPS2,這三個位控制選擇PCA的計數脈沖源。 對應PWM功能,則是選擇頻率。 首先可以選擇 6個固定分頻,可以看圖片看出,分別是1,2,4,6,8,12的系統分頻。我們需要做可變頻率的PWM,所以我們需要選擇模式2,選擇定時器0的溢出作為系統分頻基數。
然后,我么看怎么具體的去計算,去實現分頻。 這里就需要上面這個圖片的計算規則。 這里我舉一個例子來說明,比如我們單片機的晶振使用的是12MHZ,而我們需要實現300HZ的頻率。 如果得到呢?
首先,如果我們采用CMOD的固定分頻,可以發現,無論是1,2,4,8,12,分頻下來的頻率都不是300HZ。 所以這里也體現我們使用定時器0做分頻基數的好處了。
我們繼續計算,12MHZ需要轉化為300HZ,那么根據上圖,首先我們需要確定PCA時鐘輸入頻率,根據公式 300*256=76800HZ,這個值就是我們需要的PCA時鐘輸入頻率,F在問題就是 ,我們怎么把12MHZ,轉化為76.8KHZ, 12000KHZ/76.8KHZ=156.25 ,這個156.25就是分頻基數,而這個分頻基數由我們的定時器溢出參數來設定,意思就是當我們定時器如果計數156.25溢出就可以做到分頻基數為156.25, 所以我們在設置定時器0的計數起始值就是65536-156=65380,對應TH0=0XFF,TL0=0X64。
好了,怎么計算PWM在定時器0下實現我們自己需要的任意頻率的計算方式這里就介紹完了。 如果要動態實現頻率可變,我們就可以通過通訊去動態調整定時器0的計數基數,(實際就是調整了分頻基數),就可以實現頻率的改變了。 另外,說明:這里的定時器0,不需要中斷,并且該定時器也不是作為產生PWM用的,是作為一個分頻基數用!
請大家多多交流,如果有描述錯誤,或者不清楚的,可以一起留言。
|