AVRのATtiny2313マイコンを使用したLEDのゆらぎ点灯プログラムを実装している際、タイマーの設定により、LEDの点滅が異なる速度で動作してしまうという問題に直面している方も多いです。特に、複数のタイマーを使用した場合に異なる速度でLEDが点滅する現象が発生します。この記事では、その原因と改善方法について解説します。
問題の概要:タイマー設定とLEDのゆらぎ
プログラムでは、LEDの明るさがゆらいで点灯することを実現しています。しかし、異なるタイマー(タイマー0とタイマー1)を使用した場合、点灯速度に違いが生じます。タイマー0は遅いゆらぎ、タイマー1は早いゆらぎになるという問題が発生します。
これは、タイマーごとに設定されているクロックの分周比(プリスケーラ)や、タイマーの動作が異なるためです。タイマー0とタイマー1で異なる分周比を設定していると、1秒間に発生するタイマーカウントの数が異なり、それによりLEDの点灯速度が異なる結果となります。
タイマーの設定を統一する方法
この問題を解決するには、まず両方のタイマーで同じ分周比を設定することが重要です。これにより、同じクロック周期でタイマーが動作し、LEDの点灯速度が一致するようになります。
具体的には、以下のように両方のタイマーに対して同じ分周比を設定します。
TCCR0B = 0b00000011; // タイマー0の分周比設定(例: 64)
TCCR1B = 0b00000011; // タイマー1の分周比設定(同じく64)
これにより、両タイマーが同じ速度でカウントを行い、LEDの点灯が一貫した速度でゆらぎます。
明るさの変化量と時間設定の最適化
プログラム内でLEDの明るさを変化させるために、`bright[]` 配列と `db[]` 配列を使用していますが、これらの値が異なるタイマーで異なる動作を引き起こす原因の一つとなります。特に、明るさの変化量(`db[]`)を計算する際、`ti[]` 配列による時間管理が不均一に動作している可能性があります。
この部分を最適化するために、`ti[]` 配列の値や `db[]` 配列の変化量を再計算するロジックを調整し、各LEDのゆらぎがよりスムーズに動作するように改善します。
プログラム改善後の動作
タイマー設定を統一し、明るさの計算を最適化することで、LEDのゆらぎが均一でスムーズに動作するようになります。以下は、改善されたプログラムの一部例です。
void yuragi(void) {
for(int i=0; i<4; i++) {
if(ti[i]==0) next(i);
ti[i]--;
bright[i] += db[i];
}
OCR0A = bright[0];
OCR0B = bright[1];
OCR1AL = bright[2];
OCR1BL = bright[3];
}
このコードでは、タイマー設定が統一され、LEDの明るさがより自然に変化します。
まとめ:AVRでのLEDゆらぎ点灯プログラムの改善
ATtiny2313を使用したLEDのゆらぎ点灯プログラムにおいて、タイマーの設定や明るさの変化量の調整が重要です。タイマー設定を統一し、明るさの変化を最適化することで、LEDの点灯速度が一致し、よりスムーズに動作するようになります。
このような細かい調整を行うことで、AVRでの制御がより効果的になり、実用的なLED制御が可能になります。これからも、細かいプログラムの改善を行いながら、より高精度な制御を実現していきましょう。


コメント