2014-10-27 160 views
0

我想用這段代碼做一個PWM輸出,但顯然有些東西丟失了。因爲當我檢查MPLab中的邏輯分析儀時,CCP2輸出沒有任何反應。我正在使用pic18f25k80。CCP模塊 - PWM模式

void main() { 

    // Set up PWM 
    CCP2CON = 0b00001100;  // Enable PWM on CCP2, bits 5:4 are LSB part of duty cycle 
    CCPTMRS = 0b00000000;  // Use timer2 for all CCP modules 
    CCPR2L = 31;    // MSB part of duty cycle 
    TRISC = 0b00000000;   // Set port C as output 
    PORTC = 0;     // Clear port C 

    // Set Up timer2 
    PR2 = 249;     // PWM period = (PR+1)*4*Tcy = 1ms 
    T2CON = 0b00000100;   // Enable TMR2 with prescaler = 1 

    while(1) 
    { 
    } 
} 

我期望時

  • TMR2 = PR2,CCP2輸出切換和計時器復位
  • 進一步,TMR2 = CCPR2L(佔空比),CCP2輸出切換
  • TMR2保持計數直到達到步驟1。

    我想這是自動發生的事情。我的意思是我不必爲此編寫代碼,因爲這是PWM模塊的功能,對吧? 我錯過了什麼?

+0

是的,就是這個想法。我不能發現任何與你的代碼有關的明顯問題,但是毫無疑問,在數據表的一個角落裏常常會有一些小問題。您是否嘗試過手動切換引腳以查看您是否在範圍上獲得輸出,當您執行調試器時TMR2是否增加?如果這有效,那麼我的第一個可疑將是邏輯分析儀中的一個錯誤。這些模擬器是臭名昭着的,它可能在真正的硬件上工作得很好 – doynax 2014-10-27 16:21:59

回答

0

附加信息:

  • TMR 2計數。
  • 當我在while循環中添加PORTC = 0xFF;並再次調試代碼時。端口C上的所有信號都置位,除了RC2(RC2 = CCP2的相應輸出)。
  • 當我嘗試使用CCP3的相同代碼時,除了RC2和RC6(RC6 = CCP3的相應輸出)外,端口C上的所有信號都置位。
  • 當我將PORTC = 0xFF;替換爲PORTCbits.CCP2 = 1;時,只有RC1設置爲高。

這最後一顆是否意味着CCP2與RC1而不是RC2混合?

+0

您正在使用哪種編譯器?在Microchip的C18編譯器的p18f25k80.h中,CCP2不是PORTCbits的位字段。 – jolati 2014-10-28 16:49:24

+0

問題出在MPlab的邏輯分析儀上。我在麪包板上測試了相同的代碼,一切正常。謝謝你的時間 – 2014-10-30 14:25:09