0

AVRATMega16で遅延を使用して単純なPWM生成を達成しようとしています

私がやろうとしているのは、LEDを100%から0%のデューティサイクルにフェードさせることです。後でそれを拡張して、2色の2色のLEDを制御し、素晴らしい効果をもたらします。

私は以前にPICを使用してmikroCでこれを実行しましたが、どういうわけかavr-gccではそれほど簡単ではないか、何かが足りない可能性があります。

ここでの私の問題は、LEDを3秒で完全にフェードさせたいのですが、フェードが速く感じられることです。また、低いデューティサイクルよりも高いデューティサイクルに多くの時間を費やしていると思います。つまり、LEDが少し明るく見えると、色あせますが、暗くなると、さまざまなデューティサイクルに非常に速く移動するので、そう思います。

Any ideas you might have on what i am missing ?

Code is available here : http://ideone.com/lUP5f

Thanks

4

2 に答える 2

1

ヒューズの設定に問題がある可能性があります。クロックは通常、定義ではなくヒューズによって制御されます。ただし、遅延関数は#defineF_CPUを使用します。ヒューズの設定を投稿できますか?

PWMを生成するためにタイマーの代わりに遅延を使用したい特定の理由はありますか?タイマーを見たい場合は、これらのチュートリアルをお勧めします:1)タイマーチュートリアル2)PWM

編集:ところで

 uint8_t b = 1000;

uint8_tは、0から255までの値を許可します。コンパイラーは通常、これに対する警告を生成します。

../test.c:16:警告:大きな整数が暗黙的に符号なし型に切り捨てられました

于 2012-02-01T06:41:16.423 に答える
1

問題は、LED が直線的でないことです。そのため、たとえば 50% でオンにして明るさを 50% に下げることはできません。

事前定義されたテーブルを使用できます (例: http://www.mikrocontroller.net/articles/LED-Fading#Das_Demoprogramm )

ドイツ語が読める必要はありません。このコードを調べてみてください。たとえば、16 ビット PWM (pwmtable_16[]) 用のテーブルがいくつかあります。

したがって、次のように書くことができます。

delay_us(pwmtable_16[a]);

それ以外の

delay_us(a);

于 2012-02-06T19:49:17.827 に答える