Forum: Mikrocontroller und Digitale Elektronik Problem bei Analyse des PWM Signals


von Julian W. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo liebe Elektronik-Gemeinde,

zur Zeit versuche ich mich an PWM Signalen.
Als Hardware verwende ich zur Zeit einen Arduino Uno.

Leider funktioniert die Analyse nicht richtig wenn ein Tastgrad zwischen 
0% und etwa 5% sowie etwa 95% bis 100% eingestellt ist.

In diesem Bereich halbiert sich genauestens auf einmal die gemessene 
Frequenz zwischen den beiden steigenden Flanken.


Zur Analyse nutze ich den ICP1 von Timer1.
Timer0 erzeugt das zu messende Signal und Timer2 regelt die Häufigkeit 
der Ausgabe.

Mit einem Potentiometer an dem AD-Wandler Eingang 0 kann ich den 
Tastgrad einstellen. Zudem hängt eine LED am OCR0A.


Anbei mein Code

Ich freue mich auf eure Hilfe

Viele Grüße und vielen Dank für das tolle Forum
Julian

von Achim S. (Gast)


Lesenswert?

Julian W. schrieb:
> In diesem Bereich halbiert sich genauestens auf einmal die gemessene
> Frequenz zwischen den beiden steigenden Flanken.

Wie misst du diese Frequenz? Mit einem Oszi? Bist du sicher, dass du 
ausreichend schnell abtastest, damit die sehr schmalen Pulse auch sicher 
erwischt werden (du brauchst >= 1 Abtastpunkt pro Pulsbreite). Du kannst 
zur Sicherheit auch mal die Acquisition des Oszis auf "Envelope" 
stellen, um sicher zu gehen, dass du die schmalen Pulse nicht 
übersiehst.

von Achim S. (Gast)


Lesenswert?

Ups, sorry für die Frage. Jetzt habe ich realisiert, dass du die 
Messmethode ja schon genannt hast (ICP mit Timer1).

Dann lass mich die Frage umformulieren: wie breit sind denn die Pulse 
noch, wenn die PWM<5% bzw. >95% ist? Reicht die Zeit noch sicher, um in 
deiner Interrupt-Routine die betrachtete Flanke umzustellen oder kann es 
vorkommen, dass die nächste Flanke schon da war bevor du die ISR beendet 
hast?

von Julian W (Gast)


Lesenswert?

so etwas wie ein Oszilloskop besitze ich leider nicht :(

der Arduino wird mit 16 Mhz betrieben, bei dem PWM mit 8 Bit von Timer0 
macht das bei einem Vorteiler von 1 maximal 62,5kHz und bei einem 
Prescaler von 8, 7812,5Hz

Diese 62,5kHz beziehungsweise 7812,5 kHzwerden mir dann auch korrekt 
ausgegeben, wenn ich eben mit der Pulsdauer irgendwo in der Komfortzone 
bleibe.

Bei 62,5 Khz geht das Problem mit der ausgegebenen halben Zeit 
tatsächlich schon früher los, maximal 10% oder 90%

bei einem Vorteiler von 8 und , gehen schon die 5% bis 95%

Genau kann ich leider nicht sagen, wie lange die Impulse sind.



Was mich stutzig macht, ist dass die Berechnung des PWM-Pulses von 
steigender auf fallender Flanke immer stimmt, nur nicht die Berechnung 
von steigener Flanke zur steigenden Flanke.


und wieso ist es genau 31,25kHz beziehungsweise 3906,25Hz ?
Dass es genau die Hälfte ist, ist doch sicher kein Zufall?


Viele Grüße und vielen Dank für eure Hilfe :)
Julian

von Thomas E. (thomase)


Lesenswert?

Julian W schrieb:
> Bei 62,5 Khz geht das Problem mit der ausgegebenen halben Zeit
> tatsächlich schon früher los, maximal 10% oder 90%
>
> bei einem Vorteiler von 8 und , gehen schon die 5% bis 95%
>
> Genau kann ich leider nicht sagen, wie lange die Impulse sind.

10% von 255 Takten sind 25 Takte. Seien wir grosszügig 26. Dann kommt 
die negative Flanke. Bis dahin ist die ISR, in der die Flankentriggerung 
umgeschaltet wird, fast noch mit sich selbst beschäftigt.

Julian W schrieb:
> und wieso ist es genau 31,25kHz beziehungsweise 3906,25Hz ?
> Dass es genau die Hälfte ist, ist doch sicher kein Zufall?

Weil es genau eine Amplitude später kommt.

mfg.

von Julian W (Gast)


Lesenswert?

danke, jetzt hab ich es verstanden.


Also muss ich die Interruptroutine schlanker machen.
Könnt ihr mir eventuell Tipps geben, was ich verlagern könnte?
Ich würde eventuell das Neuschreiben von TCCR1B in die Main verlagern, 
aber das reicht ja sicher nicht.

Polling wäre zeittechnisch sicher besser?
Aber den Interrupt benötige ich dann ja trotzdem.



Ich hab vorhin den Artikel zum Highspeed Capture gelesen und mich etwas 
eingearbeitet.
Meine Anforderungen sind um Längen nicht so hoch, ich wollte das 
PWM-Signal Messen aber nur als Zusatz einbauen, es wird noch ein 
Schieberegister über SPI oder ein EEPROM über I2C und eventuell ein LCD 
Display dran kommen, was ja wieder Rechenzeit benötigt.

Julian

von Thomas E. (thomase)


Lesenswert?

Julian W schrieb:
> Also muss ich die Interruptroutine schlanker machen.
> Könnt ihr mir eventuell Tipps geben, was ich verlagern könnte?

Eigentlich musst du gar nichts verändern. Du musst nur das Ergebnis 
richtig bewerten.

Natürlich kannst du deine ISR abspecken, vor allen Dingen aber solltest 
du sie ein bisschen umsortieren. D.h. als Erstes sicherst du den 
ICP-Wert und direkt danach schaltest du den Trigger um. Und nicht 
irgendwann, wie du es jetzt machst.

Das reicht aber immer noch nicht, um sehr kurze Impulse zu messen. Der 
kürzeste Impuls ist ein Taktzyklus lang. Um den zu messen, brauchst du 
die steigende Flanke als Beginn und die fallende Flanke des nächsten 
Impulses als Ende.

Das setzt natürlich voraus, dass die beiden aufeinander folgenden 
Impulse gleich lang sind. Aber in aller Regel ist das ja so. Es sei 
denn, du hast tatsächlich nur einen Impuls. Damit hättest du die Grenze 
deiner Messmöglichkeiten überschritten. Im anderen Fall hast du jetzt 
zufällig die Möglichkeit entdeckt, auch kürzere Impulse zu messen. Du 
musst es, wie schon gesagt, nur richtig auswerten.

mfg.

von Julian W (Gast)


Lesenswert?

ich hab heute testweise mal das Umschreiben des Timerregisters in die 
Main Methode verlegt und anstatt den ganzen Variablen für die 
Zustands-Erkennung mit True und False ob steigende oder fallende Flanke, 
eine Switch-Case Anweisung mit 3 Fällen in die Interruptroutine gelegt, 
wo nur noch die Werte rausgeschrieben werden.


Mit dem Ergebnis, dass das ganze Ding langsamer gearbeitet hat.

Wie kann denn das sein, wenn ich die Interrupt Routine abgespeckt habe?

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.