正好做過,可以回答一些。
有兩種定時器模擬PWM的方法:
1.假設你要500Hz的PWM,10個佔空比檔。那麼中斷頻率500*10=5000Hz,週期200us。每十次中斷為一個週期,在每次中斷中將當前次序與設定檔進行比較,依此決定輸出電平。這樣你可以控制多路PWM,很顯然當檔位越多,中斷越頻繁。
2.假設你要500Hz的PWM。週期2000us,那麼你只需根據佔空比計算出高電平持續時間、低電平持續時間,將他們作為定時器中斷的時間,進入中斷後設定電平就好。這樣每個週期你只需進入兩次中斷但是隻能控制一路PWM,但是很顯然佔空比可調空間很寬。
兩種方法各有利弊,看你如何取捨了。
其中最核心的問題仍然是中斷處理函式的時間消耗,這個是木桶效應的那個短板。
實際效果怎樣,還需要你接個示波器,慢慢除錯。
推薦邏輯分析儀,曾用8051實現一個定時器產生8路獨立的舵機控制訊號,除錯起來還是很好用的,在只關注數字邏輯時非常好用,除錯神器。
最後還是請不要拿51的定時器來模擬PWM了,太消耗資源了,還是換個高階點的MCU的使用硬體PWM吧,就是配置一下定時器的問題。
還有當你理解了時序後,很多東西都簡單了,隨便寫個串列埠傳送配合邏輯分析儀除錯分分鐘的事。
給個軟體串列埠傳送的小程式,透過時序模擬的,不過沒有示波器,邏輯分析儀的不推薦使用,因為波特率並不是9600,115200之類的通用波特率,需要實測一下還有會有被中斷打斷的風險(也是寫回答到這裡才考慮到的),不過完全是不遜於硬體串列埠的速度的(波特率大於115200),做除錯用還是很方便的。
考慮到可能會有疑問為什麼這麼寫,好像是右移位數不同消耗時間不一樣,這個是看輸出波形發現的,只能透過空指令將每一bit時長拉到一致。
正好做過,可以回答一些。
有兩種定時器模擬PWM的方法:
1.假設你要500Hz的PWM,10個佔空比檔。那麼中斷頻率500*10=5000Hz,週期200us。每十次中斷為一個週期,在每次中斷中將當前次序與設定檔進行比較,依此決定輸出電平。這樣你可以控制多路PWM,很顯然當檔位越多,中斷越頻繁。
2.假設你要500Hz的PWM。週期2000us,那麼你只需根據佔空比計算出高電平持續時間、低電平持續時間,將他們作為定時器中斷的時間,進入中斷後設定電平就好。這樣每個週期你只需進入兩次中斷但是隻能控制一路PWM,但是很顯然佔空比可調空間很寬。
兩種方法各有利弊,看你如何取捨了。
其中最核心的問題仍然是中斷處理函式的時間消耗,這個是木桶效應的那個短板。
實際效果怎樣,還需要你接個示波器,慢慢除錯。
推薦邏輯分析儀,曾用8051實現一個定時器產生8路獨立的舵機控制訊號,除錯起來還是很好用的,在只關注數字邏輯時非常好用,除錯神器。
最後還是請不要拿51的定時器來模擬PWM了,太消耗資源了,還是換個高階點的MCU的使用硬體PWM吧,就是配置一下定時器的問題。
還有當你理解了時序後,很多東西都簡單了,隨便寫個串列埠傳送配合邏輯分析儀除錯分分鐘的事。
給個軟體串列埠傳送的小程式,透過時序模擬的,不過沒有示波器,邏輯分析儀的不推薦使用,因為波特率並不是9600,115200之類的通用波特率,需要實測一下還有會有被中斷打斷的風險(也是寫回答到這裡才考慮到的),不過完全是不遜於硬體串列埠的速度的(波特率大於115200),做除錯用還是很方便的。
考慮到可能會有疑問為什麼這麼寫,好像是右移位數不同消耗時間不一樣,這個是看輸出波形發現的,只能透過空指令將每一bit時長拉到一致。