例題4.1 PWM1
CH0からPWM信号を出力します. |
;PWM1.SRC (c)yas@E-SYS Lab. ;******************************** ;* PWM生成プログラム * ;******************************** ; .CPU 300HA ;今回はPWM生成に必要なITU(Integrated Timer Unit)に ;関連するアドレスに名前を付けています. ;詳しくは後ろの説明を見てください. TSNC .EQU H'FFFF61 ;タイマシンクロレジスタの番地 TMDR .EQU H'FFFF62 ;タイマモードレジスタの番地 TCR0 .EQU H'FFFF64 ;タイマコントロールレジスタ番地 GRA0 .EQU H'FFFF6A ;CH0ジェネラルレジスタAの番地 GRB0 .EQU H'FFFF6C ;CH0ジェネラルレジスタBの番地 ;ITUがGRB0の値となったらクリアされ0となるように ;設定しています. MOV.B #B'11000011,R0L ;GRB0とコンペアマッチ(一致)で MOV.B R0L,@TCR0 ;カウンタークリア ;上の4行ではPWMを立ち上げる(1を出力する)タイミングGRAと ;立ち下げる(0を出力する)タイミングを設定しています. ; ;また,下の4行ではPWM端子0番(ポートの番)をPWM出力端子 ;として設定したあと,0番のタイマのカウントを開始しています. 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のカウントを始める ;プログラムメイン部分です. ;今回ここではは無限ループをしているだけです. ;BRAはJMPと基本的には同じで指定された場所へと ;ジャンプします. ;興味のある人は違いを調べてみましょう. ;PWMの立ち上げ,立ち下げタイミングのデータを ;数値入力しています. ;今回はプログラムがそれほど長くないですが, ;長くなってくるとデータ部分がわかりやすい ;場所に,また一箇所にまとめてあると便利です. ;ここでの数値と初期設定でのカウントクロックの指定により ;PWMの周期(タイマクリアタイミング=立ち下げタイミング)と ;立ち上げ時間(PWMが1を出力している時間=GRAからGRBまでの間)が ;決まります. ;なお,(立ち上げ時間)/(周期)をデューティー比と呼びます. GRA0_UP: .DATA.W H'1800 ;GRA0,CH0波形立ち上げタイミングデータ GRB0_DW: .DATA.W H'3000 ;GRA0,CH0波形立ち下げタイミングデータ
.END
|
課題 4.1の説明
|
今回新たに出てきたニーモニック
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を使用します. |
![]() |
・ PWMモードの設定 CH0,CH1のPWMモードに設定する流れ. カウンタクロックの選択: CH0,CH1の各TCR0,1のTPSC2〜TPSC0(タイマプリスケーラ)ビットに1または0を書き込んで設定します.ここでは,φ(CPUのクロック周波数)に設定します. |