Hallo,
ich habe eine Motorsense und eine Motorsäge. Beide mit einem Zweitakt Benzinmotor angetrieben. Die sind schon in die Jahre gekommen und nach einem Membran- und Dichtungstausch im Vergaser möchte ich die nun wieder einstellen bzw Einstellung kontrollieren.
Das geht für den Leerlauf indem man mit der L Schraube auf maximale Drehzahl im Leerlauf einstellt und dann das Gemisch noch eine Idee fetter einstellt. Mit Standgasschraube die Drehzahl senken bis auskuppeln plus Sicherheitsabstand. Problem ist die Maximaldrehzahl bei Vollgas richtig einzustellen. Dazu bräuchte man eigentlich einen Drehzahlmesser. Die sind heute gar nicht mehr so teuer aber warum nicht selber bauen?
Im Mikrocontroller.net fand ich eine Schaltung zur einfachen Zündimpulsabnahme mit einem Draht vom Zündkabel: https://www.mikrocontroller.net/topic/81838#685809
Nachgebaut (27k an Pin 12 gegen 47k getauscht und um eine Zenerdiode an Pin 8 erweitert -> mein Meßbereich damit 1000Upm bis ca. 17000Upm - 2700min bis 13500max benötigt) und zur Berechnung der Drehzahl einen ATtiny2313 über einen 1k Widerstand an Pin 3 des (TC)4093 angschlossen. Es soll später noch eine Siebensegmentanzeige angeschlossen werden. In der Testphase sende ich die gemessene Drehzahl über RS232 an einen PC.
Funktioniert soweit ABER die gemessenen Werte schwanken doch relativ stark um den angepeilten einzustellenden Wert. Bei einer neuen Maschine, noch vom Werk eingestellt auf hoffentlich auf 2700Upm messe ich zB 2500 bis 3100Upm. Das ist mir deutlich zu unruhig und kann damit keine befriedigende Einstellung vornehmen.
Blauäugig hatte ich zunächst per ICP mit dem, mit 1MHz laufenden 16Bit Timer die Zeit zwischen den Zündimpulsen auf 1µs genau gemessen, Drehzahl auf eine Minute hochgerechnet (Upm=60000000/Meßwert in µs) und die zur Displayupdatezeit (jede 1/2 Sekunde) den gerade aktuellen Wert angezeigt: Sehr, sehr unruhige Anzeige
Nach ein paar Versuchen die angezeigte Drehzahl ruhiger zu bekommen, zB auch mit Zählung der Zündimpulse innerhalb einer feste Torzeit von zB einer Sekunde, bin ich nun bei folgender Lösung angelangt:
Displayupdate von etwas über einer Sekunde. Innerhalb dieser Sekunde werden die Zeiten zwischen den Zündimpulsen per ICP gemessen und aufaddiert. Mit der Anzahl der aufgetretenen ICP-Interrupts (Anzahl der Zünimpulse) wird dann der einfache Mittelwert ausgerechnet und zu Anzeige gebracht. Zu Beginn des nächsten Anzeigeintervalls sind alle Meßwerte gelöscht und es beginnt eine komplett neue Drehzahlmessung und Berechnung. Probeweise ist da noch eine SW-Hysterese aktiv, die eine veränderte Drehzahl von einer zur anderen Sekunde nur anzeigt, wenn sich der Wert um 10Upm gegenüber der vorherigen geändert hat.
Das Ganze ist mir aber immer noch zu unruhig. Nach vielen Versuchen mit der Abnahme des Zündimpulses würde ich ein Problem dort fast ausschließen. Timingfehler im Programm auch, da mit Frequenzgenerator überprüft und dort im Bereich von 1000Upm bis 16000Upm stabile Werte angezeigt werden. Die Motoren laufen im Leerlauf leicht unruhig (mit Oszi den Zündimpuls beobachtet) und mit der Messung über Sekundenintervalle auf Umdrehungen pro Minute umzurechnen erkläre ich mir die unruhige Anzeige des Drehzahlmessers.
So, Luftholen für die Fragen nach dem vielen Text:
Wie krieg ich eine ruhige aber doch aktuelle Anzeige für eine Vergasereinstellung hin? Wie wird das bei den professionellen Drehzahlmessern gemacht? Wird da einfach über einen größeren Zeitraum gemittelt und/oder Ausreißer ignoriert? Hat jemand konkrete Werte dazu?
Gruß
Searcher
gegenwärtiges Testprogramm:
Code:$regfile = "ATtiny2313.DAT" $framesize = 24 $swstack = 24 $hwstack = 34 $crystal = 8000000 $baud = 57600 $lib "mcsbyteint.lbx" Dim Icr_new As Word Dim Icr_old As Word Dim Icr_difference As Word Dim Upmd As Dword Dim Upm As Word Dim Tov_count As Byte Dim Accumul_difference As Dword Dim Averaged_ign_time As Dword Dim Icp_events As Word Dim Icp_alive As Byte Dim Upm_o As Word 'Upm old Dim Upm_h As Integer 'Upm Hysteresis Print "Drehzahlmessung Upm" Tccr1b = Bits(cs11 , Ices1) 'prescaler = 8, 1µs timer steps, icp event on rising edge On Timer1 Update_display 'timer1 overflow Enable Timer1 On Icp1 Get_icr 'ignition spark occured Enable Icp1 Enable Interrupts Do Loop Get_icr: Icr_new = Icr1 Icr_difference = Icr_new - Icr_old Icr_old = Icr_new Accumul_difference = Accumul_difference + Icr_difference Incr Icp_events Icp_alive = 1 Return Update_display: Incr Tov_count If Tov_count = 15 Then '15 makes about 1s display interval Averaged_ign_time = Accumul_difference / Icp_events Upmd = 60000000 / Averaged_ign_time 'Icr_difference Upm_h = Upmd - Upm_o If Abs(upm_h) > 10 Then 'SW-hysteresis Upm_o = Upmd If Icp_alive = 0 Then Upm_o = 0 'no ignition detected -> Upm=0 Print " " ; Chr(13) ; Upm_o ; Chr(13); End If Accumul_difference = 0 Tov_count = 0 Icp_events = 0 Icp_alive = 0 End If Return







Hoffentlich liegt das Ziel auch am Weg
Zitieren

Lesezeichen