Archiv verlassen und diese Seite im Standarddesign anzeigen : 2 Vorgänge in Baskom bearbeiten.
wie würdet ihr vorgehen ?
Ich bekomme von den Zündgebern immer einen Impuls bei dem immer ein Int0 oder Int1 ausgelöst werden.
Die Interruptverarbeitung klappt soweit schon mal.
Nun müssen diese beiden Signale getrennt verarbeitet werden . Denk ich mal.
Der Zeitverlauf für den Linken und rechten Zylinder wird sicher unterschiedlich sein.(Gas weg genommen z.B.) Verarbeitet Bascom SUB's nebeneinander ? Glaub ich nicht oder ? Das Programm wird erst die eine SUB verarbeiten und dann die andere. Was passiert wenn die eine SUB abgearbeitet wird und ein Interrupt kommt . Hat der Interrupt vorrang ?
Warum ich das frage ?
Ich messe ja die Umlaufzeit für den linken Zylinder und diesen Wert verkürze ich auf die erforderlichen µsec für die Frühzündung wenn der linke Zylinder bei der nächsten Umdrehung richtung OT saust. Nur das Problem ist das der rechte da das selbe macht nur aben versetzt. Kann ja nicht aus der Bearbeitung des rechten rausspringen und den Funken für den linken auslösen und wieder zurück. Dabei geht Zeit verloren und dann passt nix mehr.
Der AVR tickert einen Befehl nach dem anderen runter, GLEICHZEITIG laufen nur die Hardware-Geräte (Timer, etc.).
Wenn die Interrupts enabled sind, haben sie absolut Vorrang.
Um was geht's ? Zündzeitpunkte etc. ? Für welche Drehzahlen ?
Zündung für ein Motorrad . 2-Zylinder
$regfile = "m8def.dat"
$crystal = 10000000
$baud = 9600
Ddrb = &B00000111
Portb = &B00000000
Ddrc = &B00000000
Portc = &B00000000
Ddrd = &B11110011
Portd = &B00001100
Dim A As Byte
Dim Pause As Integer
Dim Aus As Integer
Dim Dzmax As Integer
Pause = 100
Aus = 0
Dzmax = 10000 'Drehzahlbegrenzung
'Testrotine der Ausgänge
A = 0
While A <= 4
A = A + 1
Waitms Pause
Portb.0 = 1
Portb.1 = 0
Waitms Pause
Portb.0 = 0
Portb.1 = 1
Wend
Portb.0 = 1
'Zündung
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pind.2 = Input
Config Pind.3 = Input
Portd.2 = 1 'Pullup ein
Portd.3 = 1 'Pullup ein
On Int0 Int0serv
On Int1 Int1serv
Config Int0 = Falling 'Überprüfung ob der Pegel vom Geber fällt oder steigt....Falling!
Config Int1 = Falling
Enable Int0
Enable Int1
'Drehzahl
Config Timer1 = Timer , Prescale = 256
Const Timervorgabe = 3036
Const Markierungenproscheibe = 1
Dim Zaehlerirq0 As Long
Dim Impulseprosekunde As Long
Dim Impulseprominute As Long
Dim Umdrehungenprominute As Integer
Zaehlerirq0 = 0
On Timer1 Timer_irq
Enable Timer1
Enable Interrupts
'-------------------
Do
Portb.0 = 1
Portb.1 = 1
'Drehzahlüberwachung
Impulseprominute = Impulseprosekunde * 60
Umdrehungenprominute = Impulseprominute / Markierungenproscheibe
If Umdrehungenprominute > Dzmax Then
Disable Int1
Print "Drehzahlbegrenzung hat angesprochen"
Else
Enable Int1
End If
Select Case Umdrehungenprominute
Case 1000 To 1200 : Portb.2 = 1
Case Else : Portb.2 = 0
End Select
Impulseprominute = Impulseprosekunde * 60
Umdrehungenprominute = Impulseprominute / Markierungenproscheibe
Print "Umdreh. Min: " ; Umdrehungenprominute
Loop
'--------------------
'linker Zylinder
Int0serv:
Portb.0 = 0
waitms 50
Incr Zaehlerirq0
Enable Int0
Return
'rechter Zylinder
Int1serv:
Portb.1 = 0
Waitms 50
Enable Int1
Return
'Pro Sekunde ein Aufruf
Timer_irq:
Timer1 = Timervorgabe
Impulseprosekunde = Zaehlerirq0
Zaehlerirq0 = 0
Return
End
Wenn das Bike 5000 RpM dreht, macht er eine Umdrehung in 12 mS
also alle 24 mS eine Zündung.
Im Zünd-Interrupt hast du aber WaitmS 50 drinnen.
1. wozu
2. wie geht sich das alles aus ?
Die waitms 50 hab ich vorerst nur drinnen damit ich die Taster etwas entprellen kann . Die werde ich dann rausnehmen wenn die Software so läuft wie ich das mir denke.
2. wie geht sich das alles aus ?
Verstehe ich nicht ganz 8-[
Frage an dich ? Ist der Aufbau so vorerst i.O. ?
Ah so, du zündest noch mit der Hand.
Aber wirklich entprellen kannst du so nicht. das ist nur eine Bremse im Moment. na egal, kommt ja weg
iO Ich denk noch.
Für die doofen: Du kriegst bei jeder Umdrehung von der Zündung einen Impuls, einmal rechts, einmal links , du zählst aber nur die linken .
Jede sekunde rechnest du daraus RPM. Isses mehr als 10000, zeigst du "begrenzer" an und disablest InT1
Portb.0 u. 1 sind die tatsächlichen Zünder ?
d.h wenn du int1 disablest, fällt ein Zylinder aus.
Ist das so etwa der Gedankengang ?
Edit: Oder ist das ein Zweitakter ?
Genau wie du es sagst.
Portb.0 u. 1 sind die tatsächlichen Zünder.
Wenn über 10000U/min nehm ich den rechte Zylinder weg und hab somit meinen Drehzahlbegrenzer.
Portb.2 = 0 ist meine Leerlaufdrehzahlkontrolle weil ich keienn Drehzahlmesser drann habe. Vieleicht mach ich mir ein Display drann und kann so mehr Infos an den Lenker zaubern O:)
Für die Umdrehungsberechnugn sollte der linke Topf reichen. Die zusätzliche Überwachung des rechten Zylinders macht sicher keinen Sinn.
Wobei die Auflösung erhört würde. Alles dann aber durch 2.
Die frage ist nur wie ich die Zündzeitpunkte verschiebe.
Ich kann ja schlecht in :
'linker Zylinder
Int0serv:
Warte bis der Kolben wieder kommt und lass den Funken vorher kommen .... machen
Portb.0 = 0
Incr Zaehlerirq0
Enable Int0
Return
In der zwieschenzeit ist der rechte Kolben schon unterwegs aber ich sitze noch am linken fest. Bzw... der rechte Interrupt wurde ausgelöst und der linke bekommt somit keinen Funken.
Ich bin da echt am Überlegen ob ich nicht auf dem falschen Dampfer bin mit meinen Überlegungen.
Ach jetzt kommt es mir .....
Es gibt keine Überschneidungen.
Ich muss schauen auf wieviel Grad Vorzündung meine Geber am Motorrad angebracht sind.
Wenn die Geber z.b. 50° vor OT angebaut wären , hätte ich ja noch Zeit.
Dann kann bei jeden Int0serv: und Int1serv: die Zeit bis Ot reduzieren und würde somit auf die erforderlichen 10 - 40° Vorzündung kommen.
So hab mal versucht en Timer0 zum laufen zu bekommen.
Die Umdrehungszeit wird beim Int0 auf Null gesetzt.
$regfile = "m8def.dat"
$crystal = 10000000
$baud = 9600
Ddrb = &B00000111
Portb = &B00000000
Ddrc = &B00000000
Portc = &B00000000
Ddrd = &B11110011
Portd = &B00001100
Dim A As Byte
Dim Pause As Integer
Dim Aus As Integer
Dim Dzmax As Integer
Pause = 100
Aus = 0
Dzmax = 10000 'Drehzahlbegrenzung
'Testrotine der Ausgänge
A = 0
While A <= 4
A = A + 1
Waitms Pause
Portb.0 = 1
Portb.1 = 0
Waitms Pause
Portb.0 = 0
Portb.1 = 1
Wend
Portb.0 = 1
'Zündung
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pind.2 = Input
Config Pind.3 = Input
Portd.2 = 1 'Pullup ein
Portd.3 = 1 'Pullup ein
On Int0 Int0serv
On Int1 Int1serv
Config Int0 = Falling 'Überprüfung ob der Pegel vom Geber fällt oder steigt....Falling!
Config Int1 = Falling
Enable Int0
Enable Int1
'Drehzahl
Config Timer1 = Timer , Prescale = 256
Const Timervorgabe = 3036
Const Markierungenproscheibe = 1
Dim Zaehlerirq0 As Long
Dim Impulseprosekunde As Long
Dim Impulseprominute As Long
Dim Umdrehungenprominute As Integer
Zaehlerirq0 = 0
On Timer1 Timer_irq
Enable Timer1
'Umlaufzeit 1.Zylinder
Config Timer0 = Timer , Prescale = 1
Const Timervorgabe2 = 254
Dim Umtime As Word
Dim Um_irq As Long
Dim Zuenttime As Word
Dim Zuenttime2 As Word
On Timer0 Um_irq
Enable Timer0
Enable Interrupts
'-------------------
Do
Portb.0 = 1
Portb.1 = 1
'Drehzahlüberwachung
Impulseprominute = Impulseprosekunde * 60
Umdrehungenprominute = Impulseprominute / Markierungenproscheibe
If Umdrehungenprominute > Dzmax Then
Disable Int1
Print "Drehzahlbegrenzung hat angesprochen"
Else
Enable Int1
End If
Select Case Umdrehungenprominute
Case 1000 To 1200 : Portb.2 = 1
Case Else : Portb.2 = 0
End Select
Impulseprominute = Impulseprosekunde * 60
Umdrehungenprominute = Impulseprominute / Markierungenproscheibe
'Print "U/min " ; Umdrehungenprominute
Loop
'-------------------
'linker Zylinder
Int0serv:
Zuenttime = Umtime
Umtime = 0
Waitms Zuenttime
Zuenttime2 = Zuenttime
Portb.0 = 0
Incr Zaehlerirq0
Enable Int0
Return
'rechter Zylinder
Int1serv:
Waitms Zuenttime2
Portb.1 = 0
Enable Int1
Return
'Umlaufzeit ermitteln
Um_irq:
Timer0 = Timervorgabe2
Incr Umtime
Print "Zeit" ; Umtime
Return
'Pro Sekunde ein Aufruf
Timer_irq:
Timer1 = Timervorgabe
Impulseprosekunde = Zaehlerirq0
Zaehlerirq0 = 0
Return
Kommt mir so vor als ob Timer0 nicht die 0,1µs bringt.
Der Zähler steigt zu wenig in Incr Umtime.
Muss noch mal nachrechen mit der Umlaufzeit und dem zurücksetzen von Umtime auf 0.
Puhh das wird doch wohl nicht werden ? :-#
Ich hab mal ne Log mitgeschrieben.
U/min 840------------Zeit 4873
U/min 1380-----------Zeit 2420
U/min 2040-----------Zeit 2116
Habs noch nicht ausgerechent. Die Umlaufzeit reduziert sich mit steigender Umdrehung des Motors. Meine Hand ist immer noch der Geber [-X
Aber es schaut schon mal gut aus.
Hallo,
Ich habe jetzt nicht alles im Detail gelesen. Es interessiert mich aber, weil ich was Ähnliches geplant habe.
Was ich jetzt nicht so gut finde, um nicht zusagen sehr schlecht, ist daß Du für den Drehzahlbegrenzer die Zündung von einen Zylinder abschalten willst. Die Zündung abschalten ist nie eine gute Lösung.
Warum?
Wenn zB bei Bergabfahrt der Motor seine Drehzahl beibehält, (was ja durch den noch arbeiteten Zylinder noch begünstigt wird) dann wird die ganze Zeit Benzin von diesem Zylinder angesaugt, und unverbrannt in den Auspuff befördert. Dort wird der Benzin von dem noch arbeiteten Zylinder verbrannt, und der Auspuff sich ziemlich stark erhitzt.. Wenn du jetzt einen Katalysator hättest, währe das das ende des Katalysator. Selbst ein Auto mit Kat. konnte dadurch in Flammen aufgehen, was ich schon bei fehlender Zündung erlebt habe.
Wenn du jetzt beide Zylinder abschaltest, wird zwar die Drehzahl schneller sinken, aber dann wir das Benzine der beiden Zylinder in den Auspuff befördert. Bei wieder einschalten der Zündung, je nachdem wie lange die Zündung abgeschaltet war, wird es einen schönen Knall geben, und unter Umständen dir sogar der Auspuff um die Ohren fliegen.
Wenn du schon eine Drehzahlbegrenzung einbauen willst, müßtest du die Benzinzufuhr unterbrechen. Was aber bei einem Vergasermotor auch wiederum nicht so funktioniert. Weil im Schimmergehäuse vom Vergaser immer noch eine menge Benzin ist, und so der Motor nicht gleich abschalten würde.
Früher als die Autos noch alle mit Vergaser ausgestattet waren, haben wir uns einen Spaß daraus gemach die Leute auf der Straße zu erschrecken. Bei Bergabfahrt haben wir einfach die Zündung abgeschaltet, und nach kurzer Zeit wieder eingeschaltet. Das gab dann einen schonen Knall. Einige mit altem Auspuff, oder die die es übertrieben haben, könnten die Teile vom Auspuff dann auf der Straße aufsammeln.
So viel zur Zündabschaltung.
mfg
guy
Da geb ich dir recht. Nur wie willst du das anders machen .
Wenn du 10000U/min beim beschleunigen aufdrehst und die Drehzahl bricht dann weg , nimmst du automatisch das Gas weg und schaltest.....
Bergab mit 10000U/min ? Das gibt Schmerzen. Wenn du den Vergaser zu machst , kommt relativ wenig Gemisch in die Auspuffanlage.
Es handelt sich hier um eien Yamaha XS400 Bj.1983 Und da werden die TCI's rar.
Da hatte ich es mit meiner Shadow leichter. Da mußt ich immer dann, wenn die Zahnfüllungen vibrierten, raufschalten. Das konnt' man nicht übersehen.
Da geb ich dir recht. Nur wie willst du das anders machen .
Es gibt leider keine optimale Lösung, außer bei Elektronischereinspritzung. Was auch der Grund ist warum man sonst nie einen Drehzahlbegrenzer eingebaut hat. Ich habe das bis jetzt nur auf einer Feuerwehrpumpe gesehen. Da war im Verteiler so ein Hebel der mit der Fliehkraft die Zündung abstellte.
Aber man muß sich mal die Frage stellen, ob man das überhaupt braucht. Eine einfache Schaltlampe reicht normalerweise aus. Außerdem überdreht man einen Motor meisten nur beim runter Schallten.
Das könnte besser sein für die Füllung :-)
Die XS400 ist auch ein Twin und der rappel auch gut.
Mein Timer0 passt noch nicht ganz.
Der Timer 0 zählt immer bis 255.
100000Hz/1 Und als vorlage 254 sind doch 0,1µsec. Oder ?
Vieleicht passt auch die umdrehungsberechnung nicht.
Jedenfalls passen die Werte zueinander nicht.
U/min 1320 Umlaufzeit 1537µsec ? Kann nicht sein.
Bei U/min 1300 sollten es 46154 . Umlaufzeit =46,2msec.
8-[
@Guy ..... Schaltblitz könnte man ja ansteuern.
Für die Drehzahl und Umlaufzeitberechnung hab ich mir im Linux einen Tabelle aufgebaut (Excel) .
10000000 Hz
Prescale 1
Timervorgabe 255
sollten 0,1µsec sein.
Mit dem Timer werd ich noch blöde.
Der Timer-Interrupt wird nur ausgelöst wenn beim Timer0 die 255 voll sind richtig ? Weil die Timervorgabe voll ist (naja nicht ganz 0-255=256) Wird der interrupt sofort ausgelöst.
Sagt jetzt blos nicht ich lieg immer noch falsch ](*,) ](*,)
.............................
Timer1 und Timer0 passen absolut nicht zusammen
Wenn Timer1 aller 1sec. ausgelöst wird und Timer0 bei diesen Timer1 auf 0 gesetzt wird aber vorher ausgedruckt wird ....62079 ? :-s
Werner_Just
04.10.2005, 11:17
Hallo,
ich hab den Thread nur überflogen, aber ein paar Anmerkungen möchte ich doch machen.
Zum Drehzahlbegrenzer...
Warum die Drehzahlbegrenzung nicht über die Frühverstellung realisieren?
Frühzündung ab 9500 U/min wieder leicht zurück nehmen -> der Motor verliert an Leistung und dreht nicht mehr höher.
Zur Realisierung:
Mit Timer 0 (8bit) kommst Du imo nicht weit. Benutzt Du Timer0 um die Umlaufzeit zu berechnen, handelst Du Dir alle 256 Takte einen Interruptaufruf ein, der erstmal 29 Register sichert und nachher wieder restauriert. Von den 256 Takten werden so alleine 116 'verbraten', also fast 50% Deiner gesammten Rechenleistung. Du kannst das zwar mit Nosave tunen, aber dann must Du höllisch aufpassen welche Register Du verwendest und die dann von Hand sichern.
Umdrehungszeitmessung und Zündpostitionsbestimmung lassen sich aber mit Timer1 erschlagen.
Vorgehen:
Timer1 als freilaufender Timer
Umdrehungsimpuls liest Timer 1
U_Time = Timer1_neu - Timer1_alt
Timer1_neu = Timer1_alt
Dann bestimmst Du die Werte für die Zündzeidpunkte und schiebst sie in die Timer1 OutputCompareRegister. Praktischerweise hat der Mega8 derer 2, für jeden Zylinder eines.
Dann brauchst Du imo zusätzlich noch eine Ladezeit für die Zündspule, oder aber Du lässt die Zündspulen immer eingeschaltet, dann frisst Deine Zündung aber unmengen von Strom.
Ciao,
Werner
Ich will nix schlecht machen, aber ich bin mit der Drehzahlbegrenzung sehr skeptisch. Es soll ja kein Tempomat oder Pit-lane-Limiter sein, sondern eine Sicherung.
Wie ja schon gesagt wurde, es überdreht der Biker am ehesten beim Runterschalten. Da nutzt ihm aber die Zündungverstellung/abdrehen absolut NULL, höchstens die Kupplung und etwas Geschick, überhaupt im Sattel und auf der Straße zu bleiben.
Sonst kommt's natürlich auf's Bike an. Trotzdem würd ich sagen, eine Anzeige reicht, es läßt ja auch vorm Überdrehen die Beschleunigung nach. Wer das nicht ohnehin merkt, hat auch andere Probleme
Und bergab im höchsten Gang überdrehen ? da fährst du ja 200 und aufwärts, je nachdem. Da sollte das Bike lieber kein Eigenleben entwickeln.
Bleibt eine hübsche Drehzahlmessung mit Display. Na, ist doch auch was, oder ?
(wie ist denn das mit dem TÜV bei irgendwelchen Drehzahlbegrenzern ?)
Also wenn du jeden 2en Takt in den Timer-Interrupt von Timer0 springst, bleibt nicht mehr viel Zeit für andre Sahen. Anders gesagt so kann das nicht klappen.
Aber jetzt mal zum eigentlichen Prinzip.
Wenn ich das richtig sehe, hast du zwei Geber vorgesehen. Einen für Zylinder 1,und einen für Zylinder 2. Die sind nehme ich mal an, um 180Grad versetzt.
Ich würde es so versuchen
Do
Geber 1 = H
Timer1 auslesen.
Timer1 auf null setzen.
Verzögerung für zünden von Zylinder2 ausrechnen (je höher die Drehzahl desto kürzer die Verzögerungszeit)
Timer0 starten
Timer0 Vorgabe für die Zeit zum zünden von Zylinder 2
Das selbe mit Geber2 für Zylinder 1
Geber 2 = H
Timer1 auslesen.
Timer1 auf null setzen.
Verzögerung für zünden von Zylinder1 ausrechnen (je höher die Drehzahl desto kürzer die Verzögerungszeit)
Timer0 starten
Timer0 Vorgabe für die Zeit zum zünden von Zylinder 1
Loop
Wenn du jetzt noch mehr vor Zündung bei höher Drehzahl haben willst, mußt du die Verzögerung noch verkürzen. Um es optimal zumachen müßtest du auch die Drosselklappenstellung abfragen, und dem entsprechen die Zündung auch vor oder zurück stellen. Noch ein Klopfgeber und es währe perfekt.
mfg
Guy
edit:
@Werner
Dein Vorschlag ist nicht schlecht. Nur du mußt mit zwei Gebern arbeiten. Weil du sonst nicht weist ob der erste oder zweite Zylinder zünden soll. Denn bei zwei Zylinder kannst die nicht gleichzeitig zünden weil bei OT vom ersten Zylinder der zweite schon Benzingemisch angesaugt hat.
Bei einem 4 Zylinder mit Zündfolge 1/3/4/2 kannst du 1 und 4 und 3und 2 gleichzeitig zünden.
(wie ist denn das mit dem TÜV bei irgendwelchen Drehzahlbegrenzern ?)
TÜV ist eine Sache, aber wie sieht es mit Fahrsicherheit aus.
Bekanntlich hat ein freikaufendes Rad ja am meisten Haftung. Wenn du jetzt im Grenzbereich in einer Kurve den Motor abstellst kommt das einem leichten Bremsen gleich, und das Hinterrad konnte rutschen.
Wenn du mal die Zündung fertig hast, könnest du eventuell bei zu hoher Drehzahl versuchen ab und zu ein oder zwei Zündungen auszulassen. Das würde glaube ich keine Probleme machen.
Werner_Just
04.10.2005, 14:33
Hallo Guy,
Bekanntlich hat ein freikaufendes Rad ja am meisten Haftung. Wenn du jetzt im Grenzbereich in einer Kurve den Motor abstellst kommt das einem leichten Bremsen gleich, und das Hinterrad konnte rutschen.
und in China könnte ein Sack Reis umfallen.
Im 1 Gang bei extremer lansamfahrt könnten Zündaussetzer vielleicht etwas unangenehm werden, aber im 3 Gang oder höher merkst Du sie nichtmal. Du fragst Dich nur warum das Bike nicht mehr zieht.
Abgesehen davon, wenn man Kurven mit Drehzahlen in der Nähe des Drehzahlbegrenzers fährt, dann hat man ganz andere Sorgen als das das Hinterrad aufgrund von Zündaussetzern rutschen könnte.
Ciao,
Werner
Erst mal Danke für eure Tips und Anmerkungen.
Ich hab jetzt ein Display an mein MyAVR gekauft.
Mit den Timern werd ich den Rat mal befolgen und die Sache Umschreiben.
Ich denke es muss sowieso ein Unterdruckgeber in den Ansaugstutzen. Dann kann man den Zündbereich zusätzlich für Astbetreib regeln.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.