タイマー0でPWM波形の発生

AVR2313

タイマ0の高速PWM機能について

 

AVRのタイマーがもつ機能をつかってPWMの波形の発生方法

タイマーに機能が備わっているので設定方法によりPWM波形が作れます。

高速PWMモード 1波形

タイマー0の高速PWM機能で パルス波1つを発生させてみます。

H8のタイマVのチャートですが

 

 

H8/3664のタイマーVのPWMモードの例ですが

  1. TCORB を周期
  2. TCORAでコンペアマッチで波長

としてPWM波形を作っています

 

 

同様に AVR タイマーで TCNT=OCR0A(Top値)  として
  OCR0A(図でTCORB)で周期を
  OCR0B( H8のタイマVのチャート図でTCORA)で コンペアマッチとなる デューティ比 で波形を作る

 

1. PWMモードでは 自動的に波形出力ピンは

PD4(OCR0B)

PB2(OCR0A) となる

2.PWM出力の場合、方向設定レジスタDDR×で 対応ピン

PD5(OC0B)

PB2(OC0A)  は出力に設定する必要あり

     

ファイル名


 

#include 

int main(){


        DDRD = 0xF3;            // ポートDを1111 0011  #2,3だけ入力設定
        PORTD = 0x0C;           //          0000 1100  #2,3だけ内部プルアップ設定

        TCCR0A = 0x23;          // 0011 0011    高速PWMモード (cpmB=OC0B)
        TCCR0B = 0x0A;          // 0000 1010    1/8 ,Top=OC0A

    TCNT0 = 0;                  // タイマ0の初期値

        OCR0A=122;                              // 周期 1kHz
        OCR0B=96;                               // Dty 80%


        while(1){
                if( bit_is_clear (PIND,PD2) ) {                 // SW_on  ポートD#2 ==0 なら
                        OCR0B=24;               // Dty 20%
                }else{                                          //SW_off ポートD#2 ==1 なら
                        OCR0B=96;               // Dty 80%                      
                }  
        }       

}
       

 

  • OCR0Aで 周期を
  • OCR0Bで コンペアマッチとなる デューティ比 で 波形を作る

 

OCR0A を周期に(Top値=OCR0A)するには WGM02 = 1 に設定

 

OCR0Bで コンペアマッチとなる デューティ比 にするので

TCOR0A COM0B0 COM0B1  
  1 1 Lowスタートに設定
  1 0 Highスタートに設定

 * タイマー設定参照

 

●動作

出力ピン PD4(OC0B) 
入力ピン PD2 -SW

 

周期 約1kHz Dty 80%
LED Dty 80% で点灯

 

スイッチを押している間 Dty20% になりLED暗くなる

 

高速PWMモード 2波形

同様に 周期にオーバーフロー(Top値:タイマカウンタ満タン)
     OCR0A OCR0B のコンペアマッチで 2波形を生成。

 

ファイル名


 

#include 
#include 

enum{   TMR0FuLL = 255,
                TMR0INI = TMR0FuLL - 122,       // 周期 1kHz
                OC0A_INI = TMR0INI + 96,        // Dty 80%
                OC0B_INI = TMR0INI + 24         // Dty 20%
};

ISR(TIMER0_OVF_vect) {          //Tmr0オーバーフロー割り込み関数
        TCNT0 = TMR0INI;                // タイマ0の初期値
}

int main(){

        DDRB = 0xFF;            // ポートbを全出力設定
        DDRD = 0xF3;            // ポートDを1111 0011  #2,3だけ入力設定
        PORTD = 0x0C;           //          0000 1100  #2,3だけ内部プルアップ設定

        TCCR0A = 0xA3;          // 1010 0011    高速PWMモード 
        TCCR0B = 0x02;          // 0000 0010    1/8 ,Top=OVF
        TIMSK = 0x02;           // 0000 0010    TMR0 TMR0_OVF割込み許可

    TCNT0 = TMR0INI;                    // タイマ0の初期値
 
        OCR0A = OC0A_INI;                               /// Dty 80%
        OCR0B = OC0B_INI;                               // Dty 20%

        sei();                  // 割り込みの許可
        while(1);

}
       

 

Top値=OCR0A(Top値)  としていたのをTop値=オーバーフローにし、
TCCR0B = 0x02;     // 0000 0010 1/8 ,Top=OVF

 

初期値TCNT0 = TMR0INI を設定することで、周期を作る。
周期に使っていたコンペアマッチA はパルス波形を作るのに使用できるのでコンペアマッチA ,Bで 2波形を発生

 

動作

周期約1kHz

PD4(OC0B)   Dty 20%

PB2(OC0A)   Dty 80% の波形出力

 

 

スポンサーリンク
  • facebook
  • twtter
  • google+
  • hatena