ラベル定義
;**************** Label Definition ********************
cblock h'0c'
データエリアにはCBLOCK疑似命令を使用して0Chから自動割付を行っています。割付の終了にはENDCを使います。
以下に今回使用しているデータエリアの意味(使用目的)を示します。
ラベル |
| 用 途 |
mode | : | モータ制御の状態を管理するエリアです。0=停止、1=右回転制御中、2=左回転制御中 |
count1 | : | 制御待ち時間を作るため、1ミリ秒を5回カウントして5ミリ秒にするためのカウンター |
count2 | : | 1ミリ秒をカウントするためのカウンター |
プログラム開始
;**************** Program Start ***********************
電源投入/リセット時はプログラムメモリアドレスは h'0000' からスタートします。また、割り込み処理のスタート番地は h'0004' です。今回の処理では割り込み処理は使用していないので、h'0004'にプログラムがジャンプしてくることはありません。もし、ジャンプしたときには割り込み禁止状態にします。あまり意味はないです。
初期化処理
;**************** Initial Process *********************
電源投入後の初期化処理として以下の処理を行います。
ポートAのモードを設定 |
| 全ポートを出力モードに設定します。 |
|
ポートBのモードを設定 |
| RB0,1,2および5を入力モード、RB7を出力モードに設定します。 |
|
ポートBのプルアップ機能を無効(RPBU=1)に設定 |
| 今回の回路ではRB5をハイインピーダンス入力として使用するため、RBのプルアップ機能は使いません。 |
|
停止モードの条件設定 |
| 電源が入った直後はモータを停止モードに設定します。このステップが無くてもmodeの初期値は0になるのでなくてもかまいません。ソフトを作る場合、思いこみは怪我のもとなので確実を期する意味で入れています。 |
|
制御待ち時間用カウンタを初期化 |
| この処理も無くても問題無い処理です。 |
|
ポートAの状態を初期化 |
| ポートAの初期状態として0101を設定します。トランジスタでドライブするので論理は反転し、左のビットから=H =L =H =Lという状態です。 |
|
速度制御用コンデンサを放電 |
|
RB7をHレベルにしてTR1をONにし、速度制御用のコンデンサに溜まっている電荷を放電させます。
放電が完了をRB5で確認しています。 |
スイッチ状態確認処理
;************* Check switch condition *****************
停止スイッチ、右回転スイッチ、左回転スイッチのON状態を検出します。スイッチのONを検出するとONになったスイッチの種類に応じてmodeに状態を設定します。検出する順番は停止、右回転、左回転の順で、複数のスイッチが同時に押された場合、先にONを検出したスイッチが有効になります。
この処理はモータを1ステップ制御する都度行われます。
モータ駆動処理
;******************** Motor drive *********************
最初に停止モードかどうかをチェックします。停止モードの場合にはモータ駆動は行わず、スイッチ状態確認処理にジャンプします。
停止モードでない場合、以下の処理を行います。
速度制御用コンデンサの放電処理 |
| 速度制御のタイミングを作るための準備としてコンデンサを放電します。 |
|
5ミリ秒待ち処理 |
|
ステップモータは高速で制御すると磁極の変化にロータが追いつかず、正常な回転ができなくなります。
速度制御用の可変抵抗器を最高速度側にしても正常に回転するようにこのタイマー値を設定します。
今回使用したモータの場合、5ミリ秒以下にすると正常に動作しませんでした。 |
|
速度制御用コンデンサの充電および監視処理 |
| RB7をLにしてコンデンサの充電を開始します。充電の完了はRB5で監視します。RB5がHレベルになれば完了です。正確には充電完了ではなく、コンデンサの電圧がRB5のスレッショルド電圧以上になったということです。 |
|
モータ駆動処理 |
|
速度制御タイミングのあと、いよいよモータの駆動です。まず、その時点のモータの制御状態を確認します。これはポートAの状態を読み出せば分かります。次に、右回転モードか左回転モードかを判断し、モータを駆動すべき次の制御状態をポートAに設定します。状態は4つあるので、それぞれの状態で処理を行います。
モータ駆動処理が終わった後は再びスイッチ状態確認処理にジャンプします。 |
|