日々の生活を好き勝手につづったブログ(My blog is written by inoshita.jp)
基本的に次のレジスタを設定する
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
・bit7,6(COM0A1,COM0A0):比較A出力選択
OC0A比較出力ピンの動作を制御
・bit5,4(COM0B1,COM0B0):比較B出力選択
OC0B比較出力ピンの動作を制御
・bit1,0(WGM01,0):波形生成種別
上位ビット(WGM02)がTCCR0Bにあるので合わせて設定
4種ある
①標準動作(タイマーとして利用)
最大値の0xffで割り込みを発生させカウント,つまり間隔はクロック選択で決定
②CTC動作(タイマーとして利用)
OCR0Aに比較値(TOP値)を設定して割り込みを発生させカウント,間隔はクロック選択と組み合わせ
割り込み時にTOP値の変更可能
③高速PWM(PWM出力)
最大値の0xffもしくはTOP値を設定して動作可能
のこぎり波のTOP値指定なので判り易い(高クロック)
④位相基準PWM(PWM出力)
反転値を設定して動作可能
三角波の設定された値になると立上げ・立下げとなる(低クロック)
制御レジスタB(Timer/Counter Control Register B)TCCR0B
・bit2,1,0(CS02/01/00):クロック選択
タイマ/カウンタレジスタ(実際にカウントされるカウントレジスタ)
比較Aレジスタ:OCR0AにTOP値(周期)
比較Bレジスタ:OCR0Bにduty比(実際は割合を比較値にして登録)
最大周期 = メインクロック / 分周 / 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