DCモータを動かす(PWM)

このエントリーをはてなブックマークに追加

 

 今回は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日:フォーマット変更と章番号間違いを修正

 

DCモータを動かす(PWM)」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)