今回はDCモータを制御します。DCモータの回転速度を制御する方法はPWMとします。簡単に説明すると、電源のオンとオフを高速で切り替え、モータに流す電流を制御します。オンの時間が長ければより最高速に近づき、オフの時間が長ければゆっくり回ります。PWMの良いところは常に電圧は最大値をかけているので、高トルクを得ることができるところです。
今回の回路では、とりあえず動かすことを目的としているため、簡単なつくりにしています。保護回路などはつけていませんので注意が必要です。
1.今回使用するPICについて
今回使用するPICは「PIC12F1822」です。
2.回路
2.1 電子回路図
2.2 電子回路の写真
2.3 モータドライバ
PICからの出力で直接モータを動かすことは出来ません。そこで使用するのがモータドライバです。PICからモータドライバに信号を送ると、モータドライバはその信号に合わせた、モータ用の出力をモータに対して行います。
使用するモータドライバは「BD6222F HRP7」です。出力電圧は6[V]~15[V]なので、モータはその範囲内のものを使用してください。
今回は諸事情により3[V]用のモータを使用しています。真似はしないでください。「BD6212」の2[A]バージョンを使用すれば問題ありません。
2.4 回路説明
2.4.1 PIC
- 電源:5[V]
- RA2:FIN(モータドライバ)
- RA5:RIN(モータドライバ)
2.4.2 モータドライバ
- 電源:7.2[V](ニッケル水素電池6本)
- FIN:RA2(PIC)
- RIN:RA5(PIC)
- OUT1:モータ
- OUT2:モータ
2.4.3 電源
PIC用の電源とモータ用の電源は分けています。
- PIC用はニッケル水素充電池を4本直列に接続し使用
- モータ用はニッケル水素充電池を6本直列に接続し使用
2.5 回路についての注意
動作させるときは、PICkit3を外すこと。
3.プログラム
DCモータを制御するプログラムについて説明します。
3.1 初期設定
今までと同じように以下のように設定します。
OSCCON = 0b01110000 ; // 内部クロック8MHz ANSELA = 0b00000000 ; // すべてデジタルI/Oに割当てる TRISA = 0b00001000 ; // RA3を入力とする PORTA = 0b00000000 ; // ピン状態初期化
3.2 PWM設定
CCP1SEL = 0; // RA2をPWM出力 CCP1CON = 0b00001100 ; // PWMシングルモード T2CON = 0b00000001 ; // TMR2プリスケーラ値を1/4に設定 CCPR1L = 0; CCPR1H = 0; TMR2 = 0; PR2 = 99; // PWMの周期を設定(20khz) STR1A = 0; // ステアリングレジスタ設定 TMR2ON = 1; // TMR2開始
RA2をPWM出力にします。(1をセットするとRA5を出力に設定します)
CCP1SEL = 0;
PWMモードに設定する。
bit6-7:P1M:00:シングル出力(Bit2-3が11なので)
bit0-3:CCP1M:1100:PWMモード
CCP1CON = 0b00001100;
TMR2プリスケーラ値を1/4に設定する。
bit0-1:T2CKPS:01:プリスケーラ値 4
T2CON = 0b00000001;
初期化する。
CCPR1L = 0;
CCPR1H = 0;
TMR2 = 0;
PWMの周期を20[kHz]に設定する。
PWMの周期 = (PR2 + 1) × 4 × 1 / 32000000 × 4
1/20000 = (PR2 + 1) × 4 × 1 / 32000000 × 4
PR2 = 1 / (4 × 1 / 32000000 × 4 × 20000) – 1
PR2 = 99
CCP1Mで指定した極性に従って、PWMの波形を出力する
STR1A = 0;
3.3 PWM出力する
void set_dc_motor( signed char duty ) { if( duty > 100 ) duty = 100; if( duty < -100 ) duty = -100; // 出力pin設定 if( duty > 0 ) { STR1A = 1; // ステアリングレジスタ設定(ON) CCP1SEL = 0; // RA2をPWM出力 } else if( duty < 0 ) { STR1A = 1; // ステアリングレジスタ設定(ON) CCP1SEL = 1; // RA5をPWM出力 } else { STR1A = 0; // ステアリングレジスタ設定(OFF) } if( duty < 0 ) duty *= -1; // デューティ比をCCP1へ設定 // PR2が100の為、デューティー比をそのまま設定 CCPR1L = duty; }
モータドライバにつながっている、RA2とRA5にPWM出力を行い速度制御を行います。正転と逆転は回路の作り方により変わってしまうので、配線後確認してください。
今回のプログラムでは、RA2を正転(デューティ比:プラス)、RA5を逆転(デューティ比:マイナス)としています。
3.3.1 RA2にPWM出力
RA2にPWM出力を行う場合、以下の設定をします。
STR1A = 1;
CCP1SEL = 0;
ステアリングレジスタ設定をオンにし、PWMの波形を生成します。RA2に出力するため、CCP1SELに0を設定。最後に、デューティ比を設定します。とりあえず早すぎない程度の15%にします。
CCPR1L = 15;
以上でRA2にPWM出力を行えます。
3.3.2 RA5にPWM出力
基本的にRA2に出力するのと同じです。違いは以下のCCP1SELに1を設定するところです。
CCP1SEL = 1;
3.3.3 停止
PWM出力を停止させるには、STR1Aとデューティ比を0に設定します。
STR1A = 0;
CCPR1L = 0;
3.4 補足
今回、モータドライバの出力が6[V]なのに、DCモータが3[V]用です。デューティ比を低めに設定することで、出力を3[V]程度にしています(テスターで計測)。ただ、あくまで出力の平均が3[V]で、最大では6[V]が流れています。10分程度連続運転しても発熱などなく使用できましたが、本来このような使い方は間違っているので壊れてしまったり、事故が発生する可能性があります。正しいパーツを選択して使用してください。
3.5 ソースコード
プログラムの全文を掲載します。
<注意>
本サイトの注意事項を確認してください。
ソースコードや回路図などを使用する場合、上記注意とともに、自己責任でお願いします。
4.動作確認
PICとPICkit3を外します。壊れる可能性があるので、必ず取り外してください。電源を入れて下さい。するとDCモータが回転を始めます。少し経つと回転速度が速くなりその後停止します。停止後、逆回転します。
以下の動画が実際の動きです。プローブが1つしかないため、反転時のオシロスコープは変化しません。
<更新履歴>
新規作成:2015年5月10日
第2版:2016年10月3日:フォーマット変更と章番号間違いを修正
参考になりました。
ありがとうございます。