H8/3048のPWMについての覚書
Copyright (C) 11Feb2004 coskx
【1】H8/3048のITUを使用したPWMテスト
マニュアルによるとITUを利用したPWM信号発生でのGRA,GRBの設定は次のようになっている。
 |
|
図1 PWM信号発生 |
ITU3chを使用したPWMについて次のプログラムによるテストを行なった。テストは端子をオシロスコープで観測し,周期とHigh出力区間長を測定する。
|
H8/3048のITUを使用したPWMテスト |
|
/********************************************************** PWMのテスト **********************************************************/ #include
<3048f.h> #include "h8_3048.h"
/*検査用PWM出力*/ /*出力端子 2 TIOCA3/PB0
CN1-16*/
/*ITU channel3 でPWM出力*/ void
initPWM3(unsigned short int pwmmax, int
clockindex) { ITU3.TCR.BIT.TPSC=clockindex;
/*内部クロックφでカウント*/ ITU3.TCR.BIT.CKEG=0;
/*立ち上がりエッジでカウント*/ ITU3.TCR.BIT.CCLR=1;
/*GRAのコンペアマッチでTCNTをクリア*/
ITU3.GRA=pwmmax;
/*GRAの値(GRB=GRAのときPWMが100%)をPWM_MAXに設定*/
ITU3.GRB=0;
/*GRBの値を0に設定(=PWM0%)パルス幅はこの値に依存*/
ITU.TMDR.BIT.PWM3=1;
/*ITUのPWMに使うchをPWMモードに設定*/
ITU3.TIOR.BIT.IOB=0;
/*TIOCBにPWM信号を出力しないように設定*/
ITU.TSTR.BIT.STR3=1; /*カウントスタート(PWM信号が出力される)*/ }
/*PWM出力 void outPWM3(unsigned int
value) { ITU3.GRB=value; } */ #define
outPWM3(value) (ITU3.GRB=value)
main() {
int pwmvalue; initSCI1();
initPWM3(5, 3); /*clock:φ/8 ★1 */ while(1)
{
pwmvalue=getIntSCI1("value=");
outPWM3(pwmvalue);
} }
/*
★クロック周期はCPUのクロックに依存する
16MHzのH8/3048では0.5μsecの8分周されたクロックをカウントする
25MHzのH8/3048fone,H8/3052などは0.32μsec(8/25μsec)のクロックをカウントする
*/
|
#includeのところは,それぞれの環境で変更してコンパイル実行すること。
【2】周期とHigh出力区間長観測結果
GRA設定値は周期を設定し,GRBはHigh出力区間長を設定しているつもりであった。ところが,実際の周期とHigh出力区間長は次のようになった。
| GRB設定値 |
測定されたHigh出力区間長 |
|
0 |
1クロック |
|
1 |
2クロック |
|
2 |
3クロック |
|
3 |
4クロック |
|
4 |
5クロック |
|
5 |
不定(H継続またはL継続) |
|
6以上の値 |
H継続 |
すなわち,H8のPWM発生機構には2つの問題がある。
(1)(GRAに設定した値+1)がPWM周期になるため,周期をNにしたかったらGRAへの設定値はN-1にすること
(2)デューティ比0/NのPWM信号とデューティ比N/NのPWM信号は普通には発生できないので,工夫が必要である。
【3】推奨する周期設定と,High出力区間長設定
プログラム中で周期設定とHigh出力区間長設定は関数で行なうこととし,関数の引き数はそれぞれ周期とHigh出力区間長を単位クロックで与える
ものとする。またHigh出力区間長を0にするには出力を立ち上がらせない処置を行なうか,1クロックのHigh出力区間長を許すしかない。
|
H8のPWM発生機構の欠点を補った 初期設定+PWM周期設定関数と,PWM出力値設定関数 の利用 |
|
/********************************************************** PWMのテスト **********************************************************/ #include
<3048f.h> #include "h8_3048.h"
/*検査用PWM出力*/ /*出力端子 2 TIOCA3/PB0
CN1-16*/
/*ITU channel3 でPWM出力*/ void
initPWM3(unsigned short int pwmmax, int
clockindex) { ITU3.TCR.BIT.TPSC=clockindex;
/*内部クロックφでカウント*/ ITU3.TCR.BIT.CKEG=0;
/*立ち上がりエッジでカウント*/ ITU3.TCR.BIT.CCLR=1;
/*GRAのコンペアマッチでTCNTをクリア*/
ITU3.GRA=pwmmax-1; /*GRAの値(GRB=GRAのときPWMが100%)をPWM_MAXに設定*/
ITU3.GRB=0;
/*GRBの値を0に設定(=PWM0%)パルス幅はこの値に依存*/
ITU.TMDR.BIT.PWM3=1;
/*ITUのPWMに使うchをPWMモードに設定*/
ITU3.TIOR.BIT.IOB=0;
/*TIOCBにPWM信号を出力しないように設定*/
ITU.TSTR.BIT.STR3=1; /*カウントスタート(PWM信号が出力される)*/ }
/*PWM出力*/ void outPWM3(unsigned
int value) { if (value)
{ ITU3.TCR.BIT.CCLR=1;
/*GRAのコンペアマッチでTCNTをクリア*/ if
(ITU3.GRA==value-1) value++;
else value--;
ITU3.GRB=value; } else
{ ITU3.TCR.BIT.CCLR=2;
/*GRBのコンペアマッチでTCNTをクリア*/
} }
main() { int pwmvalue;
initSCI1(); initPWM3(5, 3); /*clock:φ/8 ★1 */ while(1)
{
pwmvalue=getIntSCI1("value=");
outPWM3(pwmvalue);
} }
/*
★クロック周期はCPUのクロックに依存する
16MHzのH8/3048では0.5μsecの8分周されたクロックをカウントする
25MHzのH8/3048fone,H8/3052などは0.32μsec(8/25μsec)のクロックをカウントする
*/
|
これらの初期設定+PWM周期設定関数と,PWM出力値設定関数により,H8CPUのPWM発生機構の欠点を補うことができ,次のような所望の結果が得られた。
| PWM出力値 |
測定されたHigh出力区間長 |
|
0 |
0クロック |
|
1 |
1クロック |
|
2 |
2クロック |
|
3 |
3クロック |
|
4 |
4クロック |
|
5 |
H継続 |