はじめに
このページでは、ビギナー向けに、マイコンボードPIColoの開発方法を説明します。開発環境の用意や無償のCコンパイラのインストールについてはこちら、プロジェクト/プログラム作成についてはこちらを参照願います。
※以下の情報は2010年7月現在のものです。ご注意ください。
PIColoについてはこちらを参照願います。
パーツリスト
パーツ |
型名 |
個数 |
購入先 |
モータ |
マブチモータ(RE-140など) |
1 |
模型店など |
トランジスタ |
2SC1815 |
1 |
電子部品店 |
抵抗1 |
100Ω 1/4〜1/10Wのもの |
1 |
電子部品店 |
抵抗2 |
10KΩ 1/4〜1/10Wのもの |
1 |
電子部品店 |
基板 |
小さめのユニバーサル基板 |
1 |
電子部品店 |
コネクタ |
2mmピッチピンヘッダ |
1 |
浅草ギ研及び販売店 |
ケーブル |
センサーケーブル |
1 |
浅草ギ研及び販売店 |
今回は、DCモータ駆動で行ったときの回路と同じものを使います。DCモータ駆動の実験を行っている場合は新たに用意する必要はありません。
PWMについて
前回駆動したDCモータや、LEDは「電流」を流すと回ったり光ったりします。これらをパワー制御しようとすると本来は電流量を調整してやるのが一番よいのですが、マイコンで電流量をコントロールするのは大変です。
そこでPWMという方法を使います。Pulse Width Modulation と言い、パルス状にした入力でパワーをコントロールするという方法です。これは、スイッチを高速にON/OFFし、ONの時間が短ければパワーが小さくなり、ON時間が長ければパワーが大きく(最大パワーに近づく)ことになります。
プログラムでデジタルIO出力の端子をON/OFFすることもできますが、マイコンによっては数値設定だけで自動的にパルスが出続ける機能をもったものもあります。PIC16F1936も、コンペア・キャプチャという機能のピンの設定を変えるとPWMを出力する端子になります。CCP?という端子がそれです。
このようにCCP1〜5まであります。CCP2とCCP3は2つづつありますが、これはプログラムでどちらの端子から出すかを選ぶことができます。
前回のモータ駆動ではRC2にモータ制御端子をつなぎました。この端子はCCP1も兼ねているので、今回はCCP1を使って実験してみます。
PWM機能
PIC16F1936のPWM機能についてはデータシートの19章に書いてあります。いままで紹介した機能よりも複雑なので、データシートを少し読んだだけでは理解が難しいと思います。
大きく動作を説明すると、Timer2,4,6のうちの1つを使って「パルス周期」を作りだします。コンペア機能を使って「パルス幅」を作り出します。今回、今まで使っていなかったTimer6を使うこととします。
PWM機能の設定方法については19.5節に書いてあります。この中で設定式が次のようにかいてあります。
【PWM周期の設定】
まず周期の方から。上の式はぱっとみるとわけがわからないですが、内容的には非常に単純です。まず、TOSCですが、これはマイコンのクロック周期の時間です。クロックを32MHzに設定したとすると
TOSC=1/32MHz=0.03125μS=31.25nS
になります。 ”(TMRx Prescale Value)” はその意味の通り、タイマーに設定したプリスケーラの倍率です。今回はTimer6を使いますのでT6CONレジスタでプリスケーラを設定しますが、たとえば1:64に設定したとするとこの値が64倍になります。
さらに周期の式では4倍になっているので
4 x 31.25nS x 64 =2000nS=2μS
が途中までの式となります。ここにTimer6の比較レジスタであるPR6に1足した値を掛けたものが周期となります。ちなみに、式に(PR2x)となっていますがこれは(PRx)の間違いだと思われます。
たとえば、周期をきりの良いところで1mSにしたいとします。1mS=1000uSです。
1mS = (PR6+1)x4x2
よってPR6は124に設定すればよいことになります。
【パルス幅の設定】
パルス幅はこのように単純にTimer6の設定によりつくられた時間(今回は2uS)に、レジスタの値を掛けただけで設定できます。レジスタが2つに分かれているので少し面倒ですが、このような構成になっています。
CCO1CONのビット5と4を無視(常に0)とすると、CCPR1Lの値1につき4に相当しますので、CCPR1Lを1上げると
2uS x 4 = 8uS 1mS周期から考えると0.8%に相当
となります。つまり、CCPR1Lの値1につき0.8%の出力になるとも言えます。100%時は値125に相当します。
【出力開始方法】
PWMの出し方の手順はデータシートの19.5.7節に書いてあります。これを読むと
1)該当する端子(今回はRC2)を入力に設定する。これで出力が切れるらしい。
2)その間、必要な設定を行う。
3)該当端子を出力に設定するとPWMが出続ける、
となっています。
実験の構成ですが、モータ駆動の時と同じものを使いました。詳しくはモータ駆動のページを参照願います。
プログラム
ということで作ったプログラムが次のようになります。行18はいままでと同じ。行24〜行32がPWMの設定の部分です。
念のため、テキストファイルも用意しました。てきとうなプロジェクトを作り、コピーしても良いでしょう。
PWM.txt (右クリックで対象を保存)
先の計算のように、CCPR1Lの値1につき0.8%の出力となります。行36〜41で、一秒おきに0.8x12=9.6%づつ出力を上げています。
この波形を観測したのが次の図です。
0%時(1周期目)
9.6%(2周期目)
48%(6周期目)
96%(10周期目) この次は最初にもどる。
実際にモータ(マブチのRE−14)をつないでみたところ、出力80%以上でないとモータの軸がまわりませんでした。但し、80%以上だとPWMのパルス幅におうじた回転数になりました。
モータ回路のR1の値を下げるともっとすくないパルス幅でもまわるかもしれません。
パルス周期とパルス幅の比率を「デューティー比」といます。パルス幅が大きくなることを「デューティー比が上がる」といいます。
さいごに
今回はモータを駆動しましたが、LEDも同じようにパワー制御できます。つまり明るさを変えられます。LEDの明るさがゆらいでいる「電子ろうそく」なるものもあるようですが、この方法で作れそうです。
次はスイッチによる外部割込みについて。たとえばモータ駆動中に緊急停止スイッチによる割り込みで緊急停止、ということが可能になります。
2010年7月23日
|