高速PWMモード 1波形
タイマー0の高速PWM機能で パルス波1つを発生させてみます。
      
      H8のタイマVのチャートですが

H8/3664のタイマーVのPWMモードの例ですが
- TCORB を周期
- 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% の波形出力
- twtter
- google+
- hatena

 
    