富士通MB95F636H輸出PWM
終於畢業了,想想要不是畢設導師不讓我實習,我可能也不會進入這一行。還好之前做過一些競賽,所以逃脫導師魔爪後很快就找到了一份單片機的工作。
PWM
進入公司的第一個任務是做軟啓動,就是讓電機慢慢轉起來。學過單片機的可能馬上就能想到,這不就是單片機嗎!然後我就屁顛屁顛的去看這款富士通636H的數據手冊了。
PPG
手冊上說636H芯片使用PPG輸出PWM波。然後萬事找百度,好像只有富士通的單片機有PPG。。。好在官方給出了說明。
The 8/16-bit PPG is an 8-bit reload timer module that uses pulse output control based on timer operation to perform PPG output. The 8/16-bit PPG also operates in cascade (8 bits + 8 bits) as 16-bit PPG.
用我蹩腳的英語翻譯一下大概意思是,8位/ 16位PPG是一個8位重載定時器模塊,它使用基於定時器操作的脈衝輸出控制來執行PPG輸出。 8位/ 16位PPG也以16位PPG級聯(8位+ 8位)。
然後看他如何產生PWM,和一般產生PWM的方法是一樣的!
寄存器配置
這款單片機一共有3個通道,6個輸出,分別是PPG00、PPG01、PPG10、PPG11、PPG20、PPG21,下圖顯示了各個寄存器的功能。
PPS寄存器用來配置PWM週期,PDS寄存器用來配置PWM的佔空比,即佔空比=PDS/PPS。PPGS和REVC的每一位都代表一個輸出,即bit0表示PPG00,bit1表示PPG01,以此類推。當PPGS對應的位爲1時啓動該輸出的計數,即開啓PWM模式。REVC表示輸出是否反相,對應位爲1則該輸出反相,否則不反相。
PC寄存器是最重要的寄存器。PCn1和PCn0的配置略有不同,畢竟PCn1是能成爲16位PPG高位的存在。
下圖是PCn1配置寄存器的各位功能,其中bit6和bit7無意義。
下圖展示了PCn0的各個位的功能。
配置好這些寄存器就能輸出PWM波了。
PC11 = 0x0b;
PPS11 = 100;
PDS11 = 20;
REVC_REV11 = 0;
PPGS_PEN11 = 1;
上述代碼就演示瞭如何利用PPG11輸出一個8分頻,佔空比爲20%的PWM波。
需要注意的是,636H提供了兩套引腳輸出PPG。對SYSC_PPGSEL進行配置。下圖顯示了不同的配置對應的引腳 。
利用定時器產生PWM
雖然產生了PWM,用示波器看也沒問題,但是!驅動不了電機!看了原理圖,不知道是不是一段高電平,一段PWM所以無法驅動原因。可是板子都打好了,我又不能改引腳,怎麼辦。只能自己造PWM了啊。
其實自己造PWM很簡單,就是使用定時器,在定時器中翻轉點評就可以了,我寫了兩種方法。
第一種,定義一個短時間t的定時器,然後定義進入多少次定時器爲一個週期。比如定義100次爲一個週期,前20次輸出高電平,後80次輸出低電平,那麼該PWM的週期就爲100×t,佔空比爲20%。這種方法的優點是無需重複配置定時器,缺點是無法實現無級調節佔空比。
第二種,進入定時器中斷後輸出高電平,然後配置定時器時間,改變下一次進入定時器中斷的時間,下一次進入定時器中斷後輸出低電平,然後重新配置定時器時間。比如這一次進入定時器,先置高電平,然後配置定時器時間爲20ms,下一次進入定時器中斷後置低電平,然後配置80ms,這樣就能產生一個週期爲100ms,佔空比爲20%的PWM波了。這種方法的優點是能夠實現無級調節佔空比,缺點是每次都需要重新配置定時器,有些單片機在定時器運行過程中是無法更改定時器配置的。
經過測試,第一種方法能夠完美實現軟啓動的要求,第二種方法會使燈先亮,然後變暗再緩緩變亮,分析原因可能是發光二極管導通電壓比較大,而第一種方法一開始就輸出比較大的佔空比(5次中斷爲一週期,最低也有20%的佔空比),所以沒有這種現象。