Hallo.
Ich versuche mit einem ATMEGA32 eine PWM mit variabler Frequenz zu
erzeugen.
Die PWM soll immer ein konstantes Tastverhältnis von 50% haben.
Dazu habe ich den 16-Bit Timer für den FAST PWM Mode konfiguriert (Mode
14, Table 47. Datenblatt Seite 112)
Nun verwende ich dieses Programm:
Hier wird ständig das ICR1 register (Frequenz der PWM) mit einem neuen
Wert beschrieben und darauf hin das OCR1A Register (Tastverhältnis) mit
der Hälfte dieses Wertes.
Das Problem welches auftaucht ist folgendes:
Wenn ich den Mikrocontroller laufenlasse, so sehe ich die
Frequenzänderung über eine LED am OCR1A Ausgang und höre sie Über einen
Lautsprecher, der ebenfalls über den OCR1A Ausgang (zusätzlich
komplementärer Emitterfolger) angeschlossen ist. Es tauchen jedoch
Aussätzer auf von teilweise einigen Sekunden.
Sprich die LED geht aus, der Ton verstummt. Ich habe das Gefühlt, als ob
der Controller plötzlich stoppen würde um dann an der selben Stelle
wieder anfängt das Programm abzuarbeiten. Diese Unterberchungen sind
nicht regelmäßig.
Kann der Grund dafür derjenige sein, dass ich die Timer Register nicht
korrekt oder in falscher Reihenfolge beschreibe?
Variablenüberläufe?
Bin erstmal Ratlos.
1 | int a, e, f;
|
2 | int b = 1;
|
3 |
|
4 | while(1)
|
5 | {
|
6 | for( b = 0; b <= 10; b++)
|
7 | {
|
8 |
|
9 | for( a=30+b; a<=36+b; a++)
|
10 | {
|
11 | e = a;
|
12 | f = a+6;
|
13 | ICR1 = e;
|
14 | e=e/2;
|
15 | OCR1A = e;
|
16 |
|
17 | _delay_ms(100);
|
18 |
|
19 | ICR1 = f;
|
20 | f=f/2;
|
21 | OCR1A = f;
|
22 |
|
23 | _delay_ms(100);
|
24 | }
|
25 | }
|
26 | }
|