Go Down

Topic: ontime bei PWM messen (Read 1 time) previous topic - next topic

volvodani

Kann ich mit einem Artuino Interrupt eingang sowohl die steigende und die fallende Flanke auswerten.
Um bei einspritzdüsen die Ontime zumessen und zu einem Prozentualen verhältniss zu setzen.
Bei meinem Projekt geht es um einen Boostcontoller der soll jetzt erweitert werden um einen Eingang der das aktuelle Signal der Düsen auswertet und dann wenn man an 98% Ontime der Düsen ist den Ladedruck zurücknimmt. Hat jemand schon etwas in der richtung gabaut die maximale Frequenz liegt bei ca 200Hz (2Einspritzeiten pro Umdrehung max 6000 U/min).
danke für die Infos
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Udo Klein

Klar geht das. Guckst Du hier:

http://
http://www.arduino.cc/en/Reference/AttachInterrupt


Was die maximale Frequenz angeht: das hängt davon ab was Du im IRQ Handler so alles treibt. Ich habe hier einen sehr schlanken für mein Projekt und der läuft mit 10 kHz (und verbraucht dann aber auch schon satte 10% der Gesamtrechenleistung). Aber bei 200 Hz hast Du pro Periode 50000 Zyklen zur Verfügung, da kann man schon was rechnen.

Wenn Du statt den Arduino Libs direkt auf die Ports losgehts (Atmel Datenblatt beachten), dann kannst Du vermutlich sogar noch bei 100kHz (also 160 Zyklen pro Periode) noch was brauchbares machen.

Es ist also genug Luft da.

Andererseits: bei 200 Hz brauchst Du vermutlich überhaupt keine Interrupts. Da kannst Du auch Pollen. Daß Du den Arduino dann nicht schlafen schicken kannst sondern dauern Strom verbrauchst sollte ja kein Problem sein wenn das Ding im Auto läuft. Da sind die 100-200 mW ja wohl kein Problem.

Gruß, Udo
Check out my experiments http://blog.blinkenlight.net

Udo Klein

Nur so ein Gedanke: angenommen man bekommt die Signale auf einem Pin rein (und der Pin bleibt bei stehendem Motor auf low), dann könnte man ja grob so loslegen:

1) warten bis pin auf high geht
2) microsekunden Zähler auf merken (t0)
3) warten bis pin auf low geht
4) Zählerstand merken (t1)
5) warten bis pin auf high geht (oder t1-t0 > 1s)
6) Zählerstand merken t2
7) Verhältnis ausrechnen (t2-t1) zu (t1-t0) (bzw: bei Timeout von 5 Verhältnis auf 100% setzen); aufpassen, daß hier nicht durch 0 dividiert wird.
8) Bei Bedarf den Ladedruck runternehmen
9) wieder bei 1 weitermachen

Geht bei 200 Hz locker ohne Interrupts

Mikrosekunden liest man mit micros() aus.

Sollte nicht so schwierig sein :)
Check out my experiments http://blog.blinkenlight.net

volvodani

Genau wie in dem dritten Post wollte ich das machen und bei 6000 Zyklen pro sec. baruche ich mir ja dann keine Gedanken zu machen. Mit Interupts kann ich aber keine Zeiten messen da millis und micros laut refrence nicht mehr weiterlaufen sonmdern erst bei detach interupt. Aber ich werde es mal so versuchen ich brauche die Reglung sowieseo erst ab einer gewissen Last auf dem Motor die durch den Lufmassenmesser gemessen wird.
ICh werde berichten. Mien Project lief erst auf einem 2k9 Ardino wird jetzt aber auch ein Seeeduino Mega portiert da mehr I/O´s dig und Analog  vorhanden sind und ich weiterhin das NokiaLCD von Nuelectronics nutzten will.
So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

Udo Klein

Die laufen schon weiter, auch ohne detach. Sie laufen nur nicht weiter so lange Du in Deinem Interrupt bist. D.h. solange Deine Interrupts sehr schnell abgearbeitet werden kannst Du die schon nutzen.

Seeduino Mega ist eine gute Wahl :)
Check out my experiments http://blog.blinkenlight.net

Go Up