高速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