PWM制御(タイマーV)
考え方など基本は同じですので、まず Tekurobo工作室
106.PWMでモーター制御 を見てください
PWM制御は ON,OFFすることでモーターの速度を変える制御です。
PWM制御の方法はスイッチをパチパチと押して遊ぶような断続的ON、OFFの方法ですが、すでに確立された制御方法です、D/A変換の部類にはいるでしょう
ここでは 今度は 3664FのタイマーV を使用してPWM制御をやってみます。
モーターの回転をタイマーVを使用したプログラムで、速度を次々と変化させてみて、PWM制御がどのようなものか実験してみました。
PWMを使って、特有の”プーン”という音と共にモーターの回転速度が変えられるのが目でわかります。
遅すぎるとモーターが力不足で回らなかったり、デューティ比の設定でいろいろ体感できます。
タイマーの設定、右上がりの線とコンペアマッチなどは直感的でなくて、最初はなかなかわかりずらかったのですが、一度理解すればタイマーがわかるようにな ります。タイマーAはさらっとやりましたが、タイマーVはもう少し設定できるので応用していろいろな設定をしてみてください。
タイマーV
タイマーVはタイマーWより機能が少ないタイマーですが、外部入力が可能で、外部イベントのカウント、任意のデューティ比の出力などに使えます。
●特徴
タイマーAは設定時間にお知らせがくるようなタイマーでしたが、タイマーVはもう少し幅が広い設定ができます。
8ビットのタイマ
- カウンタのクリア指定が可能
- コンペアマッチが2つとれ、出力信号を制御できる。
(パルス出力、PWM出力など) - 割り込み可能
- トリガを入力でき、外部からタイマーの操作が可能。
設定
タイマーの設定方法は たとえると
- 秒針が 右肩上がりの線TCNTV で、これがチクタクと時を刻みます。
- 目覚ましの針がTCORA、TCORB と2つの目覚ましを設定できます。
目覚ましの時間が来たら、設定した行動を起こすようなものですが、図では秒針が右上がりになってたりして初めてだと直感では少しわかりにくいですが、よく考えれば慣れてきます。
覚えるべき言葉は コンペアマッチ
これは設定した目覚ましの針(TCORA、TCORB)とチクタクと時を刻む秒針TCNTVとが一致したときのコト
時計やストップウオッチならここでベルが鳴るんですが、このコンペアマッチのときどうするか選べます。
コンペアマッチのときどうするかは
タイマー(秒針)を0に戻したり、ピンから電圧を出力したり止めたり、割り込み関数を呼び出したりと設定できます。。タイマーVではこの目覚ましの針を2つ仕込めます。
コツコツと時を刻む秒針TCNTVがだれにも止められることなく、忘れられたように進みすぎていっぱいになってしまうとオーバーフローとなります。
このオーバーフローのときどうするかも設定することができます。
ここではコンペアマッチでデューティ比を作り出し、ピンからその電圧を出力させます。
どのピンから出力されるかというと TMOV から出ます。
実際の設定
図のようなパルスをタイマVで作ります
それには まず ピンの出力は
TCORAのコンペアマッチで1を出力に設定。(次に0にされるまで1が出力される)
TCORBのコンペアマッチで0を出力に設定 と共に、
TCNTVを0にリセットするに設定。
これで
TCORBのコンペアマッチで秒針TCNTVが0にリセットされ、また最初からカウントされ始めコンペアマッチでの動作を繰り返す。これで延々と図のようなパルスが出力されることになる。
● 周期
周期はTCORBまでの間なので、TCORBの設定値で決まります。
● デューティ比
TCORAの数値を変えることだけで デューティ比 を変えられます。
ONにされている時間は -D- の間なので、
デューティ比は
(-D-時間) / (1周期) になります。
このデューティ比を変えることによってモーターの速度を制御します。
早くしてみた -D- の幅が長くなります
TCORAを小さくして、コンペアマッチを早く設定すると ONになる時間が長くなります。
ONにされている時間 -D- が長いほどモーターには電力が加わるので早く回ることになります。周期と同じ長さにすると、ずっと通電していることになります。そこでOFFの時間を作ってで間引くわけです。その比がデューティ比 ということになります。
ここでは周期は変えません。適正な周期はモーターによって違ってきます。
周期がPWMにどのように影響するか、この辺は
Tekurobo工作室 最適なPWMの周期を探る などにも考察がされているので詳しく見てください。
実験回路図
FETを使用したドライブ回路
フライホイールダイオードを入れてあります。 (保護用)入れときましょう。
3664Fの CH2 ピン7(TMOV)からパルスが出力されます
* モーターにはことのほか大きい数百mAの電流がながれることを念頭に。
モーターには 定常回転のときに数百mA流れるなどの仕様がありますが、コイルですから、ON,OFFにはそれをだいぶん超えた電流が流れること考え十分留意してください。
モーター電源は必ず別電源を使用のこと。H8ボードのピンからも5Vが取れますが使わないように。
プログラム
PWM
#include <3664.h>
/*
タイマーVによるPWM制御 出力ピン CH2-7PIN(TMOV)
*/
void msecwait(int msec)
/*なにもしない時間稼ぎ関数*/
{
int i,j;
for (i=0;i< msec;i++) {
for (j=0;j<1588;j++); /*1588は約1/1000s*/
}
}
void main()
{
DI; /* 割り込み禁止*/
TV.TCRV0.BYTE=0x12; /*クロックφ/16 マッチBでカウンタクリア*/
TV.TCSRV.BYTE=0x06; /*マッチAで1を端子に出力 マッチBで0を端子に出力*/
TV.TCORB=100; /* 周期 10KHz*/
TV.TCORA=10; /* デューティ比 0.9 初期値*/
EI; /* 割り込み許可*/
while(1){
TV.TCORA=10; /* デューティ比 0.9 */
msecwait(500); /*しばらく回す*/
TV.TCORA=30; /* デューティ比 0.7 */
msecwait(500);
TV.TCORA=50; /* デューティ比 0.5 */
msecwait(500);
TV.TCORA=70; /* デューティ比 0.3 */
msecwait(500);
}
}
割り込み許可 EI は必ず必要! 忘れずに!
レジスタなど設定
設定が多いので、データシート タイマーVの表を見ながら設定を見てください。
時を刻むTCNTVのクロック速さ設定
クロック設定 メインクロック16MHzなので φ/16 にする。 CKS0-CKS2 TCRV1.ICKS0
ここひとつだけ違うレジスタになるのでややこしいが
CKS0-CKS2 TCRV1.ICKS0 4つで設定するので 設定クロックによっては
TCRV1.ICKS0 で設定するところもあります(0ならばデフォルトなので、設定しなくてもよい)
2 | 1 | 0 |
CKS2 | CKS1 | CKS0 |
0 | 1 | 0 |
それと TV.TCRV1.ICKS0=0 で設定します。
( 初期値(デフォルト)0なのでなくても可 )
φ/16では
クロック速さは メインクロックの1/16なので
16MHz/16 = 1MHz =1000KHz になる
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
名称 | CMIEB | CMIEA | ORIE | CCLR1 | CCLR2 | CKS2 | CKS1 | CKS0 |
説明 | B割り込み | A割り込み | オーバフロー割り込み | カウンタクリア条件 | TCNTVクロック 設定 |
●タイマVの動作
カウンタクリア条件設定
時を刻むTCNTVをどこでクリアするか設定します。
TCORBのコンペアマッチBでカウンタクリアに設定
CCLR2 : 0
CCLR1 : 1
タイマVの割り込みは今回使わないので
CMIEB,A OVIE は 0
以上で このように設定。
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
名称 | CMIEB | CMIEA | OVIE | CCLR1 | CCLR2 | CKS2 | CKS1 | CKS0 |
値 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 |
TV.TCRV0.BYTE= 0x12 (0001 0010 )
動作クロックを選択するとTCNTVはカウントアップを開始します。(タイマWのようにカウンタスタート、ストップ設定はない)
●周期
周期はTCORBの設定値で決まります。
周期は10KHzにします。周期はTCORBの数値で決まることになるので、10KHzがTCORBにはどんな数値にするか計算します。設定クロックが影響して来ます。
1000KHz/100=10KHz
計算で求めるなら
カウント数 = 設定したクロック / 目標クロック
=1000KHz / 10KHz
=100
時を刻むTCNTVを100カウントしたところでコンペアマッチBさせます。
レジスタTCORB
TCORB=100 TV.TCORB=100
デューティ比
デューティ比もTCORAの設定で決まります。
0.1 0.3 0.5 0.7 0.9 と変化させます
周期が10KHzなので
レジスタTCORA
TCORA=10
TV.TCORA=10 ←初期値(30、50・・とあげてデューティ比を変えます)
プログラム内で 10、30、50、70、90 と変えて モーターの変化を観察する。
コンペアマッチの時の出力設定
TCSRV
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
名称 | CMFB | CMFA | OVF | - | OS3 | OS2 | OS1 | OS0 |
説明 | コンペアマッチフラグ マッチで1になる |
コンペアマッチフラグ マッチで1になる |
オバーフローフラグ マッチで1になる |
- | Bとコンペアマッチ時の 端子出力 |
Aとコンペアマッチ時の 端子出力 |
TCORAのコンペアマッチAで1を端子に出力に設定。OS1-OS0
TCORBのコンペアマッチBで0を端子に出力に設定 OS2-OS3
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
名称 | CMFB | CMFA | OVF | - | OS3 | OS2 | OS1 | OS0 |
値 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
TV.TCSRV.BYTE= 0x06 (0000 0110)
ここでは使用していませんが
CMFB、A 、OVF はタイマA同様に コンペアマッチで1になります
TCSRV.CMFB、TCSRV.CMFA、TCSRV.OVF これを監視することでコンペアマッチがわかります
*その他、レジスタ
今回使用しませんでしたが、外部から端子の入力でタイマーをトリガでコントロールできます。
TRGV端子からの入力でタイマをコントロールできます。 ICKS0 だけ別項目になっています。
TCRV1
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
名称 | - | - | - | TVEG1 | TVEG0 | TRGE | - | ICKS0 |
- | - | - | 立上がり、立下りなど カウント条件 |
カウント 開始条件 |
ここだけ TCNTVクロック関連 立上がり、立下り設定 |
実行結果
プログラムをスタートすると、モーターが1秒ほど高速回転し、次のデューティ比に切り替わり、少し遅い回転でまた1秒ほど、この徐々に遅くなるのを繰り返します(4段階)
最後の4回目の デューティ比ではトルクがたりず回転しませんでした。手で少し回し弾みをつけてやると回りました。モーターへの電圧が3Vですから、弱いです。
いろいろなデューティ比に変えたり、モーター電圧をもう少し上げて試すと実験モーターPWM制御らしくなります。
また、周期を変えてどんな変化がでるのかも試すと、よりPWMがわかりはじめるでしょう。
あまりデューティ比を小さくすると ”プーン” と小音だけでモーターが回転しないのもPWMらしい特徴ですね。
まとめメモ
タイマーVの設定レジスタ
- TV.TCRV0.BYTE
- TV.TCSRV.BYTE
( レジスタ TCRV1 は外部からタイマー操作するトリガを設定するときに必要。普段はなくてもデフォルトでいい。)
- TV.TCORB (=1000など
- TV.TCORA
でコンペアマッチ設定
ピン出力の場合 ピン7-TMOV が出力ピンになる
特徴
- タイマーVには2本のコンペアマッチA,Bを仕込める、オーバーフローにもアクション設定可能
- トリガを入力でき、外部からタイマーの操作が可能
- twtter
- google+
- hatena