ATtiny13a(PWMとタイマー)

基本的に次のレジスタを設定する
A.DDRB:I/Oポートを出力に設定
B.TCCR0A:PWMの動作を指定
C.TCCR0B:クロックの分周を設定
D.OCR0AとOCR0B:比較値の設定(2チヤンネルある)
 これでハード的に動くので一度設定すればメインプログラムとは関係なく作動する。

PB0: OC0A 使えない(拙者の持つ個体では動作しない)
PB1: OC0B(拙者の個体ではOC0Aの設定値が使われる)

TCCR0Aのbit4,5,6,7でOC0AとOC0Bを選択
TCCR0Bで動作モードと分周を指定

制御レジスタA(Timer/Counter Control Register A)TCCR0A

TCCR0A.png

・bit7,6(COM0A1,COM0A0):比較A出力選択

OC0A比較出力ピンの動作を制御

COM0A0-1.png

・bit5,4(COM0B1,COM0B0):比較B出力選択

OC0B比較出力ピンの動作を制御

COM0B0-1.png

・bit1,0(WGM01,0):波形生成種別

上位ビット(WGM02)がTCCR0Bにあるので合わせて設定

WGM02-0.png

4種ある

①標準動作(タイマーとして利用)

最大値の0xffで割り込みを発生させカウント,つまり間隔はクロック選択で決定

②CTC動作(タイマーとして利用)

OCR0Aに比較値(TOP値)を設定して割り込みを発生させカウント,間隔はクロック選択と組み合わせ

CTC動作.png

割り込み時にTOP値の変更可能

③高速PWM(PWM出力)

最大値の0xffもしくはTOP値を設定して動作可能

高速PWM.png

のこぎり波のTOP値指定なので判り易い(高クロック)

④位相基準PWM(PWM出力)

反転値を設定して動作可能

位相基準PWM.png

三角波の設定された値になると立上げ・立下げとなる(低クロック)

制御レジスタB(Timer/Counter Control Register B)TCCR0B

TCCR0B.png

・bit2,1,0(CS02/01/00):クロック選択

TCCR0B_CS0.png

タイマ/カウンタレジスタ(実際にカウントされるカウントレジスタ)

TCNT0.png

比較Aレジスタ:OCR0AにTOP値(周期)

OCR0A.png

比較Bレジスタ:OCR0Bにduty比(実際は割合を比較値にして登録)

OCR0B.png

最大周期 = メインクロック / 分周 / 256

(1カウントあたり)

分周 1.2MHz 9.6MHz
1/1024 4.57Hz 36.6Hz
1/256 18.3Hz 146Hz
1/64 73Hz 586Hz
1/8  586Hz 4.7KHz
1/1 4.7KHz 37.5KHz(*)

この周波数で利用するなら0→255を周期とすれ良いが異なる場合はMAX値を調整する

例えば(*)は255をMAXにした場合37.5KHzになるのだから40KHzにするには

9.6MHz / 40KHz = 240

MAX値を240にすれば良い(37.5KHzより低くはできないので低い場合は分周やクロックを変更する)

4KHzにする場合だとクロックを4.8MHzにして1/8分周にすれば最大が2.34KHzになるので

4.8MHz / 8 / 4KHz = 150

MAX値を150にすれば良い

止める場合は[TCCR0B=0]にすれば停止

動かす場合は再度TCCR0Bに分周の設定

OCR0A = 255 * [%] / 100

TCCR0A=0b10000011;

で高速動作

参考①:http://startelc.com/AVR/Avr_100timrMemo.html

参考②:https://hello-world.blog.so-net.ne.jp/2012-09-29

参考③:http://elec-studio.eco.coocan.jp/studio_03.html

参考:https://stastaka.wordpress.com/2012/03/20/avr-timer1/