Forum: Mikrocontroller und Digitale Elektronik Tastverhältnis mit ATmega oder PC-Schnittstelle messen (C)


von ATmela (Gast)


Lesenswert?

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

von Thomas F. (igel)


Lesenswert?

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

von chris (Gast)


Lesenswert?

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

von ATmela (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von chris (Gast)


Lesenswert?

dazu gibts von Atmel übrigens auch eine wunderschöne Application note 
inkl. Programm:

www.atmel.com/images/doc8014.pdf

von Wayne183 (Gast)


Lesenswert?

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

von Frank (Gast)


Lesenswert?

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

von Wayne183 (Gast)


Lesenswert?

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

von Frank (Gast)


Lesenswert?

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