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
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.
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?
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
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.
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
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.
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?