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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.