Forum: Mikrocontroller und Digitale Elektronik PWM geht einfach aus und wieder an in einer AN_Phase!


von Jörn A. (joern_)


Angehängte Dateien:

Lesenswert?

Hy

ich möchte eine PWM für ca 1000ms aktivieren und dann 1000ms ausstellen.
ABER leider geht die PWM während der AN_Phase einfach immer wieder aus!

Auf dem Bild sieht man im oberen Teil das die AN_phase ca 1sek an ist 
und dann ca 1sek AUS_Phase. Im unteren Bild ist ein Ausschnitt der 
"funktionierenden aktiven An_phase".

Das Verhältniss 200Schritte_AN (48us) und 823Schritte_AUS (204us) passt 
und der 4kHz Takt ist auch da!
Habe ich etwas grundsätzliches vergessen?
1
long n=0;
2
while(1)
3
{  
4
5
  DDRD |= ( 1<<PD5 );          
6
  TCCR1A = (1<<WGM11)|(1<<WGM10)|(1<<COM1A1);
7
  TCCR1B = (1<<CS10);          
8
  OCR1A = 200;
9
10
  for(n=800000; n>1;--n)
11
    {
12
       asm volatile ("nop");      
13
    }
14
15
  OCR1A = 0;
16
  for(n=800000; n>1;--n)
17
    {
18
      asm volatile ("nop");      
19
    }
20
21
}

von Gast (Gast)


Lesenswert?

Das Oszibild sieht doch gut aus, eine Sekunde lang ist die PWM an mit 
OCR = 200 und eine Sekunde dann aus mit OCR = 0

von Jörn A. (joern_)


Angehängte Dateien:

Lesenswert?

nein leider nicht. Bild ist leider nicht so gut!

Die Zeitskala ist 200ms/DIV. Das heißt die PWM geht 4 mal an/aus in der 
eigentlichen AN_Phase (1Sek), anstatt 1Sek einfach anzubleíben...

von Gast (Gast)


Lesenswert?

Also möchtest du nu eine Sekunde an und dann eine Sekunde ausschalten.

Da brauchst du den PWM Modus des Timers nicht.

Was möchtest du wirklich machen?

von Jörn A. (joern_)


Angehängte Dateien:

Lesenswert?

also ich möchte eine Spannung generieren z.B. 1V (OCR1A =200) für 1 Sek 
und dann für 1 Sek 0V am Ausgang haben. Daher die PWM um die gewünschte 
Spannung zu erzeugen.

hier nochmal ein Bild von bissel mehr als zwei Durchläufen der 
while()... Man sieht das während der AN_Phase (wo 1V generiert werden 
sollen) die PWM nur stückweise an ist. Dort wo sie an ist funktionert es 
wunderbar. aber ist nicht sie läuft nicht die ganze Sekunge lang...

In der Aus_Phase gibt es keine Probleme...

Soll:

    ---AN_PHASE----   ----AUS_PHASE----    ---AN_PHASE----

1V   ---------------                      ------------------
    |               |                    |
0V -                 --------------------

So ist es leider:

    ---AN_PHASE----   ----AUS_PHASE----    ---AN_PHASE----

1V   --     ---                            ----       ---
    |  |   |   |                          |    |     |   |
0V -    ---     --- ----------------------     -----     ----


hier nochmal das gesamte C.file
1
#define F_CPU 8000000UL
2
#include   <avr/interrupt.h>
3
4
int main(void)
5
{
6
7
sei(); 
8
    
9
long n=0;
10
    DDRD |= ( 1<<PD5 );      
11
    TCCR1A = (1<<WGM11)|(1<<WGM10)|(1<<COM1A1);
12
    TCCR1B = (1<<CS10);  
13
14
  while(1)
15
  {  
16
      
17
    OCR1A = 200;
18
19
    for(n=800000; n>1;--n)
20
      {
21
         asm volatile ("nop");      
22
      }
23
24
    OCR1A = 0;
25
    for(n=800000; n>1;--n)
26
      {
27
        asm volatile ("nop");      
28
      }
29
30
  }
31
}

von Karl H. (kbuchegg)


Lesenswert?

Das heist also, das was auf deinem Bild wie ein einzelner Puls aussieht, 
ist in Wirklichkeit selbst wieder eine Schwingung?

Ich hätte nämlich auch jeden einzelnen deiner 'Pulse' als einen einzigen 
PWM Zyklus gesehen und wollte dich schon um die Taktfrequenz fragen um 
mal mit deinen PWM EInstellungen nachrechnen zu können.

von Gast (Gast)


Lesenswert?

Hmm, aber genau das macht das Programm doch und genau das sieht man auch 
auf dem Oszibild.

Was dir fehlt ist evtl ein gedanklicher Tiefpass. Die PWM Frequenz 
sollte vlt. auch noch deutlich höher gewählt werden. Warum hast du die 
bisherige Frequenz ausgewählt?

von sam (Gast)


Lesenswert?

eine pwm generiert keine gleichspannungen sondern eine gepulste spannung 
... wenn man die fläche unter der an-kurve errechnet solltest du deinen 
gewünschten gleichspannungswert in der an-phase erreichen.

der sinn der PWM ist es dauernd aus und an zu gehen :P

von Jörn A. (joern_)


Lesenswert?

also die PWM selber läuft mit 4kHz = 1 Periode 0.25ms.

Das funktioniert soweit. High ist 48us und low ist 204us.

Ich stelle die PWM für 1 Sek an und sollte über die Zeit mit Filter eine 
Gleichspannung von 1V haben. Leider schaltet die "PWM" im Betrieb 
einfach ab nach ca 125ms siehe Bild! Die Highs & Lows auf dem Bild haben 
eine Periode von 250ms und nicht die 0.25ms.....

Wenn ihr euch die Skale im Bild mPerioden.GIF anschaut, seht ihr, dass 
die PWM (oben die Zacken auf dem HIGH, Osci löst da die PWM nicht auf) 
in den anschnitten für ca 125ms läuft und dann ausgeht. Wenn ich auf die 
"high Zonen" zoome kommt die eigentlich PWM zum vorschein....

von Teplotaxl X. (t3plot4x1)


Lesenswert?

>Jörn Ahrens schrieb:
1
 #define F_CPU 8000000UL
2
 #include   <avr/interrupt.h>
3
 
4
 int main(void)
5
 {
6
 
7
 sei();
8
 
9
 long n=0;
10
     DDRD |= ( 1<<PD5 );
11
     TCCR1A = (1<<WGM11)|(1<<WGM10)|(1<<COM1A1);
12
     TCCR1B = (1<<CS10);
13
 
14
   while(1)
15
   {
16
 
17
     OCR1A = 200;
18
 
19
     for(n=800000; n>1;--n)
20
       {
21
          asm volatile ("nop");
22
       }
23
 
24
     OCR1A = 0;
25
     for(n=800000; n>1;--n)
26
       {
27
         asm volatile ("nop");
28
       }
29
 
30
   }
31
 }
Eigentlich müsste dein Compiler mehrfach Meckern:
1. #include <io,h> fehlt, oder macht das die interrupt.h automatisch.
2.  for(n=800000; n>1;--n) //von was für nem Datentyp ist n? In der 
Annahme, dass der Compiler als Standarddatentyp unsigned int verwendet, 
ist  800000 > 65536. Das sollte dem Compiler auffallen.

Zusätzlich brauchst du die interrupt.h nicht. Die PWM-Einheit des Timers 
kann auch ohne Interrupts arbeiten.

PS: T'schuldigung, dass ich das nicht als Zitat poste, aber die 
Forensoftware ist der Meinung, dass mein Zitat zu viele Zeilen hat.
>Bitte reduzieren Sie die Anzahl der Zitatzeilen.

von holger (Gast)


Lesenswert?

Watchdog abgeschaltet?

von Gast (Gast)


Lesenswert?

> long n=0;

Und Compiler meckert nichts an. die io.h wird wohl durch die interrupt.h 
eingebunden.

Also interrupt.h durch io.h ersetzen.

Zoom doch bitte mal rein damit man die "richtige" PWM sehen kann.

von Teplotaxl X. (t3plot4x1)


Lesenswert?

Huch, das habe ich wohl übersehen ;)

von Jörn A. (joern_)


Angehängte Dateien:

Lesenswert?

siehe Bild so sollte es sein. Und dort wo es high ist auf dem Bild 
steckt die PWM drin....

@Teplotaxl X. (t3plot4x1)

n ist "long n" (vor der while)
io.h ist jetzt drin aber das gleiche.

@holger (Gast)

watchdog ist doch garnicht drin

von Jörn A. (joern_)


Angehängte Dateien:

Lesenswert?

nein auch beim ZOOMEN auf 50ms/div ist die anzeige die selbe und immer 
perfekt periodisch

mein eigentliches Problem war:

ich hatte einen Filter (RC-Glied 100nF & 1.5k) dahinter und dort hatte 
ich mehrere lade & entlade Vorgänge mit 100-200ms pro AN_PHASE von 1Sek 
, was überhaupt kein Sinn bei einer PWM von 4kHz macht...

Daher wollte ich mir die PWM genauer anschauen bin auf das Signal ohne 
gestoßen am offenen PIN ohne Filter u.s.w. ... Hinzu kommt das die 
"lade&entlade" Vorgänge genau zum Oszibild passen.. wo ja über der 
eigentlichen PWM von 4kHz noch eine ZWEITE PWM von 4-5Hz liegt....

von Karl H. (kbuchegg)


Lesenswert?

Ist das ein Digitaloszi?
Kann es sein, dass die 'Pulse' in Wirklichkeit nur Artefakte sind, die 
durch das Sampeln enstehen, also sowas wie eine Schwebung, weil dein 
Oszi durch die Samplefrequenz die PWM eine zeitlang immer in der 
High-Phase erwischt, während sie die PWM danach eine zeitlang immer in 
der LOW Phase erwischt?

Hast du schon mal eine LED an den (ungefilterten) Ausgang gehängt. Bei 
deinem Timing müsste man die Led in jeder Sekunde 4 mal blinken sehen, 
wenn der Effekt real ist.

von Karl H. (kbuchegg)


Lesenswert?

Jörn Ahrens schrieb:
> hier der ZOOM aus einer "high Phase" 200us/DIV

macht mich stutzig, dass aus den 4 Peaks von vorher plötzlich 9 geworden 
sind.
Ich denke du läufst gerade einem Messfehler hinterher.

von Jörn A. (joern_)


Angehängte Dateien:

Lesenswert?

nein auch beim ZOOMEN auf 50ms/div ist die anzeige die selbe und immer 
perfekt periodisch

mein eigentliches Problem war:

ich hatte einen Filter (RC-Glied 100nF & 1.5k) dahinter und dort hatte 
ich mehrere lade & entlade Vorgänge mit 100-200ms pro AN_PHASE von 1Sek 
, was überhaupt kein Sinn bei einer PWM von 4kHz macht...

Daher wollte ich mir die PWM genauer anschauen bin auf das Signal ohne 
gestoßen am offenen PIN ohne Filter u.s.w. ... Hinzu kommt das die 
"lade&entlade" Vorgänge genau zum Oszibild passen.. wo ja über der 
eigentlichen PWM von 4kHz noch eine ZWEITE PWM von 4-5Hz liegt....

P.S.: Sorry mein schönes Gif nimmt er leider nicht...

von sam (Gast)


Lesenswert?

nur mal so eine idee ... du scheinst ja ein digital-osci zu benutzen ... 
ich selber habe mit denen nicht so die erfahrung ... aber könnte sich 
die abtastfrequenz des oscis mit der PWM-frequenz so überlagern, dass du 
einen moiré-effekt auf dem osci siehst?

d.h. es tastet fast nur die pwm-lücken ab und gibt dir damit natürlich 
ein low-pegel zurück.

von Karl H. (kbuchegg)


Lesenswert?

Sorry, aber auf deinem ungezoomzen Bild ist der Abstand zwischen den 
Peaks 250ms
Auf deinem gezoomten Bild hingegen ist er kleiner (0.25ms)
Zudem: Ungezoomt hast du in deiner 1 Sekunde genau 4 Peaks, gezoomt sind 
es plötzlich 9. Dein AVR wird ja nicht anders laufen, nur weil dein Oszi 
plötzlich auf gezoomt gestellt wird.

Zudem würde ich (auf deinem ungezoomten Bild) bei 200 Samples in der 
Sekunde durchaus mit solchen Artefakten rechnen. Das ist weit unter der 
Nyquistfrequenz.
Gezoomt allerdings sollten die 500kSa/s allerdings ausreichen um die 
~3.5kHz der PWM sauber aufzulösen. Was allerdings das Oszi bei der 
Anzeige macht, ist wieder eine andere Geschichte. Aber da denke ich, 
dass die Jungs bei Agilent ja nun auch wieder keine Trottel sind.

von Jörn A. (joern_)


Angehängte Dateien:

Lesenswert?

also ich glaube es ist das "nicht erwartbare". Nach Prozessoraustausch 
sieht es jetzt so aus!!


@ all

trotzdem VIELEN dank für die Mühe!!

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.