avr atTiny13a 7:PWM


 PWM 

 ATTiny13aでPWM動作をさせようと思います、その方法は次の通り色々あります。
1.「C_コンパイラー」のライブラリーを使って動作せる(基本)。
2.完全にSoftを作って動作させる。
3.レジスターを直接コントロールして動作させる。

 初め、コンパイラーのライブラリーで動作させようと思ったのですが、結局動かなかった(理由不明:簡単に作動可能の為でしょうか)。
 そういえば以前「AT90S2313」でPWM動作をさせようと思ったのですが、この時も動かず「結局レジスターを設定」して動かしました。

 今回コンパイラーでの方式を塩漬けにし、「Softで作って見よう」とプログラムを考えて見ました。
 Softで動けばどんなMCUでもかまわない訳で応用性は逆に高いかも知れません、で…作り始めました。


[ PWM 動作(Soft式)! ]

 PWM信号を連続的に書き込みスパン幅の変化をさせて見ました。
 当所、Soft処理なので時間が間に合うか不安でしたが想定通り動きました。

概略次の通りです。
1.255(8bit)の間隔とした。
2.H部分を出力する。
3.残りはL出力で埋める。
4.HLはデュティ比で可変出来るようにした。

* 出力端子はOC0Aは5ピン・OCR0Bは6ピンとハード的に決まっている、変更は出来ない(これはSoftなので自由ですけど、他との関係で同じにして置きます)。

 PWMの動作プログラム、下はHexのDATAです。

 連続的に変化させた物を、携帯の動画で撮って見ました。


:1000000034C0FECFFDCFFCCFFBCFFACFF9CFF8CF76
:04001000F7CFF6CF61
:10006A00BFE9BDBFB0E0BEBF2F92B1E0B7BBB4E0FD
:10007A00B8BBB1E0B0936000009160000F3F48F454
:10008A0020906000C8DF009160000E5F009360005E
:06009A00F3CFEFCFFFCF12
:10002000B0E02B1611F4B1E02B2EB0E0B0936100DC
:10003000B0E0B0936100009161000A30A8F4B8B359
:10004000B160B8BB2F92E6DF2F90B8B3BE7FB8BBCC
:100050000FEF02192F92202EDDDF2F90009161000B
:0A0060000F5F00936100E7CF0895E1
:0C001400022D0150202E0030D9F7089575
:00000001FF
[ 動作させて! ]

 実際は「モーターを回す」や「電灯」などのコントロール用に使える「サブルーチン」として使います。
 でも、これだけでは少し使い難いので、もう少し工夫が必要でしょうか。

 今回の動作は5V電源で[PORTB0(5ピン)]に出力を出しています。これをオシロで動作確認をしました。


 次にレジスターをコントロールするB方式を試して見ました。

基本的に次のレジスターなどを設定すれば作動します。
A.DDRB:I/Oポートを出力に設定する。
B.TCCR0A:PWMの動作を指定します。
C.TCCR0B:にクロックの分周を設定し、動作周波数を決めます。
D.OCR0AとOCR0B:デュティ比の設定をする。2チヤンネルありますが使わなくても良い。
 これでハード的に動くので一度設定すればメインプログラムとは関係なく作動する。

[ クロックの選択と設定 ]

 メインクロック 1.2MHz(0.833uSec)の場合は(普通)
1/1024で2.3Hz ・1/256で9.1Hz ・1/64で36.6Hz ・1/8で294Hz ・1/1で2.38KHzになります。
但し、高速動作をさせる場合、半分の時間ですから、この表示の倍になります。

 メインクロック 9.8MHz(0.102uSec)の場合は
1/1024で18.3Hz ・1/256で73.5Hz ・1/64で294.1Hz ・1/8で2.38KHz ・1/1で19KHzになります。
但し、高速動作をさせる場合、半分の時間ですから、この表示の倍になります。

 止める場合は[TCCR0B=0]にすれば止まります。動かす場合は再度TCCR0Bに分周の設定をすれば始まる。

 実験では、手持ちのICと計算値との間に誤差が発生した、発振周波数は-7%になりました。これはメーカー発表の誤差範囲内(10%)です。精度が必要なら合わせ込む必要があります。
 但し、モーターコントロールなどは周波数よりもデュティ比が問題になりので気にしないで使えると、思います。

 動作プログラム、下はHexのDATAです。

:1000000009C0FECFFDCFFCCFFBCFFACFF9CFF8CFA1
:04001000F7CFF6CF61
:10001400BFE9BDBFB0E0BEBFB3E0B7BBB0E0B8BBA3
:10002400B3E8BFBDB4E0B3BFB3E6B6BFFFCFFFCF05
:00003400CC
:00000001FF
[ その他の設定! ]

☆デュティ比の設定はOCR0Aの値を設定する。
OCR0A=255*[%]/100:で求め、10進や16進数で設定する。

☆高速動作は[ TCCR0A=0b10000011; ]のようにする(参考)。

製作 2013/11/25 


 [MAIN MENU へ戻る]

inserted by FC2 system