電子工作:モーター | 元に戻る |
ステッピングモータ制御の実験 2024/7/2 |
|
| |||||||
1.ステッピングモータ本体 2.励磁方式 3.制御回路 4.プログラム |
|
本 文 |
1.ステッピングモータ本体
[目次に戻る] |
2.励磁方式 (1)1-1相励磁 相励磁は最も単純なパターンで分かり易いのですが、トルクが小さくてあまり安定性がなく、実用ではほとんど利用されていません。
(2)2-2相励磁 1-1相励磁に比べて回転が安定し、高いトルクが得られますので良く利用されますが、消費電 力は2倍必要です。
(3)1-2相励磁 1パルス幅ごとに回転する角度が1-1相励磁と2-2相励磁に比べて半分になるという特徴(ハーフステップ動作)があります。 制御(パルス)周波数と諸特性 [目次に戻る] |
3.制御回路 回路概要 制御線 ・ ステッピングモータの制御4線 ・ ステッピングモータの制御用信号線 ? 回転方向の制御(正転、逆転パルス または ※数値) ? 励磁方法の変更(ロータリーパルス または ※数値) ? 速度の可変(上げ、下げ 連続パルス または ※数値) ? パルス数の制御(回転方向制御で連続パルス または ※数値) キー操作について ①~④までのキーにより操作する。 ■単操作 回転方向 ①正転 ②逆転 励磁方法 ④ 1-1 → 2-2 → 1-2 → 1-1 ■複操作 速度の可変 回転方向を押しながら ③上昇 ④低下 ※シリアル制御信号で、受け取った信号により、受取信号と完了信号を返す データ送信 全 32bit
|
4.プログラム ■制御に使用するPIC16F84の内容 ■PIC のレジスター ●RA ポート MOSFET の制御 CMOS 出力ドライバー ●RB 弱 Pul-upMOS 付 B4~B7 変化による割り込み有り 1000Hz のパルス=0.5(ms) 20MHz=0.2(μs) 10,000 倍 プリスケラー=1:256 0.2 × 256 = 51.2(μs) カウンター=39 =9984 0.4992(ms)誤差=-0.16(%) Addressオフセット 1-1 2-2 1-2 ■初期設定 TRISA=00h RA=出力ポート TRISB=FFh RB=入力ポート OPTION=07h プリスケラー1:256= 07h、ポート B プルアップ 0 INTCON=A0h TMR0 割込み許可 20h+割込みイネーブル 80h PIC16F84の割込みには、以下の種類があります。 ・TMR0(TIMER0)割込み● ・RB0/INT割込み ● ・RB4~7ピン変化割込み ● ・EEPROMライト完了割込み ●は今回使用予定の割込み ソフト 割込み処理 TMR0 を使用した割り込みを実施し、一定時間サイクルで制御するプログラムを作成する。 実験では、 LED の ON-OFF でモータへ2個のパルスが出るようになっている(割込みで LED が状態変化する) LED の ON-OFF 時間を測定し、モータの動作限界を見てみた。 結果 LED ON-OFF 時間 2.65(ms)では不動作、3.15(ms)では動作したので、3.15(ms)を動作限界とする。 時間測定に使用した物は、デジタルスコープ で、目勘定(X1,X2 カーソルによる測定)です ので、大分誤差は有ると思います。 この時の PIC の設定は、プリスケラが 1:256 で TMR0 は e1h=30 Tmr1=1 であった。 PIC の設定から見た 割込み時間の確認 今回の PIC は 20MHz で動作しており、1クロックは 1/20MHz=0.05μs となる。 ただし、発信子はセラミックで %の誤差が有る事承知して頂きたい。 また、命令動作時間は 4 ステート必要なため、0.05×4= 0.2μs である。 このため下記の時間の和となる。 ・ 割込み用カウンタセット時間 2 クロック ・ TMR0 からの割込み信号遅れ 1 ステート ・ 割込み処理プログラム数 16ステート 以上が固定の遅れ時間=17.5 ステート これにプリスケラと TMR0の設定した値が加わる。 ・ 割込み時間プリスケラと TMR0 のカウント 256×30=7,680 ステート これに ON-OFF の2回で測定しているので (17.5+7680)×2×0.2=3079μs=3.08(ms)となり測定と設定は大体合っている事になります。 1パルスは 1.54(ms)となる。 想定できる最大速度 ピニオンの外周は約 3cm で 200 パルス 1 周するステッピングモータなので、 1秒間にどれだけ移動できるか 1×3 /(1.54(ms)×200) = 9.74(cm) TC=4 秒とすれば 390(mm)でガイドベーンサーボに大体代用できると思われる。 ■実験1 ステッピングモータを回転させる; PORT-A 04 の LED を割込み処理を使用して点滅させる ;********************************************************************** LIST P=PIC16F84A ; LIST 宣言で、使用する PIC を PIC16F84A と定義する INCLUDE P16F84A.INC ; 設定ファイル p16f84a.inc を読み込む __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF ;********************************************************************** StackW EQU 0Ch ; W レジスターの退避領域 StackS EQU 0Dh ; ステータスレジスターの退避領域 Flag EQU 0Eh ;各フラグ ; 01h=TMR1 カウント 0 フラグ 1=カウント 0 ; 10h=モードボタンの状態 1=on ; 20h=LED の状態 Tmr0Set EQU 0Fh ; TMR0 の設定値 Tmr1Set EQU 10h ; Tmr1 の設定値 Tmr1 EQU 11h ; TMR0 割込み×設定値で割込みさせるカウンター MotorMode EQU 12h ; モータの励磁モード 0=1-1 1=2-2 2=1-2 Count EQU 13h ; パルス位置(カウント)1-1,2-2=0~3 1-2=0~7 Rotation EQU 14h ; 回転方向 0=停止 1=正転 2=逆転 ORG 00h ;RESET で0番地から始まる GOTO INIT ;0 番地は GOTO で MAIN 処理へジャンプ ;############################### ; ; TMR0 割込み処理 ; ;############################### ORG 4 ; 割込みベクタ(4 番地)を指定する。 BCF INTCON,T0IF ; 割込みフラグクリア MOVWF StackW ; W レジスター退避 SWAPF STATUS,W MOVWF StackS ; STATUS レジスタ退避 ; 割込みカウンター TMR0 の設定 MOVF Tmr0Set,w MOVWF TMR0 ; TMRC DECFSZ Tmr1,F GOTO T0EXIT BSF Flag,0 ; Tmr1 割込みフラグセット ; 割込みカウンターの設定 MOVF Tmr1Set,w MOVWF Tmr1 ; T0EXIT SWAPF StackS,W MOVWF STATUS ; STATUS レジスター戻し SWAPF StackW,F SWAPF StackW,W ; W レジスター戻し RETFIE ; 割込み許可にしてリターン ; ここまで TMR0 割込み処理 ;############################# ; ; 初期化 ; ; ■ は試験時操作する場所 ;############################ INIT BSF STATUS,RP0 ;STATUS レジスタの RP0 ビットを1にして Bank1 に切替える CLRF TRISA ;PORTA をすべて出力モードに設定する MOVLW 0FFH ;1111 1111 をセット MOVWF TRISB ;PORTB は全ポートを入力に設定 ;■プリスケラー設定 MOVLW 007H ;試験のため 通常 0111=007h をセット MOVWF OPTION_REG ;プルアップ ON+プリスケラ 1:256 BCF STATUS,RP0 ;Bank0 に戻る ; PORTA をクリア CLRF PORTA ;フラグの初期化 CLRF Flag ;モータの回転方 0=停止 1=正転 2=逆転 MOVLW 000H MOVWF Rotation ; モータの励磁モード 0=1-1 1=2-2 2=1-2 MOVLW 001H MOVWF MotorMode ; パルス位置(カウント) 0~3,0~7 MOVLW 000H MOVWF Count ; ■ TMR0 の設定 MOVLW 0e1H ;試験のため MOVWF Tmr0Set MOVWF TMR0 ; ■ 割込みカウンタの設定 MOVLW 1 ;試験のため 1 MOVWF Tmr1Set MOVWF Tmr1 ;割込みイネーブル+TMR0 割込み許可 MOVLW 0A0H ;1010 0000 をセット MOVWF INTCON ;############################# ; ; メイン処理 ; ;############################# MAIN BTFSS Flag,5 ;LED の状態が 0 なら GOTO LED_ON BCF Flag,5 BCF PORTA,4 GOTO MAIN1 LED_ON BSF Flag,5 BSF PORTA,4 MAIN1 BTFSS Flag,0 ; TMR1 割込みになったか GOTO MAIN1 ; NO BCF Flag,0 ; TMR1 割込みフラグクリア ;############################ ; キーの確認 ;############################ BTFSS PORTB,7 ;正転を押していたら Key_s へ =0 なら GOTO Key_S BCF Rotation,0 ;正転押してないら bit0=0 BTFSS PORTB,6 ;逆転を押していたら Key_G へ GOTO Key_G BCF Rotation,1 ;逆転押してないら bit1=0 CLRF PORTA ;停止なら 0 出力 ; CLRF Rotation ;正転、逆転どちらでも無い時は Rotation=0 BTFSS PORTB,4 ;励磁方法を押していたら Key_M へ GOTO Key_M BTFSC Flag,4 ; 励磁モードボタン前回状態が BCF Flag,4 ; 1=ON ならクリアー GOTO MAIN ;############################ ; キーの処理 ;############################ Key_S ;正転キー処理 BSF Rotation,0 ;正転押したら bit0=1 BTFSS PORTB,5 ;正転+up(0)=速度上昇へ GOTO Sup BTFSS PORTB,4 ;正転+du(0)=速度低下へ GOTO Sdu GOTO MMode Key_G ;逆転キー処理 BSF Rotation,1 ;逆転押したら bit1=1 BTFSS PORTB,5 ;正転+up(0)=速度上昇へ GOTO Sup BTFSS PORTB,4 ;正転+du(0)=速度低下へ GOTO Sdu GOTO MMode Key_M ;励磁モードキー処理 BTFSC Flag,4 ;モードボタン状態 GOTO MAIN ; =1 なら変更処理しない bsf Flag,4 ;モードボタン状態を=1 にする INCF MotorMode,1 ;加算する CLRF Count ;モード変化によりカウントもリセット ;MotorMode が 3 なら 0 にする BTFSS MotorMode,0 GOTO MAIN BTFSS MotorMode,1 GOTO MAIN ;ゼロでないなら 0 にせず戻る CLRF MotorMode GOTO MAIN ; モータースピードアップ処理 Sup GOTO MMode ; モータスピードダウン処理 Sdu GOTO MMode ;#################################### ; 各励磁方式でステッピングモータへ信号を出す ; 励磁方式により処理先へジャンプ ;#################################### MMode BTFSC MotorMode,1 ;モード 2 GOTO ROTA1 ;=============================== ; 励磁方式1-1,2-2の正転、逆転処理 ;=============================== ROTA BTFSC Rotation,0 ; 正転なら goto ROTA_P ; Count を加算処理へ movf Count,1 ; Count が BZ ROTA_CU ; 0 ならカウント値最大処理へ DECF Count,1 ; 0 以外なら-1 する GOTO Mode01 ROTA_CU movlw 3 movwf Count ; 最大値を入力 GOTO Mode01 ROTA_P INCF Count,1 BTFSC Count,2 ;Count=4 なら次の処理以外なら次をスキップ CLRF Count ;カウンターをリセット ; モード 0,2 の判定 Mode01 BTFSS MotorMode,0 ;モード 0 GOTO M11 ;------------------------------ ; ■励磁方式 2-2の制御処理 ;------------------------------ M22 movf Count,w ; w=タスク N0.セット ANDLW B'00000011' ;誤動作防止フィルター 0 から~3 だけ取る ;** ジャンプテーブル addwf PCL,f goto M22_0 ; w=0 の時のジャンプ先 goto M22_1 ; w=1 の時のジャンプ先 goto M22_2 ; w=2 の時のジャンプ先 goto M22_3 ; w=3 の時のジャンプ先 M22_0 movlw H'09' ; 出力データセット movwf PORTA ; PORTA へ出力 GOTO MAIN M22_1 movlw H'03' ; 出力データセット movwf PORTA ; PORTA へ出力 GOTO MAIN M22_2 movlw H'06' ; 出力データセット movwf PORTA ; PORTA へ出力 GOTO MAIN M22_3 movlw H'0C' ; 出力データセット movwf PORTA ; PORTA へ出力 GOTO MAIN ;------------------------------ ; ■励磁方式 1-1 の制御処理 ;------------------------------ M11 ;励磁方式 1-1 パターン movf Count,w ; w=タスク N0.セット ANDLW B'00000011' ;誤動作防止フィルター 0 から~3 だけ取る ;** ジャンプテーブル addwf PCL,f goto M11_0 ; w=0 の時のジャンプ先 goto M11_1 ; w=1 の時のジャンプ先 goto M11_2 ; w=2 の時のジャンプ先 goto M11_3 ; w=3 の時のジャンプ先 M11_0 movlw H'01' ; 出力データセット movwf PORTA ; PORTA へ出力 GOTO MAIN M11_1 movlw H'02' ; 出力データセット movwf PORTA ; PORTA へ出力 GOTO MAIN M11_2 movlw H'04' ; 出力データセット movwf PORTA ; PORTA へ出力 GOTO MAIN M11_3 movlw H'08' ; 出力データセット movwf PORTA ; PORTA へ出力 GOTO MAIN ; ;============================== ; 励磁方式1-2の正転、逆転処理 ;============================== ROTA1 BTFSC Rotation,0 ; 正転なら goto ROTA1_P ; Count を加算処理へ movf Count,1 ; Count が BZ ROTA1_CU ; 0 ならカウント値最大処理へ DECF Count,1 ; 0 以外なら-1 する goto M12 ROTA1_CU movlw 7 movwf Count ; 最大値を入力 goto M12 ROTA1_P INCF Count,1 BTFSC Count,3 ;Count=8 なら次の処理、以外なら次をスキップ CLRF Count ;カウンターをリセット ;------------------------------ ; ■励磁方式 1-2 の制御処理 ;------------------------------ M12 movf Count,w ; w=タスク N0.セット ANDLW B'00000111' ;誤動作防止フィルター 0 から~3 だけ取る ;** ジャンプテーブル addwf PCL,f GOTO M12_0 ; w=0 の時のジャンプ先 GOTO M12_1 ; w=1 の時のジャンプ先 GOTO M12_2 ; w=2 の時のジャンプ先 GOTO M12_3 ; w=3 の時のジャンプ先 GOTO M12_4 ; w=4 の時のジャンプ先 GOTO M12_5 ; w=5 の時のジャンプ先 GOTO M12_6 ; w=6 の時のジャンプ先 GOTO M12_7 ; w=7 の時のジャンプ先 M12_0 movlw H'09' ; 出力データセット movwf PORTA ; PORTA へ出力 GOTO MAIN M12_1 movlw H'01' ; 出力データセット movwf PORTA ; PORTA へ出力 GOTO MAIN M12_2 movlw H'03' ; 出力データセット movwf PORTA ; PORTA へ出力 GOTO MAIN M12_3 movlw H'02' ; 出力データセット movwf PORTA ; PORTA へ出力 GOTO MAIN M12_4 movlw H'06' ; 出力データセット movwf PORTA ; PORTA へ出力 GOTO MAIN M12_5 movlw H'04' ; 出力データセット movwf PORTA ; PORTA へ出力 GOTO MAIN M12_6 movlw H'0C' ; 出力データセット movwf PORTA ; PORTA へ出力 GOTO MAIN M12_7 movlw H'08' ; 出力データセット movwf PORTA ; PORTA へ出力 GOTO MAIN END ; プログラムの終了をアセンブラに指示する ; =========================== ここまで ======================== [目次に戻る] |