PWM geht einfach aus und wieder an in einer AN_Phase!

OP #1252910
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
}
Angehängte Dateien:
Gast
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?
OP
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
}
Angehängte Dateien:
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.
Gast
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?
Gast
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
OP
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....
>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.
Gast
> 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.
OP
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....
Angehängte Dateien:
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.
OP
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...
Angehängte Dateien:
Gast
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.
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.