Hallo, ich benutze eine 90S8535 und möchte ein Kennfeld(Drehzahl u. Last) ablegen in dem alle 6µSek ein 8Bit Wert (aus 700 8Bit Werten) ausgelesen werden soll. Ist der interne Epprom schnell genug oder muss es über einen externen Speicher laufen? Wenn die Daten im EPPROM sind und ich den Saft abschalte und wieder einschalte sind doch sämtliche Daten noch da oder nicht? Angenommen am Port D wird der Wert 00001010(10) eingelesen und soll als 1000 U/Min intepretiert werden. Am Port C wird der Wert 1100100(100) eingelesen (100%Last) Mit diesen beiden Werten soll also ne bestimmte Adresse im Epprom angesprungen und ausgelsen werden. Aber wie soll ich das machen? Hab mir gedacht 10 + 100=10100 also könnte ich das ja als Adresse nehmen oder seht ihr das anderst. Wie sieht der Adressbereich aus? Von wo bis wo?
6 µsek??? Die Schreibzeit des internen EEPROM beträgt bei 5V VCC typischerweise 2.5ms. Das lesen sollte schneller sein, aber 6 µsek wird es wohl deutlich überschreiten.
So eine Tabelle ist doch im Flash-Rom bestens aufgehoben, wozu das EEPROM verwenden? Schau dir mal die Assemblerdirektive ".db" und den Befehl "lpm" an. MfG Andreas
Hallo, ja ich dachte das ein AVR das meiste in 125 nSek machen sollte. Das Schreiben wäre eigentlich wurscht weil ich das vor dem eigentlichen Programm ausführen lassen sollte. Aber das lesen muss doch irgendwie schneller gehen. Habe ein ca. 100 Seiten starkes Datenblatt vor mir liegen und am Schluß ist das Instruction Set Summary warscheinlich ist das eine Befehlszusammenfassung aber lpm taucht dort nicht auf. Kenne das aber vom x86 Assembler. Meint ihr das es mit einem externen Baustein gehen könnte? Habe gerade gelesen das der 8535 sowieso nur 512 Byte EPPROM hat und ich mind. 700 bräuchte. Kann man aus dem Flash schneller lesen das sollte doch eigentlich in ein paar taktzyklen erledigt sein oder?
EEPROM-Zugriff ist zu langsam. Versuchs mit dem Flash, so wie Andreas es vorgeschlagen hat. Lade dir von Atmel doch mal das InstructionSet (also die reine Befehlserklärung - nicht das Datenblatt vom µC)
Hi Wiso ist EEProm lesen langsam? Dauert 2 Taktzyklen. Du mußt allerdings erst die Adresse schreiben dann "lesen Bit" setzen und wenn das Bit auf 0 ist Daten lesen bei 125ns Takt schaffe ich das in 750 ns. Gruß Uwe
@Uwe Hallo, das dachte ich mir doch. Wie gesagt das schreiben ist nebensächlich da wenn ich 512 Bytes schreibe und pro Byte dauert es 2,5 mSek, dann hab ich das nach spätestens 2 Sek fertig(inkl. Befehle) und kann das eigentliche Programm starten. Kannst du mir noch nen Tip geben wie ich das ganze so verknüpfe das ich mir genau das hole was ich brauche. Epprom fängt ja bei $000 an und hört bei $1FF auf. Ich denke mir das ich z.B. $107 z.B. für Drehzahl=1000 und 7=Last 70% nehme. $125 z.B Drehzahl=1200 und Last=50. Oder würdet ihr das anderst machen. Jetzt kommt aber ne weitere Frage auf da ich eigentlich ein Newbie in Sachen AVR bin. Wie verbinde ich 2 Register mit einander im einen steht 10 und im anderem 7, daraus soll 107 werden. Es sollte doch bestimmt mir wenigen Befehlen machbar sein da ich sowieso nicht viel Leerlauf habe und das ganze fast ohne Interuppt mache. Bei Reichelt hab ich mir mal die Daten für externes Epprom angeschaut. Die Zugriffszeiten liegen bei ca. 50-150 nSek.
das eeprom kannst du ja gleich beim flashen mitprogrammieren... wie das adressiert wird steht im datasheet (ist echt mal ein blick wert :-) Jonas
Hallo, also ich hab jetzt etwas mit lmp und .db rumbrobiert. Kann auch schon in die Entsprechende Tabelle springen siehe Anhang, das Programm sucht sich den Wert 9 raus und gibt ihn aus. Aber wie erreiche ich die 6 gibt es da einen 2ten Pointer? Und wo landet der Wert nach lpm zuerst? In Temp? Dann könnte ich ja "mov temp,zeichen" weglassen und gleich "out pinb,temp" schreiben oder? Und wofür steht in dieser Zeile "ldi ZL,Low(Last10*2)" das "*2"? Also Danke schon mal im Vorraus.
also wenn ich dich richtig verstehe, willst du eine art tabelle haben, die du per zeile und spalte angibst... dabei reihst du einfach die zeilen aneinander. wenn du dann den 3. wert in der 4. zeile haben willst, dann ist der offset: offset = 4*(zeilenlänge)+3 is also recht einfach.
Hallo, offset = 4*(zeilenlänge)+3? wie hat das konkret als ldi... auszusehen? in meinem Prog landet die Daten in R16. Warscheinlich weil ich nur R16 habe oder?
naja, da musst du dann rechnen (lassen). vielleicht in ner schleife die addresse (im Z pointer) <zeile> mal um <zeilenlänge> erhöhen, danach noch um <spalte> erhöhen, schon haste die adresse für ldi :-)
Hallo, hast du vielleicht ein kleines Beispiel, habe gedacht das ich ohne Schleife auskomme sondern irgendwie direkt hinkomme. Angenomen in R15=Drehzahl steht 3, dann will ich an das Dritte Zeichen kommen die verschiedenen Zeilen kann ich schon auswählen.
sei doch selbst mal kreativ! :-) wie, du kannst die zeilen schon auswählen??? die schleife dient nur der multiplikation...
Hallo, ich versuche selbst kreativ zu sein. Aber habe noch keinen Plan, weiß ja nicht mal was ich hier ldi ZL,Low(Last10*2) ldi ZH,High(Last10*2) ändern muss um einen anderen Wert zu bekommen. Wenn ich Last10 in Last20 ändere dann wird die letzte Tabelle ausgesucht und ich erhalte den ersten Wert. Z ist anscheinend der Pointer für hoch runter aber welcher ist für rechts links? Kennt vielleicht irgendjemand ein Listing wo man erkennt wies funktioniert.
Hallo, ich glaube ich habs gefunden. ADD ZL,R16 BRCC NixUeberlauf ;Macht weiter wenn es keinen Überlauf gibt INC ZH ;hier gehts bei Überlauf weiter und dann kann ich wieder lpm ausführen. Verstehe nicht warum manche Leute so misstrauisch sind und denken das man nichts selber programmieren will. In den Forum wo ich Ahnung habe versuche ich doch auch zu helfen.
so hab ich das ja nicht gemeint... zum Z-Pointer steht recht viel in den data sheets und im AVR assembler handbuch (gibts auch als pdf von AVR). der Z-Pointer zeigt auf eine adresse im Flash. hierbei gibt es eigentlich nur eine "einteilung". der flash ist ja linear angeordnet. zeilen und spalten gibt es also nur virtuell. zeile1: .db <daten der 1. zeile> zeile2: .db <daten der 2. zeile> zeile3: .db <daten der 3. zeile> die daten stehen im flash nun direkt hintereinander: <daten der 1. zeile><daten der 2. zeile><daten der 3. zeile> addressieren kannst du dann also auch direkt von der 1.zeile und addierst dann x mal die zeilenlänge wenn du in zeile x willst, plus y für die y. spalte. machts nun sinn?
Hallo, das ist mir verständlich das alles hintereinander im Flash ist. Habe das ganze mit einer einfachen addition gelöst. Werde das mal als Anhang mitschicken. Statt >ldi temp,3 >add zl,temp kann man auch adiw zl,3 schreiben dadurch wird zur Standart 1 3 dazuaddiert und der 4te Wert aus der Zeile Last10 ausgelesen weil der Z-Pointer mit ldi ZL,Low(Last10*2) ldi ZH,High(Last10*2) geladen wurde. Kann man statt Last10 auch 1,2 o. 3 reinschreiben und wofür steht die 2 da? Also ich komme immer mehr dahinter. Die 2 PDF Dateien hab ich auch ausgedruckt vor mir liegen.
meinst du die *2? du musst die adressen jeweils mit 2 multiplizieren (geht auch mit <<1), da der flash in WORDS und nicht in Bytes organisiert ist.
Hi, Ausgeben solltest du aber an PortB, nicht PinB. Gruß Uwe
Hallo, das hab ich mir auch gedacht so hab ich es aber in einem anderen Programm gesehen und im AVR-Studio wird die Ausgabe auch richtig angezeigt. Mit PinB ist warscheinlich das gleiche gemeint wie PortB sonst müsste es doch PinB3 heißen oder?
nein, das sind zwei verschiedene adressen im port file. pinb ist der eingang, portb der ausgang. so sind die auch zu benutzen!
Hallo nochmal, welchen Speichertyp kann ich den an den Controller anschließen ohne ihn brennen zu müssen. Habe was von SRAM gelesen. Wird der beim flashen mit beschrieben o. muss ich die Daten an den Anfang des Programms schreiben um damit vor dem eigentlichen Start die Daten ins SRAM schreiben. Es ist doch ein Paraleller speicher o. läuft das alles seriell? Gibt es Bausteine womit ich über eine Steuerleitung zw. 2 8Bit-Leitungen Wechseln kann?
also nen sram is komplett doof, wenn der anfangs initialisiert werden muss. dann kannste die daten auch im flash lassen und von dort lesen... es muss also, wenn der speicher konstanten (also quasie eine tabelle) enthalten soll, ein nichtflüchtiger sein, damit's sinn macht.
Hallo, hab mir das noch mal durch denn Kopf gehen lassen. 6µSek dauert es ca. bis 1° durchläuft. Der Zündabstand ist aber 90° was bei einer Vorzündung von 30° und einer darauffolgenden Vorzündung von 10° ein Zündabstand von 70° ergibt. Also habe ich eigentlich 70 x 6µSek Zeit=420µSek wo ich meine Berechnungen usw. durchführen lassen kann. Das wären dann bei 125 nSek /Befehl=ca. 3300 Befehle. Das sollte also reichen jetzt kommt mir allerdings die Idee das ich die Kennfelder auch lernbar gestalten könnte. Damit nicht immer Lamda1 nachgeregelt werden muss sondern schon einigermaßen zutrifft. Was sollte ich da für Speicher nemmen? Was bedeutet die Zugriffszeit? Ist das die Zeit die zw. 2 Auslesevorgängen pausiert werden muss oder ist das die Zeit in der ich nach einer Anforderung den Wert erhalte. In dem Buch AVR-Mikrocontroller-Praxis hab ich gelesen das 60 Kbyte externes SRAM angeprochen werden können. Außerdem könnte ich den SRAM Baustein mittels einer ständig angelegten Versorgungsspannung versorgen und zur Sicherheit noch mit einem Goldcap puffern. Also Danke nochmals für die Mühe
warum nimmste nicht den flash? selbst das eeprom kommt mittlerweile ja in frage.
Hallo, also das Epprom ist ja mit seinen 2,5mSek beim Schreiben zu langsam. Das eprom kann ich doch so beschreiben oder? .Eseg Tabelle .db 45,32,31,30 dann wird es doch beim flashen reingeschrieben oder verwechsle ich das und ist flashen(Programmdraufspiele) ganz was anderes
nein, so gehts! evtl. legt der assembler das eeprom dann in eine extra datei.
Hi, EEProm schreiben dauert zwar 2,5ms aber du kannst doch in der zwischenzeit was anderes machen. 2,5ms ist doch nur für weitere Byt's von Interresse. Übrigens brauchst du nur das Schreibbit abfragen und du weisst ob du das nächste Byte brennen kannst. Gruß Uwe
Hallo, also angenommen die Lamdasonde meldet das gemisch ist zu fett also muß ich den Wert im Epprom ändern. Also hab ich dazu 420µSek da ja dann ner nächste Zyklus läuft und die Lamdasonde wieder sagt "zu fett" und ich muss den Wert wieder decrementiert im Epprom speichern. Aber das muss ja in Echtzeit ablaufen, kanns ja nicht in ne Warteschleife legen da die irgendwann überläuft. Ne andere Lösung wäre das ich pro Zylinder einen eigenen Controller nehme und dadurch 4mal mehr Zeit habe. Aber es eilt ja nicht. Werde mich noch ne weile mit Assemblertexten rumschlagen um gute Routinen rauszusuchen. Werd mich jetzt mal mit der Stromversorgung des Controllers beschäftigen da es ja im Auto ganz schön stört.
Hallo Thomas Das EEPROM kann man nur ca 100.000 mal beschreiben Dann wirds langsam kritisch. Normalerweise legt man ins EEPROM die Grunddaten ab Die dann ins SRAM kopiert werden SRAM lesen/schreiben 2 Tackte Phagsae
Hallo, ich will mir ein Einspritz/Zündsystem fürs Auto bauen mit Ladedruckregelung, Wassereinspritzung, Lamdaregelung...
konkret krass Wassereinspritzung Das dehnt sich ja um den Faktor 1200 aus, gell ? hmm ... das sind dann bei ner 4,8 LiterMaschiene mit 8Zylindern nur 0,5ml/Zylinder um alles in die Luft zu sprengen :-) da brauchst Du aber nen stabilen Motorblock, ne assi Kopfdichtung und mal lieber "zu kleine" Kolben, viel Öl, und mit der Kühlung isses net ganz so schlimm, weil das Wasser Dir super viel Wärme aufnimmt. und immer schön langsam Was ist das denn für ein Auto ? jo Axel
wie jetzt, das hab ich nicht gerallt... das benzin mit wasser mischen???
Hallo, ja das ist so um so höher man auflädt desto höher ist die Temperatur der Ladeluft und der Verbrennungsvorgang selbst. Dadurch das man Wasser einspritz wird der Brennraum gekühlt dadurch kann man noch höher aufladen und läuft nicht gleich Gefahr den Block durch Klopfen zu töten. Man kann ca. 10° mehr Vorzündung fahren. Oder läßt es so wie es ist und hat noch ein paar extra Reserven. Bei normalen Motoren wird bei höheren Drehzahl einfach angefettet (mehr Benzin) dadurch steigt natürlich auch der Verbrauch. Wenn man aber noch nen extra Wassertank spazieren fährt kann man halt auch etwas Benzinsparen. Saab hat das früher mit der Wassereinspritzung praktiziert. Wurde auch in der Formel1 verwenden bis es verboten wurde. Ist ein komplett neu aufgebauter Opel-Motor 1,8Liter, extrem kurzhubig, Stahlpleuel, Schmiedekolben, nitrierte Kurbelwelle... nur leider hab ich eine mechanische Zündverstellung und da läßt sich nicht umprogrammieren.
kleiner Nachtrag, soll jetzt in einem Ascona C eingetragen werden und später mal in einen leergeräumten Corsa A wandern der nicht besonders schwer sein darf.
Hallo Thomas, ich verfolge schon einige Zeit Eure Diskussion. Da ich mich im Umfeld von Einspritzsystemen (L-Jetronic / Motronic) recht gut auskenne will ich ein paar Hinweise beisteuern: Folgende Parameter werden zwingend für eine entsprechende Gemischbildung benötigt: 1. Luftmasse (z.B. über Heißfilmsensor) 2. Ansauglufttemperatur - Besonders bei aufgeladenen Motoren 3. Ladedruck 4. Lambda - Wert 5. Drosselklappenstellung 6. Kurbelwellenstellung / Drehzahl 7. Bei aufgeladenen Motoren zwingend nötig: Klopfsensor 8. Wassertemperatur Die genannten Parameter sind das absolute Minimum. Ansätze, die die Luftmassenmessung durch den Ladedruck ersetzen haben sich nicht bewährt, da sie zu träge sind und auf Druckwellen im Ansaugtrakt mit Fehlmessungen reagieren. Ergeben sollte sich folgendes: 1. Zündzeitpunkt 2. Einspritzmenge = Länge des Öffnungsimpulses des Einspritzventils. 3. ggf. Ladedruckregelung. Die Parameter 1, 3, 4, 5, 6 gehen DIREKT in das enstehende Kennfeld ein. Die anderen Werte lassen sich durch Korrekturen des errechneten Kennfeldes ermitteln. Wenn ich die ganzen Kenngrößen betrachte, fällt mir kein AVR ein, der über entsprechend viele Analogeingänge (1., 2., 3., 4., 5., 8. = 6 insgesamt) verfügt. Außerdem muß die Messung zumindest der Signale 1,2,3,4 sehr schnell erfolgen. Sie sollten für jede Umdrehung neu ermittelt werden. Das Ganze in Echtzeit zu machen ist sicher auch nicht trivial: 7000 U/min bedeuten ca. 233 Zündungen je Sekunde (bei einem 4-Zylinder). Das alleine sollte gehen. Interessant ist folgendes: Die Genauigkeit des ermittelten Zündzeitpunktes sollte für einen Hochleistungsmotor schon im Bereich von 1 Grad KW liegen. Das bedeutet für die vorgegebenen Drehzahlen ein max. Abweichung von ca. 24 uS. Ähnliches gilt für die Einspritzzeiten: Hier ist das allerdings eher umgekehrt. Die VOllastzeiten sind sicherlich leichter zu erreichen, problematisch sind hier die sehr kurzen Impulse im Leerlauf, die sicher auf +/- 1uS stimmen müssen, um einen stabilen Leerlauf zu erreichen. Problematisch ist sicher auch die Abspeicherung dieses 5-dimensonialen Kennfeldes mit je zwei resultierenden Werten. Ein Abspeichern von Lambda Werten im EEPROM ist kaum sinnvoll und auch nicht nötig. Gängige Systeme speichern Korrekturwerte für das ClosedLoop System immer im RAM ab. Sollte die Batterie abgeklemmt werden, kalibrieren sie sich neu. Wenn man schon den ganzen Aufwand treibt, sollte man auch direkt eine Einzelzündung vorsehen. - So läßt sich der Zündverteiler eliminieren. Ich fürchte allerdings, daß dieses System für einen Hobbyisten nicht realisierbar ist. Alleine die Messmittel, die nötig sind (Motorenprüfstand incl. Messung und Echtzeitprotokollierung aller Parameter), sind schlicht Unbezahlbar. Wenn das Auto im Straßenverkehr eingesetzt werden soll kommt noch die Einhaltung und Begutachtung der Abgaswerte hinzu ... Ich weiß, daß es für den Motorsport entsprechende Systeme fertig gibt. - Ich habe so was auch schon mal im Internet gesehen. Ein anderer Weg wäre, ein Motronic System für einen ähnlichen Motor (z.B. Calibra Turbo) über anderen Kraftstoffdruck oder Einspritzdüsen entsprechend anzugleichen. Viele weitere Probleme (z.B. Plazierung und Auswertung des Klopfsensors, Auswertung der Lambdamessung - kein proportionales Signal sondern Umschlag bei Lambda=1, Störsicherheit im PKW ...) habe ich hier noch gar nicht angesprochen. Außerdem ist ungeheuer schwierig, ein derartiges Echtzeitsystem zu debuggen. Ich weiß, wovon ich hier spreche, da ich kürzlich ein komplexes IR Fernbedienungssystem mit einem AVR realisiert habe ... Sorry hier den Miesmacher zu spielen, aber ich halte das Ganze für nicht realisierbar ... Du kannst mir gerne mal eine Mail schreiben, wenn Du noch Fragen hast. Gruß, Marcus
Hallo, danke für deine Ausfürhliche Antwort. Aber ich komme bei 8000 U/Min auf 133 Zündungen pro Sek=7,5mSek pro Umdrehung/360=20,8 µSek pro 1°. Ich will aber ne höhere Genauigkeit. Also werde ich einen zweiten AVR verwenden der mir pro Grad 5 Impulse liefert. Und der zweite AVR macht die Berechnungen aus dem Kennfeld und zählt dann die Impulse um im richtigen Zeitpunkt zu zünden(Schleife herunterzahlen). Außerdem findet eine Zündung nur alle 90° statt und dazwischen hab ich die Zeit um meine Berechnungen zu machen. Also mit einer Reserve ca. 1,5mSek. Da macht ein AVR bei 8MHz 15000 Befehle evtl. durch 2 falls man mit 250nS pro/Befehlrechnet. Einzelzündung muss es eigentlich nicht sein dachte eher an Doppelzündung, weil dadurch keine unverbrannte Abgase zum Kat gelangen der verschleiß der Kerzen ist halt doppelt so hoch aber was kosten die schon. Eine Schaltung inkl. Programm hab ich für den AVR schon gefunden. Ich werde es an einem Prüfstandmotor machen bevor es in mein Auto kommt. Das mit dem Klopfsensor sehe ich nicht so schlimm, da ich ein Klopfsignal schon mit dem Oszi erkannt habe. Allerdings nicht Zylinderselektiv. Was man aber machen kann das nur ca. 30° vor OT bis 10 nach OT im beim Arbeitstakt eines Zylinders das Signal an einen AD-Wandler läuft. Ich möchte es erstmal mit der Jetronic probieren, einfach den Luftmengenmesser vor den Turbo dadurch misst er auch alles ein was angesaugt wird. Weiterhin habe ich einen einstellbaren Benzindruckregler der auf unter und Überdruck reagiert. Die Ladedruckregelung wird erstmal 5 Stufig über eine Regelung gemacht die ich mit mit nem AVR zusammengebastelt habe. Abbringen kann mich davon keiner da auch AME einen Rechner mit einen 80535 realisiert haben. Zuerst werde ich mich um die Zündung kümmern da ich die Last/Ladedruckabhängig gestalten will/muss. Mein Asci wird 2004 20jahre alt muss mich mal erkundigen wegen 07-Kennzeichen dann gibts nämlich ne pauschal-Steuer und ich könte die Lamdaregelung außer acht lassen. Aber für die Abstimmung ist es ganz nützlich.
Also ich komm auf 533,3.. Zündungen/Sekunde :-) Thomas: ist der Lamdawert nicht sehr nützlich für die Bestimmung der Benzinmenge? Ist es nicht sinnvoller beim Benzindruck immer den höchstmöglichen Wert zu nutzen und lieber die Einspritzdauer als den Druck zu ändern? Welche Leistung erwartest Du nach erfolgreicher Implementierung Deiner Steuerung? Markus: Kannst Du noch ein wenig zum Klopfsensor sagen? Danke jo Axel
Hallo, ja der Benzindruck muss mit dem Ladedruck steigen und dem Unterdruck im Saugbetrieb (unterer Drehzahlbereich) sinken um genau das zu erreichen, das die Einspritzmenge nur von der Einspritzzeit abhängig ist. Also ich habe mir einen Motoraufbauen lassen der einige Leckerbissen hat, der ist jetzt 9,0:1 verdichtet und leistet immerhin noch 125 PS. Erstmal werd ich mit nur 0,3bar effektiv aufladen also samtliche Drosselverluste sind dann schon kompensiert. Damit müsste meine LE-Jetronic zurecht kommen. Wenn ich mal die Einspritz/Zündanlage fertig habe werde ich mit mind. 1bar aufladen , nen Overboost von ca. 1,3bar und ca. 250 PS erreichen. Was für ein 700-800kg Fahrzeug ausreichen sollte. Ich könnte im Moment auch noch per PWM und nachgeschalteter R/C-Stufe meinen Original-Steuergerät falsche Daten liefern (Motortemperatur). Hatte mal nen Wackelkontakt an dem Stecker und mir ist mein Motor bei 5000 U/Min abgesoffen. Also von der Einspritzmenge liefert meine Anlage genug, da sie alle 180° Kurbelwelle einspritz schafft sie einfach doppelt soviel wie ne full-seq- Einspritzanlage.
Hi Thomas, Bei 8000 U/min hast Du 16.000 Zündungen / min (ein Viertakter zündet jede 2. Umdrehung * 4 Zylinder = (8.000 / 2) * 4 = 16.000). Das sind je Sekunde 266 (oder 233 bei 7000 U/min). Wenn Du einen Prüfstand hast, sehen die Chancen schon viel besser aus. Das Gleiche gilt natürlich, wenn Du kein Abgasgutachten brauchst. Dennoch hilft dir eine Lambdaregelung natürlich die Regelung insgesamt besser abzustimmen, wenn auch eine kurzfristige (=schnelle) Regelung nicht möglich ist. Dir ist sicherlich auch klar, daß bei einem hoch aufgeladenen Motor wenige Sekunden zu magerer Lauf im Vollastbereich zu einem GAU (=schmelzen wichtiger Motorbestandteile) führen wird. Mit Einzelzündung meinte ich eine Direktzündung (ohne Zündverteiler) mit Einzelzündspulen. Das gibt zum einen einen besseren Zündfunken, da der Schließwinkel größer wird, außerdem entfallen Verteiler und Hochspannunskabel. Bei einem aufgeladenen Motor mit hohen Dreh- zahlen ist ein besonders kräftiger Zündfunken emminent wichtig. Um die einzelnen Impulslängen zu generieren würde ich in jedem Falle mit Timern arbeiten. Verzögerungsschleifen sind ungenau und verbieten die Nutzung von Interrupts, die Du aber mit Sicherheit brauchen wirst. Die AVR Timer sind in Verbindung mit Interrupts ungemein elegant und auch flexibel. @Axel: Der Benzindruck muß geregelt werden, um eine konstante Ein- spritzmenge bei einer bestimmten Öffnungszeit des Ventils zu erreichen. Im Prinzip muß immer der gleiche Differenzdruck zwischen Saugrohrdruck und Benzindruck herrschen. Alle mir bekannten Systeme (Bosch Jetronic und Motronic) setzen hierfür einen mechanischen Kraftstoffdruckregler ein. @Thomas: Wenn Du ohnehin den Saugrohrdruck mißt, könntest Du auch die Korrektur des Benzindrucks errechnen (noch ein Faktor mehr ....). Zum Thema Klopfsensor weiß ich nur, daß es sich um einen Piezofühler handelt, der durch die Zündungen des Motors erregt wird. Die Erkennung einer Frühzündung (=klopfen) erfolgt soweit ich weiß sowohl über die Signalform (=Amplitude) als auch über den Zeitpunkt der stärksten Erregung. Problematisch ist hier noch die Plazierung, da der Abstand zu den einzelnen Zylindern immer unterschiedlich ist, was sowohl die Amplitude als auch das Timing des Signals beeinflußt. Motoren ab 5 Zylindern haben auch fast immer mehr als einen Klopfsensor (bis zu 4 beim V12). Es gibt übrigens noch ein Verfahren um die Klopfregelung komplett zu ersetzen: Saab z.B. mißt den Zündstrom während der Zündung. Der Verlauf dieses Zündstroms (während der Microsekunden, die das dauert). Der Verlauf des Zündstroms erlaubt dann zu bestimmen, ob die Verbrennung sauber ist. Eine unkontrollierte Zündung "bläst" quasi den Zündfunken aus, so daß der Zündstrom zu früh zusammenbricht. Gruß, Marcus
Hallo, ein 4Zylinder-4 Takter hat eine Zündabstand von 180° Kurbelwelle also zündet er jede halbe Umdrehung. Also hab ich ja 180° Pause zwischen 2 Zündungen um meine Befehle auszuführen. Fehler meinerseits es sind doch 266/Sek. Mir ist schon klar was du mir Einzelzündung gemeint hast. Aber für die Schließwinkelregelung habe ich ein externes Bauteil das den Schließwinkel selbstätig regelt(auch bei verschiedenen Zündspulen da es direkt sie Sättigung überwacht und mir diese Aufgabe deshalb keine Prob's bereitet. Über Einzelszündspulen hab ich auch schon nachgedacht. Allerdings hab ich da nicht den Effekt das in den Austoßtakt reingzündet wird. Bei der Ionen-Strommessung von Saab wird nicht der Zündstrom gemessen sondern kurz nach der Zündung ein Gleichstrom mit 400V (was ich eigentlich nicht praktizieren will, da es doch ganz schön gefährlich ist) durch den Brennraum gejagt wird. Und je nach Stärke der Detonation leitet das Gas besser oder schlechter, dadurch kann man direkt auf den Druckverlauf im Zylinder schließen und die Klopfenden Bereiche meiden. Weiß jetzt nicht genau ab wieviel bar Verbrennungsdruck der klopfende Bereich anfängt und außerdem vertragen manche Motoren einfach mehr Verbrennungsdruck da sie halt stärker konstruiert sind. Saab kann sich dadurch viel genauer an die Klopfgrenze wagen als andere Hersteller da sie den Druckverlauf direkt messen und nicht erst auf ein Signal des Klopfsensors warten. Mein Motor hat eine Aufnahme für einen Klopfsensor ab Werk sollte also schon die optimale Position sein. Das mit der Impulsbildung hab ich mir so vorgestellt. Ein 2ter AVR misst mir die Länge zwischen einer fallenden und einer steigenden Flanke(welche durch einen Sensor an der Kurbelwelle die Impulse an den AVR liefert) durch diese Zeit kann ich jetzt die U/Min u./o. 360° Kurbelwelle errechen o. 720 o. 1440 um die Genauigkeit auf 0,25° zu steigern. Aber das Prob ist folgendes ich muss die Zeiten zw. 1,666..mSek(100 U/MIN) und 20,833..µSek(8000U/MIN) messen können und ob das Ergebniss überhaupt als 8bit rauskommt oder wäre das genau genug. Müsste dann die neuen Impulse entweder per einiger verschachtelter Schleifen generieren und die Entschleife mit einen Wert zw. 0 u. 255 laden oder per PWM das ganze machen aber ob man mit PWM diese Bandbreite erreicht 1,6mSek-20,8µSek? Und ich bin auf der Suche nach folgendem Bauteil VB029(u. Preis) als Pentawatt-Gehäuse ist ein Zündspulentreiber der eine interne Strombegrenzung von 12,5 Ampere hat und mit einen Portpin geschalten weren kann also TTL-Kompatibel, denn kann man ja auch als Schalter für sämtliche Dinge benutzen. Das mit dem benzindruck haben wir uns gegenseitig abgelaufen warst zuerst auch dem Senden-Button. Muss dann auf Arbeit werde aber heute Abend wieder ins Forum schauen, also bis dann.
Hallo Thomas, für die Direktzündung solltest Du natürlich jede Zündspule einzeln ansteuern. Jetzt aber zum Timing-Problem: Ich würde mit einem 0-Grad KW Sensor Drehzahl und KW Position messen. Zusätzlich ist wohl noch ein 0-Grad Sensor an der Nockenwelle nötig, um die Arbeitstakte auseinander zu halten. Evtl. tut es hier ja auch der alte Zündverteiler, der ja mit Nockenwellendrehzahl läuft. Durch die Messung der Periodendauer der Kurbelwelle erhältst Du einen Wert zwischen 125 uS bei 8000 U/min und 2000 uS bei 500 U/min. Wenn Du den Zeitraum mit einem mit 8 MHz getakteten 16 Bit Timer misst bekommst Du Werte zwischen 1000 (* 125 nS) und 16000 (* 125 nS). Das bedeutet wiederum, daß Du den KW Winkel auf ca. 0.3 Grad genau messen kannst. Den gemessenen Periodenwert kannst Du durch einfaches Rechtsschieben beliebig in ein Kennfeld umwandeln: Eine Teilung durch 64 z.B. ergibt ein fast perfektes 8 Bit Feld mit Werten zwischen 15 und 250 für das genannte Drehzahlband. Wahrscheinlich muß man aber noch den Kehrwert der Periodendauer nehmen, da sonst die Genauigkeit bei höheren Drehzahlen unbefriedigend ist. Das sollte sogar mit nur einem AVR gehen: Du verwendest Timer 1 mit Chiptakt = 8 Mhz getaktet. Hier hast Du dann 125 ns Periodendauer. Der 0 Grad Sensor triggert den Input Capture Event. Außerdem setzt Du den Timer mit jedem Input Capture zurück (automatisch). Jetzt kannst Du Drehzahl und Kennfeld ermitteln. Das Output Compare Register des Timers lädst Du dann mit den gewählten Werten. Es ist Hardwaremäßig direkt Abfragbar. Nun mußt Du nur noch über 4 Ausgänge den passenden Zylinder auswählen, so daß der richtige Zylinder zündet. Ich glaube, die Ungenauigkeit, die durch eine Drehzahländerung während der Umdrehung entsteht ist zu vernachlässigen. Unter Last - und nur das ist wichtig, vor allem in den Höheren Gängen, ändert sich die Drehzahl nicht mehr so schnell. Aber auch das läßt sich ja abschätzen: Eine Verdopplung der Drehzahl (von 3.000 auf 6.000 U/min) sollte mindestens 2 s dauern. Bei 6000 U/min habe ich in diesen 2 s insgesamt 200 KW Umdrehungen. Das sollte genügen, um das Kennfeld hinreichend genau zu steuern. Bei niedrigen Drehzahlen (z.B. von 1.000 auf 2.000 U/min) ist die Änderung des Zündzeitpunktes wiederum nicht so groß. Soweit ich weiß, arbeitet die Bosch Motronic auch mit einem 0 Grad Sensor und berechnet alle Korrekturwerte bezogen auf die nächste KW Umdrehung. Falls die Genauigkeit so nicht genügt, kann man Sie mit einem 2. Impuls bei 180 Grad KW verdoppeln. Das Verfahren bleibt gleich, nur die Synchronisierung wird etwas aufwendiger, da ich nun die Events zählen muß und mit 0 Grad Nockenwelle synchronisieren muß. Den Bereich des Anlassens muß man ohnehin anders erkennen und behandeln. Hier kann man dann einen anderen Teiler wählen (z.B. / 8). Das Kennfeld spielt beim Anlassen ohnehin keine Rolle. Du kannst mir auch gerne mal eine Mail schreiben, dann maile ich Dir mal meine Telefonnummer. Gruß, Marcus.
Hallo, danke für die ausführliche Antwort. Aber ich möchte nicht eine ganze Umdrehung warten bis ich die Drehzahl ermitteln kann, weil ja die Beschleunigung dazwischen erst ausser acht gelassen wird. Habe mir das so vorgestellt. Es gibt bei einem 2 Liter-Motor ein Bauteil das ich auch verwenden könnte sitzt an der Kurbelwelle und liefert 65 Impulse oder ich mach es irgendwie per Hall o. Induktionsgeber an der Kurbelwellenscheibe also dort wo der Anlasser reinhackt. Die OT Bestimmung für Zylinder 1+3 u. 2+4 werd ich am Nockenwellenrad realisieren. Da sich die Nockenwelle nur 1:2 schnell dreht. Ich müsste allerdings die Drehzahl pro Impuls ermitteln.
Hallo Thomas Tolles Projekt Hier noch ein paar Tips an die Du vielleicht schon gedacht hast. Wenn Du irgend etwas messen möchtes nimm die internen Timer und Interrupt's. In der gewonnenen Zeit kannst Du die Variablen über die RS232 Schnittstelle an ein Hyperterminal senden. Dies wäre nützlich für's debuggen in einem "Realtime Projekt". Obwohl der AVR Simulator oder einige Entwicklungsboards nützlich für die Programmentwicklung sind, aber "Realtime" können nur recht teure Systeme.
Hallo noch mal ich Habe gerade in ein Conrad Katalog geschaut dort gibt es ein BUK 101-50GL (schaltet mit 5V) vielleicht reicht der aus um die Zündspule zu schalten. Ansonsten gibt es genug MOS FET's BUZ11 schaltes +14V an Emitter Transistor an Collektor über Widerstände ans Gate. Freilaufdiode nicht vergessen und weil es vom MC gesteuert wird, vielleicht das über Optokoppler steuern.
Hallo, es geht mir eigentlich darum die Schaltung möglichst klein zu halten und deshalb möchte ich nicht erst einen optokoppler Schalten und dieser einen kleinen Trans. damit dieser wiederum einen großen Schalten kann. Ich will einfach über einen Pin des µC einen Transistor schalten. Habe gerade ne Antwort von ner Firma bekommen die die VB029 verteibt dieses Ding kann über einen Pin gesteuert werden und schaltet 12A und hat noch einen Diagnose-Ausgang allerdings verkaufen die 1000 Stück in Packungen 'a 50 und wollen 2.400 Euro für haben also Stückpreis von 2,40Euro o. knapp 5 DM. Aber das kann ich mir wirklich nicht leisten. Das mit der Übergabe von Werten an den PC ist erst mal nicht so wichtig und läßt sich eigentlich auch ziemlich leicht bewerkstelligen Quellcodes hab ich schon im anderem Forum(Codesammlungen) gesehen.
Hallo Thomas, Hallo Marcus Habe Euren Dialog über Suchmaschine gefunden und festgestellt daß Das Projekt von Thomas dem Meinen sehr ähnelt. Ich baue gerade eine Einspritzung zur Leistungssteigerung für ein Motorrad und habe mich für den ATMega103 entschieden. Daher möchte ich auch Tabellen in den flash-Speicher ablegen (schon wegen der Größe). Ich denke an 32*32 für die Zünverstellung und evtl. das gleiche oder 64*64 für die Kraftstoffmenge. Ich dachte die Tabelle so anzulegen daß ich im Prinzip 32 Zeilen (für verschiedene Drehzahlen) habe und in jeder stehen 32 bytes (für verschiedene Gasstellungen). Um an meinen Wert zu kommen Teile ich die Drehzahl durch 32 und addiere die Gasstellung. Dort finde ich dann meinen Wert. Ich würde mich freuen auf diesem Weg mit Gleichgesinnten kontakt zu halten. da ich schon seit ca 1 Jahr an dem projekt arbeite mußte ich bereits einige Probleme lösen Gruß Michael
Hallo Leute, ich bin auch zufällig auf dieses Forum gestossen. Ich bin eher ein Anwender von Motormanagmentsystemen und beschäftige mich seit über 10 Jahren mit dem Thema. Im Moment schreib ich mir ein Programm um Eproms visuell durchzufahren und so die Kennfelder zu lokalisieren, bei Marelli und TTD klappts schon. Hier mal ein paar Tipps: In der Regel reicht je ein 16*16 Kennfeld für Einpritzzeit, Zündung und evtl. Korrektur zwischen Zylinderreihen bzw. innen/aussen beim 4-Zylinder-Reihenmotor. Die Breakpoints sollten aber geschickt gewählt sein, da z.B. die Drosselklappe schon 50% Flow bei etwa 20° Öffnung zulässt. Bei höher drehenden Motoren haben sich 16*32 Kennfelder bewährt (32 Drehzahlwerte). Grössere Kennfelder benötigten schon brutale Verarbeitunggeschwindigkeit. Weiter Kennfelder: Warmlauf, Start, Lambda, Ladedruck, Sensordrift (bei Induktiv), Leerlaufregelung, etc ... Respekt vor dem der das durchzieht. Hier noch ein paar Adressen wer solche Systeme anbietet. Die Funktionsbeschreibungen können inspirierend sein: http://www.trijekt.de> (sehr flexibel), <http://www.moto-spezial.de> (für Guzzi - kann aber auch auf 4-Zyl. verbaut werden), mbesystems.com (England), <http://www.vgsmotorsport.de (von Weber-Marelli gibt es auch AfterMarket-Rechner). Solche Rechner liegen im Preis so um di 1000,-Euro. Trijekt und moto-spezial habe ich schon verbaut. MBE, TDD, Marelli nur abgestimmt, bzw. optimiert. Ciao Dirk
Hallo jungs bin gerade auf eure diskussion gestossen und hätte da mal eine frage. Ich suche schon seit längerem die datenblätter bzw das datenblatt von bosch einspritzdüsen damit ichdie genaue durchflußmenge ermitteln kann bzw die richtigen düsen für meinen motor besorgen kann. Kann mir vielleicht jemand helfen. gruß rainer
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.