Hi, ich bin auf der Suche nach einer Lösung, um das PWM-Signal einer KE-Jetronic auszuwerten. Grundfrequenz < 500Hz Pegel: 0V=Lo 12V=Hi Tastverhältnis in 10% Schritten. Hardwaretechnisch sollte das ja kein Problem darstellen. Müsste also wohl auch ohne Interrupts funktionieren. Mir fallen nun zwei Möglichkeiten ein: 1. Ich triggere bei steigender und fallender Flanke und berechne immer die Zeit. Mit dem Anfang und Ende wird das aber u.U. schwer. 2. Ein Kondensator als Glättung und dann die Spannung am A/D Wandler abnehmen. Ist aufgrund der Trägheit evtl. nicht linear. Gibt es vielleicht sonst noch eine Möglichkeit, ein solches Signal digital auszuwerten (Oszi und der gleichen sind etwas umständlich und wohl auch überdimensioniert) Beste Grüße Mela
> 1. Ich triggere bei steigender und fallender Flanke und berechne immer > die Zeit. Mit dem Anfang und Ende wird das aber u.U. schwer. Du lässt den 16-Bit Timer 1 frei laufen. Flanken des Signals lösen dann einen IRQ aus und du liest schnell den Timer aus und setzt ihn wieder auf null. Läuft der Timer über, kannst du auch einen IRQ auslösen und somit feststellen, wenn das Signal nicht mehr anliegt.
Thomas Forster schrieb: > Du lässt den 16-Bit Timer 1 frei laufen. Flanken des Signals lösen dann > einen IRQ aus und du liest schnell den Timer aus und setzt ihn wieder > auf null. ne, dafür nimmt man lieber den Input Capture Modus. Dann steht der Timestamp in einem extra Register und man hat bis zur nächsten Flanke Zeit, ihn auszulesen. Gleichzeitig im Interrupt jeweils die auslösende Flanke ändern (fallend <-> steigend).
Also der Algorithmus wäre dann wie folgt: Loop: warten auf (1.) Flanke get time01 warten auf nächste (2.) Flanke get time02 warten auf nächste (3.) Flanke get time03 Periodendauer = time01-time03 Zustand01 = time01-time02 Zustand02 = time02-time03 Verhältnis = Zustand01/Zustand02 Ist das Sinnvoll? Grüße Mela
ATmela schrieb: > Also der Algorithmus wäre dann wie folgt: > > Loop: > > warten auf (1.) Flanke > get time01 > warten auf nächste (2.) Flanke > get time02 > warten auf nächste (3.) Flanke > get time03 > > Periodendauer = time01-time03 > Zustand01 = time01-time02 > Zustand02 = time02-time03 > > Verhältnis = Zustand01/Zustand02 > > Ist das Sinnvoll? Nein. In deiner Schleife hast du 3 Flanken detektiert. Eine ungerade Zahl. D.h. beim nächsten Durchlauf durch die Schleife misst du dann die Pulslücke und nicht den Puls aus. Grundsätzlich: Wenn dein µC nichts anderes zu tun hat als dieses hier, dann ja. Aber so komplex ist eine Interrupt Lösung dann auch wieder nicht. Befreit allerdings den µC vom ständigen Warten, sodass er nebenher auch noch andere Dinge machen kann. Zum Beispiel wirst du ja mit den ermittelten Werten auch irgendwas machen müssen. Und dafür muss dann ja auch noch Rechenzeit übrig bleiben. Zudem: bleiben die Pulse aus, dann wartet dein µC bis zum St. Nimmerleinstag auf eine Flanke, die nicht kommt. Aus all diesen Gründen ist eine Lösung, die auf 'Warten' beruht, meistens eine schlechte Lösung. Zumal die Alternative mit Interrupts auch nicht wesentlich komplizierter ist.
dazu gibts von Atmel übrigens auch eine wunderschöne Application note inkl. Programm: www.atmel.com/images/doc8014.pdf
Hallo zusammen, ich habe genau das gleiche vor und war echt froh, dieses Thread hier gefunden zu haben. Kleine Hintergrundinfo: Bei mir geht's um einen Mercedes M103 von 1991, dessen Motorsteuergerät Daten per PWM raushaut, laut Internetrecherche mit etwa 100Hz, mangels Oszi hab ich's aber nicht prüfen können. Mein Plan war es, mit Interrupts die Timestamps bei steigender/fallender Flanke zu speichern und mir daraus das Tastverhältnis zu berechnen und auf 'ne SD-Karte zu schreiben. Mein Problem gerade ist, dass der Schreibvorgang vermutlich recht lange brauch und ich in der Zwischenzeit einige Interrupts "verpassen" würde. Anstatt einzelne Timestamps zu benutzen, dachte ich an ein Array, das in der ISR befüllt und beim Schreiben auf die SD-Karte geleert wird. Allerdings bin ich unschlüssig, wie groß das Array sein muss, damit ich nicht auch noch Überläufe bedenken muss. Da ich wenig Erfahrung mit all dem habe, wäre ich echt froh, wenn das Thema hier weitergeführt würde (Wink mit dem Zaunpfahl an den Themenstarter). Danke und viele Grüße Marius
Und was machst Du/der uC dann damit wenn es erst mal auf der SD-Karte steht? Warum muss es überhaupt auf eine SD-Karte und nicht in ein kleines RAM/FLASH/FRAM? Man könnte evtl. auch über einen gewisse Zeit filtern und die Anzahl der Messwerte reduzieren!?
Es soll ein Datenlogger werden, d.h. rumfahren, SD-Karte raus, in den PC rein, auswerten. Wollte noch weitere Daten aufzeichnen, z.B. Drehzahl, Geschwindigkeit, Kühlwassertemperatur, etc. Wenn ich nur ein Messgerät haben will, mit dem ich den Fehlerspeicher akut auslesen kann, brauch ich natürlich keine SD-Karte. Viele Grüße
Ok, wenn Du einen Datenlogger willst dann schau dich doch mal hier um im Forum. Ich könnte wetten da gibt es nicht nur ein fertiges Projekt wo Daten (wo sie auch immer herkommen mögen) auf eine SD-Karte schreibt ;-) Dann brauchst Du Dich "nur noch" um die Erfassung der Daten und die richtige Formatierung dieser zu kümmern. Abhängig davon was Du nämlich alles Loggen möchtest (Anzahl Bytes) und mit was für einer Abtastrate berechnet sich nämlich Deine Datenrate was Dein Controller stemmen können muss.
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.