例題4.1 PWM1


CH0からPWM信号を出力します.
;PWM1.SRC              (c)yas@E-SYS Lab.

;********************************
;*      PWM生成プログラム     *
;********************************
;

;------CPUの指定---------
        .CPU    300HA

;---------シンボルの定義----------
;今回はPWM生成に必要なITU(Integrated Timer Unit)に
;関連するアドレスに名前を付けています.
;詳しくは後ろの説明を見てください.

TSTR    .EQU    H'FFFF60               ;タイマスタートレジスタの番地
TSNC    .EQU    H'FFFF61               ;タイマシンクロレジスタの番地
TMDR    .EQU    H'FFFF62               ;タイマモードレジスタの番地
TCR0    .EQU    H'FFFF64               ;タイマコントロールレジスタ番地
GRA0    .EQU    H'FFFF6A               ;CH0ジェネラルレジスタAの番地
GRB0    .EQU    H'FFFF6C               ;CH0ジェネラルレジスタBの番地
        .SECTION ROM,CODE,LOCATE=H'000100;CODE SECTION 宣言

;------初期化--------
;ITUがGRB0の値となったらクリアされ0となるように
;設定しています.

INIT:   MOV.L   #H'FFF10,ER7           ;スタックポインタの設定
        MOV.B   #B'11000011,R0L ;GRB0とコンペアマッチ(一致)で
        MOV.B   R0L,@TCR0              ;カウンタークリア

;-----初期設定-------
;上の4行ではPWMを立ち上げる(1を出力する)タイミングGRAと
;立ち下げる(0を出力する)タイミングを設定しています.
;
;また,下の4行ではPWM端子0番(ポートの番)をPWM出力端子
;として設定したあと,0番のタイマのカウントを開始しています.

        MOV.W   @GRA0_UP,R0            ;立ち上げデータ領域のデータを読み込む
        MOV.W   R0,@GRA0               ;読み込んだデータをGRA0に書き込む
        MOV.W   @GRB0_DW,R0            ;立下げデータ領域のデータを読み込む
        MOV.W   R0,@GRB0               ;読み込んだデータをGRB0に書き込む 
        MOV.B   #B'10000001,R0L ;TMDRに"10000001"
        MOV.B   R0L,@TMDR              ;CH0のみPWMモードに設定する
        MOV.B   #B'11100001,R0L ;TSTRに書き込み
        MOV.B   R0L,@TSTR              ;CH0のカウントを始める 

;----MAIN-------
;プログラムメイン部分です.
;今回ここではは無限ループをしているだけです.
;BRAはJMPと基本的には同じで指定された場所へと
;ジャンプします.
;興味のある人は違いを調べてみましょう.

PWM:    BRA     PWM                    ;無限ループ

;----DATA SECTION--------
;PWMの立ち上げ,立ち下げタイミングのデータを
;数値入力しています.
;今回はプログラムがそれほど長くないですが,
;長くなってくるとデータ部分がわかりやすい
;場所に,また一箇所にまとめてあると便利です.
;ここでの数値と初期設定でのカウントクロックの指定により
;PWMの周期(タイマクリアタイミング=立ち下げタイミング)と
;立ち上げ時間(PWMが1を出力している時間=GRAからGRBまでの間)が
;決まります.
;なお,(立ち上げ時間)/(周期)をデューティー比と呼びます.

        .SECTION RAM,DATA,LOCATE=H'000B00     ;DATA SECTION 宣言
GRA0_UP:       .DATA.W H'1800         ;GRA0,CH0波形立ち上げタイミングデータ
GRB0_DW:       .DATA.W H'3000         ;GRA0,CH0波形立ち下げタイミングデータ

                  .END 

課題 4.1の説明

  • 4行目 CPUの指定をしています.
  • 6〜11行目 シンボルの定義.タイマスタートレジスタをTSTR,タイマシンクロレジスタをTSNC,タイマモードレジスタをTMDR,CH0のタイマコントロールレジスタ,ジェネラルレジスタA,BをそれぞれTCR0,GRA0,GRB0と表しました.
  • 13行目 CODEセクションの宣言をしています.
  • 16〜18行目 初期化,スタックポインタの設定.TCR(タイマコントロールレジスタ)のCCLR1,CCLR0に1,0,CKEG1,CKEG0に0,0,TPSC2〜TPSC0に0,1,1を書き込みGRB0のコンペアマッチ(一致)でTCNT0がクリアされ,クロックの立ち上がりエッジでカウント動作が行われるように設定しています.また,クロックは内部クロックをプリスケーリングあり(2MHz)で使用するように選択されています.
  • 21〜24行目 データセクションの数値をGRA0,GRB0に書き込んでいきます.
  • 26〜29行目 TMDRのPWM0に1を書き込み,CH0をPWMモードに設定し,TSTRのSTR0に1を書き込みカウンタをスタートさせます.
  • 34〜36行目 34行目ではデータセクションを宣言し,データ領域を確保します.そして,ここにはGRA0,GRB0に書き込むタイミング数値をデータとして書き込んでおきます.

今回新たに出てきたニーモニック

BRA

:指定したところにジャンプします.

Ex) BRA PWM ;PWMにジャンプします

図 4.4を用いて,課題4.1を説明します.
  TCNTは時間とともに増加していきます.TCNTの値がGRAの値と一致したときにTIOCAからの出力が1(電源ON)になります.さらにTCNTの値が増加していくとGRBの値と一致します.ここでTIOCAにから出力は0(電源OFF)になり,TCNTはクリアされH'0000から再びカウントを始めます.これを繰り返し行います.

次に 2本のPWM信号を出力しオシロスコープで確認します.

・ 2本のPWMパルス

複数の ITUチャネルで2本のPWMパルスを生成します.ITUはCH0,CH1を使用します.
  図4.5を見て下さい.TIOCA0,TIOCA1出力に描かれている2本の波形がこれから生成しようとする2本のPWMパルスです.両方とも1周期を同じ長さに設定しています.このような2本のパルス列を生成するには,ITUのCH0,CH1のそれぞれのGRA(ジェネラルレジスタ)に波形立ち上げのタイミング,GRBに波形立下げのタイミングを書き込み,さらにPWMモードに設定するという操作が必要です.

・ PWMモードの設定

CH0,CH1のPWMモードに設定する流れ.

カウンタクロックの選択: CH0,CH1の各TCR0,1のTPSC2〜TPSC0(タイマプリスケーラ)ビットに1または0を書き込んで設定します.ここでは,φ(CPUのクロック周波数)に設定します.

カウンタクリア要因: TCRのCCLR1,0によりカウンタクリアの要因.CH0を親チャネルとしているので,TCR0もCCLR1,0には1,0を書き込みTCR1のCCLR1,0には1,1を書き込みます.

GRAの設定: GRA1,0にそれぞれ出力PWM波形が1になる出力タイミングを書き込む

GRBの設定: GRB1,0にそれぞれ出力PWM波形が0になる出力タイミングを書き込む
→生成波形パターンによりチャネルごとに異なる数値となります.

PWMモードの設定: TMDR(タイマモードレジスタ)でCH0,CH1をPWMモードに設定します.B'10000011を書き込みます.

カウント開始: TSTR(タイマスタートレジスタ)のSTR(スタートレジスタ)1,0ビットにそれぞれ1を書き込んでTCNTのカウントを開始させます.



[山口研究室] <back | index | next >