Forum: Mikrocontroller und Digitale Elektronik PWM mit var. Frequenz (Prog. Absturz?)


von polfort (Gast)


Lesenswert?

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
}

von Falk B. (falk)


Lesenswert?

@  polfort (Gast)

>Ich versuche mit einem ATMEGA32 eine PWM mit variabler Frequenz zu
>erzeugen. Die PWM soll immer ein konstantes Tastverhältnis von 50% haben.

Dann ist es aber keine PWM, sondern ein Rechtecksignal mit variabler 
Frequenz.

>wieder anfängt das Programm abzuarbeiten. Diese Unterberchungen sind
>nicht regelmäßig.

Stromversorgung mies? 100nF nah am Controller?

>Kann der Grund dafür derjenige sein, dass ich die Timer Register nicht
>korrekt oder in falscher Reihenfolge beschreibe?

Nein.

>Variablenüberläufe?

Sehe ich nicht.

MFG
Falk

von polfort (Gast)


Lesenswert?

Stimmt die Pulsweite wird ja nicht moduliert..

Die Spannungsversorgung ist IO, soweit ich das beurteilen kann. Außer 
sie bricht so schnell ein, dass ich es nicht bemerke. Ein Multimeter ist 
da wohl zu träge für.. Hmm..

Andererseits versorge ich den Lautsprecher bzw. die Endstufe aus einer 
anderen Quelle.
Darf also keinen Einfluss haben auf die Versorgung des Controllers.

von Falk B. (falk)


Lesenswert?

@  polfort (Gast)

>Andererseits versorge ich den Lautsprecher bzw. die Endstufe aus einer
>anderen Quelle.

Aber du hast hoffentlich die Massen verbunden . . .

von polfort (Gast)


Lesenswert?

Ja selbstverständlich.
Trotzdem Danke für die Hinweise.

Ich versuche es mit einem ATMEGA16, habe hier einen.
Sonst fällt mir nichts ein im Mom.

von polfort (Gast)


Lesenswert?

Naja, mit dem anderen Controller tut sich da nicht viel mehr.
Hat jemand vielleicht noch eine Idee?

Die Hardware ist ok.
Habe das Ganze mit einem M16C ausprobiert und da klappt es wunderbar.

von avr (Gast)


Lesenswert?

Wenn du "nur" ein Rechteck am PIN OC1A willst ist der Timer-Mode 4
besser.
CTC mit Top in OCR1A und Toggle.
1
 
2
TCCR1A=(1<<COM1A0);
3
TCCR1B=(1<<WGM12)|(1<<CS10);
4
5
      e = a;
6
      f = a+6;
7
      e=e/2;
8
      OCR1A = e;
9
10
      _delay_ms(100);
11
 
12
     f=f/2;
13
      OCR1A = f;

Ich habe den Prescaler auf 1, muß evtl. angepasst werden ;)

avr

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.