電子工作:モーター 元に戻る

ステッピングモータ制御の実験 2024/7/2

本文目次

本文以外目次
1.ステッピングモータ本体
2.励磁方式
3.制御回路
4.プログラム



本   文

1.ステッピングモータ本体
ステッピングモータは3Dプリンターに使用され、将来作ると思われる水車制御でガイドベーンサーボなどにも使用出来るので、どの様な制御をしているか2016年10月に実験してみた。

[目次に戻る]


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
回転方向(1bit) 励磁方法(2bit) 速度(Hz)(12bit) 持続数(パルス)(16bit)
0 正転 00 停止 000 停止 0000 連続
1 逆転 01 1-1 010 0001
  10 2-2
  11 1-2 999 9999

コンピュータ側    モータ MPU 側
A
1 で C 受け準備 OK 0で受け完
A=1 で 1bit clok B
 
A=1&B=1 の時データ送信 C
 
[目次に戻る]


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 ; プログラムの終了をアセンブラに指示する
; =========================== ここまで ========================
[目次に戻る]