2016年8月29日 星期一

DIY - PIC24:PIC24FJ64GA008 脈衝寬度調變(PWM) 程式(四十九)

DIY - PIC24PIC24FJ64GA008 脈衝寬度調變(PWM) 程式(四十九): 

Microchip PIC24FJ64GA008 脈衝寬度調變(Pulse Width ModulationPWM)程式是控制 OC1 Pin 58OC1/RD0)引腳輸出,當將輸出比較模組配置為 PWM 操作模式時,筆者使用了 Timer2 作時基標準,設定 OC1OC1RS OC1R 參數,最後啓動 OC1 輸出,便可以有脈衝寬度調變波形輸出。

Microchip PIC24FJ64GA008 脈衝寬度調變(PWM)顯示
脈寬調製模式(Pulse Width ModulationPWM): 
1. 通過寫選定的計時器週期寄存器(PRy)設置 PWM 週期。 
2. 通過寫 OCxRS 寄存器設置 PWM 占空比。 
3. 將初始占空比寫入 OxCR 寄存器。 
4. 如果需要的話,允許計時器和輸出比較模組的中斷。如需要使用 PWM 故障引腳,則會用到輸出比較中斷。
5. 通過寫輸出比較模式位元 OCM<2:0>OCxCON<2:0>)將輸出比較模組配置為兩種 PWM 工作模式中的一種。 
6. 設置 TMRy 預分頻值並通過設置 TONTxCON<15> = 1 使能時基。

脈衝寬度調變(PWM)輸出波形
PWM 週期 (Period)
可以通過寫 PR2 寄存器來指定 PWM 的週期。 

可以使用如下公式計算 PWM 的週期:
▼例:假設振盪頻率 8MHz ( Fosc = 8MHz)TM2 預分頻值 11 
PWM 週期 = [ PR2+1] × (1(/Fosc/2)) × TM2 預分頻值  
PR2 = (99+1) × (1/(8MHz/2)) ×
PR2 = (100) × (0.25us) ×
PR2 = 25us

Microchip PIC24FJ64GA008 計算 PWM周期
Microchip PIC24FJ64GA008 計算最大 PWM 分辨率
PWM 占空比 ( Duty Cycle) 
PWM 占空比是通過寫 OCxRS 寄存器設定的。在任何時間都可以寫入 OCxRS 寄存器,但是在 PRy TMRy 發生匹配(即週期完成)前占空比值不會被鎖存到 OCxR。這一機制為 PWM 占空比提供了雙重緩衝,對於消除 PWM 操作中產生的毛刺至關重要。在 PWM 模式中, OCxR 是唯讀寄存器。

以下是 PWM 占空比的部分重要邊界參數:
• 如果占空比寄存器 OCxR 中的值為 0000h,則 OCx 引腳將保持低電平(0% 占空比)。
• 如果 OCxR 中的值大於 PRy (計時器週期寄存器)中的值,則引腳將保持高電平(占空比為 100%)。
• 如果 OCxR 中的值等於 PRy 中的值, OCx 引腳在一個時基計數週期內為低電平,而在其餘計數週期內均為高電平。

PIC24FJ64GA008 脈衝寬度調變(Pulse Width ModulationPWM)輸出
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 ModulationPWM)程式試驗
2016年 8月 29日 天氣報告
氣溫:26.6@ 20:10
相對濕度:百分之 77%
天氣:多雲

沒有留言:

張貼留言