TOPMPLAB XC8編(PIC16F887)> ステッピングモータの制御(PIC16F887 XC8)

ステッピングモータの制御
(PIC16F887 XC8)
更新日2012.5.20
作成日2009.5.6


ここでは、MPLAB XC8でステッピングモータを制御して見ます。
使用するPICは、40ピンのPIC16F887です。

実験回路
今回の実験回路です。
クロックは内部クロックで8MHzです。


これだけであれば、40ピンのPICを使う必要はありませんが、別目的の回路を作成する途中段階のためこのようになりました。

ブレッドボードに組んだ状態
左上の6ピンヘッダ周りは、回路図には有りませんがICSP(In-Circuit Serial Programming)用です。PICライタを使う場合は不要です。

今回使用したステッピングモータ
SPG20-332 ギアードステッピングモータ
駆動方式2相ユニポーラ
ギア比1/24
ステップ数480
ステップ角0.75°
コイル抵抗68Ω

プログラムの仕様

RB1のスイッチを押すと左回転を開始し、RB2のスイッチを押すと右回転に切り替えます。
そして、この範囲で自動往復動作を繰り返します。
往復動作の右端をRB1のスイッチで、左端をRB2のスイッチで設定している事になります。

RB1,RB2のスイッチ操作は、ピン変化割込みを使って検出します。
ステッピングモータの1パルスの時間はTMR0割込みにより作ります。

LCDには、ステッピングモータの回転位置を表示します。右端を0とし、左に回転したステップ数を表示します。

ステッピングモータの制御

ステッピングモータの使い方については、「ステッピングモータを回す」を参照して下さい。

今回のプログラムでは、ステッピングモータを2相励磁方式で制御します。
ステッピングモータの4つの信号(X,Y,X,Y)は下図のように与えます。
信号を右から逆順に与えると逆回転になります。


→時間

1ステップの時間を長くすると回転は遅くなり、時間を短くすると速くなります。

今回のプログラムでは、以下の2パターンの時間にしています。
期間時間
RB1のスイッチを押してからRB2のスイッチを押すまで(両端検出期間)24mS
RB2のスイッチを押した後(自動運転期間)6mS

プログラム

今回のプログラムはこちらです。

LCDの使い方については、「液晶ディスプレイを使う」を参照して下さい。
LCDは4ビット動作とし、ビジーフラグは使わないで時間待ちにより動作完了を待ちます。

プログラムの各ブロック(関数)で行っている処理は以下通りです。

main()
PICの初期化(pic_init),LCDの初期化(LCD_init),ステッピングモータの設定値初期化(motor_init)を行った後、スイッチの状態により処理を振り分けます。
同時に、RA0のLEDを0.5秒間隔で点滅させます。
pic_init()
PICの初期化処理を行います。
 1.クロックを内部8MHzに設定
 2.使わないA/D変換を無効化
 3.RA0,RD2-7を出力に設定
 4.TMR0割込みの設定
 5.PORTBピン変化割込みの設定
LCD_init()
LCDの初期化を行います。
motor_init()
ステッピングモータの制御情報を初期化します。
intr() 割込み処理
TMR0割込みとPORTBピン変化割込みの処理を行います。

TMR0割込みでは、以下の2つの処理を行います。
 ・LEDを点滅させる500mSの時間を作る
 ・ステッピングモータの1ステップの時間経過を判定し、次のパターンを設定

PORTBピン変化割込みでは、RB1/RB2いずれかのピン変化に応じたフラグを設定します。
main処理では、このフラグでスイッチの状態を判定します。

itox_LCD(struct i_x *ix_wk)
int型の16ビットのデータを16進数4桁でLCDに表示します。
RB1_on()
RB1のスイッチがONになった時の処理で、ステッピングモータの位置(motor1_pos)をクリアし、右回転のパラメータを設定します。
RB2_on()
RB2のスイッチがONになった時の処理で、ステッピングモータの右端の位置(motor1_posmax)を設定し、左回転のパラメータを設定します。
また、LCDに右端の位置を表示します。
motor1_auto()
ステッピングモータを2つのスイッチで設定した範囲で自動動作させます。
LCD_cmd(unsigned char)
LCDにコマンドを送ります。
コマンドは、引数で与えます。
LCD_data(unsigned char)
LCDに1バイトのデータを送ります。
データは、引数で与えます。
LCD_send4(unsigned char)
LCDに4ビットを送ります。
送るデータは引数で与え、上位4ビットを送信します。
LCDの初期化(LCD_init)処理で使います。
wait_50us()
50μS(マイクロ秒)待ちます。
LCD出力時の待ち時間として使います。
wait_ms(unsigned char)
1mS(ミリ秒)×指定値だけ待ちます。
指定値は引数で与え、指定値の数だけwait_1msを呼び出します。

例えば、20mS待つ場合は、
wait_ms(20);
と言うように使います。
wait_1ms()
1mS(ミリ秒)待ちます。
wait_msで使用します。
逆アセンブルリストを参考にして、NOPの数とループ回数を決めています。

動作確認

動作させた状態です。
液晶ディスプレイの1行目には左端の位置を表示し、2行目には現在位置を表示します。
ブレッドボードからの信号線の先がステッピングモータです。直径4cmのプーリーを付けています。

 

こちらに上の写真の位置から撮ったムービーがあります。右クリックでダウンロードしてご覧下さい。(約9MB)
木枠の右側に固定してあるものがステッピングモータで、左右に動いているものはステッピングモータからワイヤ接続して制御しています。