今回は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 初期設定
今までと同じように以下のように設定します。
73 74 75 76 |
OSCCON = 0b01110000 ; // 内部クロック8MHz ANSELA = 0b00000000 ; // すべてデジタルI/Oに割当てる TRISA = 0b00001000 ; // RA3を入力とする PORTA = 0b00000000 ; // ピン状態初期化 |
3.2 PWM設定
78 79 80 81 82 83 84 85 86 87 |
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出力する
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
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日:フォーマット変更と章番号間違いを修正
参考になりました。
ありがとうございます。