Microchip PIC24FJ64GA008 脈衝寬度調變(Pulse Width Modulation,PWM)程式是控制 OC1 (Pin 58,OC1/RD0)引腳輸出,當將輸出比較模組配置為 PWM 操作模式時,筆者使用了 Timer2 作時基標準,設定 OC1、OC1RS 和 OC1R 參數,最後啓動 OC1 輸出,便可以有脈衝寬度調變波形輸出。
Microchip PIC24FJ64GA008 脈衝寬度調變(PWM)顯示 |
1. 通過寫選定的計時器週期寄存器(PRy)設置 PWM 週期。
2. 通過寫 OCxRS 寄存器設置 PWM 占空比。
3. 將初始占空比寫入 OxCR 寄存器。
4. 如果需要的話,允許計時器和輸出比較模組的中斷。如需要使用 PWM 故障引腳,則會用到輸出比較中斷。
5. 通過寫輸出比較模式位元 OCM<2:0>2:0>(OCxCON<2:0>2:0>)將輸出比較模組配置為兩種 PWM 工作模式中的一種。
6. 設置 TMRy 預分頻值並通過設置 TON(TxCON<15>15>) = 1 使能時基。
脈衝寬度調變(PWM)輸出波形 |
可以通過寫 PR2 寄存器來指定 PWM 的週期。
可以使用如下公式計算 PWM 的週期:
▼例:假設振盪頻率 8MHz ( Fosc = 8MHz), TM2 預分頻值 1:1。
PWM 週期 = [ PR2+1] × (1(/Fosc/2)) × TM2 預分頻值
PR2 = (99+1) × (1/(8MHz/2)) × 1
PR2 = (100) × (0.25us) × 1
PR2 = 25us
Microchip PIC24FJ64GA008 計算 PWM周期 |
Microchip PIC24FJ64GA008 計算最大 PWM 分辨率 |
PWM 占空比是通過寫 OCxRS 寄存器設定的。在任何時間都可以寫入 OCxRS 寄存器,但是在 PRy 和 TMRy 發生匹配(即週期完成)前占空比值不會被鎖存到 OCxR。這一機制為 PWM 占空比提供了雙重緩衝,對於消除 PWM 操作中產生的毛刺至關重要。在 PWM 模式中, OCxR 是唯讀寄存器。
以下是 PWM 占空比的部分重要邊界參數:
• 如果占空比寄存器 OCxR 中的值為 0000h,則 OCx 引腳將保持低電平(0% 占空比)。
• 如果 OCxR 中的值大於 PRy (計時器週期寄存器)中的值,則引腳將保持高電平(占空比為 100%)。
• 如果 OCxR 中的值等於 PRy 中的值, OCx 引腳在一個時基計數週期內為低電平,而在其餘計數週期內均為高電平。
PIC24FJ64GA008 脈衝寬度調變(Pulse Width Modulation,PWM)輸出 |
Microchip
PIC24FJ64GA008 Timer2 初始化程式:
CloseTimer2(); //
Timer2 Close
ConfigIntTimer2(T2_INT_ON);
// Timer2 Interrupt ON
SetPriorityIntT2(1); //
Set Interrupt Priority 0~7
OpenTimer2
(
T2_ON & // Timer2 ON
T2_IDLE_CON & // Idle Time Continue Run
T2_GATE_OFF & // Timer2 Gate Time Accumulation
OFF/ON
T2_32BIT_MODE_OFF & // Timer2 32-bit Mode OFF/ON
T2_PS_1_1 & // Prescaler 1:1/8/64/256
T2_SOURCE_INT, // Timer2 Source Oscillator
INT/EXT
99 // PRx=0~65535 99=25us
);
|
Microchip
PIC24FJ64GA008 OC1 初始化程式:
// Configure PWM OC1
// (PRx+1) * (1/(8MHz/2)) * Timer Divider
// ( 99+1) * (0.25us * 2) * 1 = 25us
// Reset PWM
OC1CON = 0x0000; // Turn Off Output Compare 1 Module
// Set PWM Duty Cycle
OC1RS
= 60; // Initialize Second Compare Register
(Duty Cycle =Timer/RS)
OC1R
= 99; // Initialize Compare Register (RS/R)
// Enable PWM
OC1CON = 0x0005; // Load the New Comapre mode to OC1CON
// Mode5 DC=50%
OC1R=High=Timer OC1RS=Low=Timer/2
|
Microchip PIC24FJ64GA008 Timer2 中斷程式:
// Timer2 Interrup
void __attribute__((interrupt,
no_auto_psv)) _T2Interrupt(void) {
IFS0bits.T2IF = 0;
}
|
Microchip PIC24FJ64GA008 OC1 主程式:
while(1){
}
|
PIC24FJ64GA008 脈衝寬度調變(Pulse Width Modulation,PWM)程式試驗 |
2016年 8月 29日 天氣報告
氣溫:26.6度 @ 20:10
相對濕度:百分之 77%
天氣:多雲