H8/3048fone のPWMについての覚書

Copyright (C) 11Feb2004 coskx

【1】H8/3048foneのITUを使用したPWMテスト

マニュアルによるとITUを利用したPWM信号発生でのGRA,GRBの設定は次のようになっている。

図1 PWM信号発生

ITU3chを使用したPWMについて次のプログラムによるテストを行なった。テストは端子をオシロスコープで観測し,周期とHigh出力 区間長を測定する。

H8/3048foneのITUを使用したPWMテスト

/**********************************************************
PWMのテスト
**********************************************************/
#include <3048fone.h>
#include "h8_3048fone.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 1msec周期*/
    while(1) {
        pwmvalue=SCI1_getInt("value=");
        outPWM3(pwmvalue);
    }
}

#includeのところは,それぞれの環境で変更してコンパイル実行すること。

【2】周期とHigh出力区間長観測結果

GRA設定値は周期を設定し,GRBはHigh出力区間長を設定しているつもりであった。ところが,実際の周期とHigh出力区間長は次の ようになった。

GRA設定値 測定された周期

5

6クロック

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 <3048fone.h>
#include "h8_3048fone.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 1msec周期*/
    while(1) {
        pwmvalue=SCI1_getInt("value=");
        outPWM3(pwmvalue);
    }
}

これらの初期設定+PWM周期設定関数と,PWM出力値設定関数により,H8CPUのPWM発生機構の欠点を補うことができ,次のような所 望の結果が得られた。

PWM周期設定値 測定された周期

5

5クロック

PWM出力値 測定されたHigh出力区間長

0

0クロック

1

1クロック

2

2クロック

3

3クロック

4

4クロック

5

H継続