目次>5章 第2ステップ(色々な実験)> (21)DCモータの制御(ON/OFF,スピード制御)
DCモータの制御
− ON/OFF,スピード制御 −
更新日2008.9.21
今回はPICでDCモータの制御を行います。
まずは、一定方向の回転・停止・スピード制御です。
今回使用したモータ
|
・ |
|
|
DCモータには目的に応じて多くの種類があります。
-
-
| | 写真は左から
・RF-270RHソーラーモーター01
・FA-130
・RE-140
・RCカー用モータ
|
今回は、この中のFA−130を使いました。RE−140などでも使えます。
- FA-130/RE-140の仕様
-
| FA-130 | RE-140
| 電圧範囲(V) | 1.5〜3.0 | 1.5〜3.0
| 適正電圧(V) | 1.5 | 1.5
| 無負荷回転数(rpm) | 8,600 | 7,700
| 適正負荷回転数(rpm) | 6,400 | 5,400
| 適正負荷電流(mA) | 500 | 550
|
|
スイッチでモータの回転・停止制御
|
・ |
|
|
最初は、PICでモータを制御する基本として、スイッチ操作でモータの回転・停止を制御して見ましょう。
PICでモータを直接制御する事はできませんので、回路図のようにFETを使います。
また、駆動電圧が異なりますので、PICの電源とモータの電源は別にします。
-
-
|
| モータは、FA−130を使用しましたが、5V・1A程度までのモータであれば制御可能です。
ただし、長時間回し続ける場合は、FETに放熱板を付ける方が安全です。
より大きなモータを使う場合はFETを容量に合ったものに変更して下さい。
(例えば、2SK2232であれば、10V・3A程度のモータを制御可能です。)
使っているポートは少しいびつですが理由はすぐに分かります。
|
- ブレッドボードに組んだ状態。
-
|
| FETは、2SK2231が手元に無かったので2SK2961で代替しました。余力は少ないですが実験で使うレベルでは(長時間回し続けなければ)問題無いでしょう。
|
- こちらは負荷に使ったプロペラ。
-
この回路で、RA2のスイッチが押されたらRB3のFETを介してモータを回転させる動作をさせます。
プログラムは以下の通り単純です。
-
LIST P=PIC16F84A
INCLUDE P16F84A.INC
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
ORG 0
; =========== 初期処理 ===================
BSF STATUS,RP0 ;■バンク1に切替え
MOVLW 0F7h
MOVWF TRISB ;RB3は出力
BCF STATUS,RP0 ;■バンク0に切替え
CLRF PORTB ;PORTBをクリア
; =========== メイン処理 =================
main
BTFSC PORTA,2 ;PBS ON ?
GOTO motor_off ; No
motor_on
BSF PORTB,3 ;motor ON
GOTO main
motor_off
BCF PORTB,3 ;motor OFF
GOTO main
END
|
モータの回転・停止は簡単ですね。
|
モータのスピード制御
|
|
PICでモータの回転・停止の確認ができたら次はスピード制御です。
回路は、前ページの簡易A/D変換で使ったものに、今回のスイッチとモータを追加しています。
左の積分回路と右の表示回路(SD1602)は、簡易A/D変換で使ったものそのままです。
また、モータとスイッチは上で行った実験回路と同じです。(スイッチは今回は使いません)
積分回路の可変抵抗の変化に合わせてモータの回転数を変えてみようというものです。
また、可変抵抗の状態やモータの状態をLCDに表示します。
-
- ブレッドボードに仮組みした状態。
-
DCモータの回転数は、流す電流の量によって変わります。
電流が大きくなるほど回転数も高くなる関係です。(モータが壊れない範囲で)
ですが、PICを使ったデジタル回路で電流を制御するのは厄介です。(不向きで再現性が低くなります。)
そこで登場するのがPWM(Pulse Width Modulation:パルス幅変調)方式です。
PWM方式とは、パルスの周期を一定にしてパルス幅を変える事で目的に合った制御を行うものです。
今回のDCモータの制御では、モータの電源をON/OFFし、ONの割合を変える事で回転数を制御します。
下の図はそのイメージを表しています。
-
高速回転 | ONOFF |
| 中速回転 | ONOFF |
| 低速回転 | ONOFF |
| 停止 | ONOFF |
|
|
プログラムの考え方
|
|
PWM方式の周期とパルス幅をプログラムで制御する考え方を下の図を使って説明します。
-
- 周期
-
周期は12.7mSとしました。
これを31分割してパルス幅を制御します。
1分割の時間(409.6uS)はTMR0割込みを使います。
- パルス幅
-
A/D変換した値を基にパルス幅を決定します。
積分回路のボリュームでA/D変換結果が変わりますので、ボリュームの回し加減でモータのスピードを変える事ができます。
パルス幅の最大は周期と同じでTMR0割込み31回です。
従って、パルス幅の範囲はTMR0割込み回数で0〜31の範囲となります。
これに対し、A/D変換結果はもっと大きな値になります。(例えば14〜250)
そのため、A/D変換結果を0〜31の範囲に収めるように変換が必要です。
この方法は以下の手順としました。
- A/D変換結果が最大になるようにボリュームを回しておいて電源を入れる。
- 電源投入直後の初期処理でA/D変換を1回行い、0FFhとの差を計算し保存しておく。
- メイン処理の中では、A/D変換した結果に上の差を加算し、1/8して0〜31の範囲の値を得る。(実際には、2〜31程度の値が得られる。)
- TMR0割込みの設定
-
409.6uSのTMR0割込み設定は以下の通りです。
クロック | 20MHz
| 1命令時間 | 0.2mS
| プリスケーラ | 8
| TMR0 | 0 (フリーラン)
| TMR0割込み周期 | 0.2mS×8×256 =409.6uS
|
|
プログラム
|
|
【2009.1.28追記】
A/D変換処理中(AD_proc3のループ中)は、TMR0割込みを禁止しておくのが良いと思います。
|
詳細説明は省略しますが、メイン処理,A/D変換処理,TMR0割込み処理で全体の制御を行っていますので、この3つの処理を見れば理解できると思います。
- こちらは実験風景。
-
- LCDの表示
A/D=aa PWM=pp
Max=mm dif=dd
|
aa | A/D変換結果を16進数で表示
| pp | PWMのパルス幅を16進数で表示
| mm | 電源ON後の初回のA/D変換結果を16進数で表示
| dd | 0FFhと上記mmとの差を16進数で表示
|
|