前へ 目次 次へ
PWM制御を行う
 

 DCモータやRCサーボモータなど、 各種制御の場面でPWM信号が必要になることがあります。 ここでは、PWM信号とはどういうものなのか、 AKI-H8/3664Fではどのようにプログラムすれば良いのかを見ていきましょう。

PWM出力は、タイマーVを用いてもできますが、 2本分出力する必要があるので、タイマーWを使うことにしました。

 
PWM信号
 

DCモータの速度を変える方法として、 つなぐ電池の本数を変えるということが考えられます。 つまり、1本(1.5V)よりも2本(3V)のほうがモータは早く回り、 2本(3V)よりも3本(4.5V)のほうが早くまわるというわけです。

マイコンのI/OポートはHigh(5V)とLow(0V)の二つの状態しかありませんから、 そのままでは中間の電圧を作ることはできません。 つまり、流れる電流の量が最大量と0のどちらかしかとりえないということになります。 しかし、このHighとLowをすばやく切りかえることで、 中間量の電流が流れているときと同じ状態を作ることができます。 これがPWM(Pulse Width Modulation)信号です。

1周期に対する、High時間の比をデューティー比といいます。

 
サンプルプログラム
 
/*
  PWM信号でモータの速度を変える (pwm01.c)
*/

#include<3664.h>

int main(void)
{

  DI;
  TW.TMRW.BYTE=0x49;      /* FTIOB端子をPWM出力に設定 */
  TW.TCRW.BYTE=0xB2;      /* クロックとして、内部クロックの1/8を使用 FTIOBの初期値は1 */
  TW.TIERW.BYTE=0x70;     /* 割り込みを利用しない */
  TW.TCNT=0x0000;         /* TCNの初期化 */
  TW.GRA=4000;            /* 2mS */
  TW.GRB=2000;            /* 1mS */
  TW.TMRW.BIT.CTS=1;      /* TCNTカウンタスタート */
  EI;
  while(1){
    ;
  }
  return(0);
}

 
プログラム解説
 

  • TCNTカウントの停止、FTIOB端子をPWM出力に設定
  • TCNTの1ステップを、内部クロックの1/8(0.5uS)に設定
  • TCNTとGRAの値が一致したらTCNTを0に戻す
  • TCNTとGRBの値が一致するまで、FTIOB端子は1にする(一致したら0出力)
  • 割り込み無し
  • GRAを4000に設定(TCNTの値と一致するには、0.5uSX4000=2mS必要)
  • GRBを2000に設定(TCNTの値と一致するには、0.5uSX2000=1mS必要)


TW.TMRW.BYTE=0x49

タイマモードレジスタW(TMRW)

ビットビット名機能
7CTS0:TCNT(16ビットタイマカウンタ)カウントの停止
1:カウントの開始
6 常に1
5BUFEB0:GRDをインプットキャプチャ/アウトプットコンペアレジスタとして使用
1:GRBのバッファレジスタとして使用
4BUFEA0:GRCをインプットキャプチャ/アウトプットコンペアレジスタとして使用
1:GRAのバッファレジスタとして使用
3 常に1
2PWMD0:FTIOD端子をアウトプットコンペア出力にする
1:PWM出力にする
1PWMC0:FTIOC端子をアウトプットコンペア出力にする
1:PWM出力にする
0PWMB0:FTIOB端子をアウトプットコンペア出力にする
1:PWM出力にする

ここで関係があるのは、CTSを0としてカウントを停止していることと、 FTIOB端子をPWM出力にしているところです。 後は全てデフォルト値を代入しておきました(良く分からないところは無視しましょう(@@)/)。 FTIOC端子もPWM出力に設定する場合には、 PWMCも1にする必要があります。


TW.TCRW.BYTE=0xB2

タイマコントロールレジスタW(TCRW)

ビットビット名機能
7CCLR1:TCNT(16ビットタイマカウンタ)はコンペアマッチAによってクリアーされる
6CKS TCNTに入力するクロック数を選択
  • 000:内部クロックをカウント
  • 001:内部クロックの1/2をカウント
  • 010:内部クロックの1/4をカウント
  • 011:内部クロックの1/8をカウント
  • 1xx:外部イベント(FTCI)の立ちあがりエッジをカウント
5
4
3TOD最初のコンペアマッチDが発生するまでのFTIOD端子の出力を設定
0:初期出力値0
1:初期出力値1
2TOC最初のコンペアマッチCが発生するまでのFTIOC端子の出力を設定
0:初期出力値0
1:初期出力値1
1TOB最初のコンペアマッチBが発生するまでのFTIOB端子の出力を設定
0:初期出力値0
1:初期出力値1
0TOA最初のコンペアマッチAが発生するまでのFTIOA端子の出力を設定
0:初期出力値0
1:初期出力値1

CCLRはTW.GRAの値とTCNTの値が一致したとき、 TCNTの値を0に戻すかどうかの設定です。 ここでは、TW.GRAをPWM信号の周期として使うために、 0に戻す設定にしました。

CKSはTCNTを1増やすまでの時間の設定です。 AKI-H8/3664 QFP版の内部クロックは16MHzですから、 1/8すると2MHzとなり、TCNTが1増えるまでの時間は1/2MHz=0.5uSということになります。

TOBはTW.GRBの値とTCNTの値が一致するまでに、 FTIOB端子に0を出力するのか、1を出力するのかを設定します。 ここでは最初は1を出力し、TW.GRBの値とTCNTの値が一致したら0にすることにしました。


TW.TIERW.BYTE=0x70

タイマインタラプトイネーブルレジスタW(TIERW)

ビットビット名機能
7OVIE 1:TSRWのOVFフラグによる割込み要求が可能
6 常に1
5
4
3IMIED1:TSRWのIMFDによる割込み可能
2IMIEC1:TSRWのIMFCによる割込み可能
1IMIEB1:TSRWのIMFBによる割込み可能
0IMIEA1:TSRWのIMFAによる割込み可能

ここでは、全ての割込みを禁止しておきました。 デフォルト値のままなので、この行は無くても同じです。


TW.TCNT=0x0000

TCNTを0に初期化しています。


TW.GRA=4000

TCNTの1ステップが0.5uSなので、周期が0.5uSX4000=2mSになるように設定したことになります。


TW.GRB=2000

TCNTの1ステップが0.5uSなので、Highの時間がが0.5uSX2000=1mSになるように設定したことになります。 デューティー比は0.5になります。

FTIOC端子のデューティー比を設定するためには、 TW.GRCを設定します。 FTIOD端子ならTW.GRDになります。 周期は、TW.GRAの設定が共通に使われます。

 
実行結果
 

 
やって見よう
 

  • 周期が20mS、デューティ比が0.05(パルスがONの時間が1mS)のPWM信号を出力してみましょう。

 
2003/06/08(Sun)
AKI-H8/3664 QFP版のトップページへ
トップページへ
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送