TOP>MPLAB XC8編(PIC16F887)> ステッピングモータの制御(PIC16F887 XC8)
ステッピングモータの制御
(PIC16F887 XC8)
ここでは、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)
木枠の右側に固定してあるものがステッピングモータで、左右に動いているものはステッピングモータからワイヤ接続して制御しています。
|
|