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