目次>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-130RE-140
電圧範囲(V)1.5〜3.01.5〜3.0
適正電圧(V)1.51.5
無負荷回転数(rpm)8,6007,700
適正負荷回転数(rpm)6,4005,400
適正負荷電流(mA)500550

スイッチでモータの回転・停止制御
最初は、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に表示します。

ブレッドボードに仮組みした状態。
PWM方式によるスピード制御

DCモータの回転数は、流す電流の量によって変わります。
電流が大きくなるほど回転数も高くなる関係です。(モータが壊れない範囲で)

ですが、PICを使ったデジタル回路で電流を制御するのは厄介です。(不向きで再現性が低くなります。)

そこで登場するのがPWM(Pulse Width Modulation:パルス幅変調)方式です。

PWM方式とは、パルスの周期を一定にしてパルス幅を変える事で目的に合った制御を行うものです。
今回のDCモータの制御では、モータの電源をON/OFFし、ONの割合を変える事で回転数を制御します。

下の図はそのイメージを表しています。

高速回転
ON

OFF

中速回転
ON

OFF

低速回転
ON

OFF

停止
ON

OFF

【参考】
PWM方式を別の目的で使った例として、LEDの明るさを序所に変えるなどがあります。

プログラムの考え方

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の範囲に収めるように変換が必要です。
この方法は以下の手順としました。

  1. A/D変換結果が最大になるようにボリュームを回しておいて電源を入れる。
  2. 電源投入直後の初期処理でA/D変換を1回行い、0FFhとの差を計算し保存しておく。
  3. メイン処理の中では、A/D変換した結果に上の差を加算し、1/8して0〜31の範囲の値を得る。(実際には、2〜31程度の値が得られる。)

TMR0割込みの設定
409.6uSのTMR0割込み設定は以下の通りです。
クロック20MHz
1命令時間0.2mS
プリスケーラ
TMR00 (フリーラン)
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

aaA/D変換結果を16進数で表示
ppPWMのパルス幅を16進数で表示
mm電源ON後の初回のA/D変換結果を16進数で表示
dd0FFhと上記mmとの差を16進数で表示