Compare1A ligt buiten timer waarde

Beste Forumleden, ik heb al heel veel gelezen en geleerd hier op het Forum maar nu heb ik toch echt een probleempje waar ik de mening van een aantal experts voor nodig ben. (ik beschouw me niet als zodanig)

Korte introductie van het systeem:
Digitaal ontstekingssysteem voor een verbrandingsmotor waarbij de positie en toerental van de krukas middels een hall-sensor wordt ingelezen. Normaliter wordt de firmware getriggerd op 80 graden voor bdp (input capture). Hierop volgt uiteindelijk een berekening die het moment van inschakelen primaire stroom bobine (compare1a) en moment van ontsteken (compare1b) bepaalt.
Bij toepassing op een ander type motor kan ik de firmware enkel en alleen triggeren op 5 graden voor bdp. (Mechanische beperkingen en kosten maken het vrijwel niet mogelijk om plaatsing sensor en markeringen te veranderen)

Nu het probleem:
Bij accelereren van de verbrandingsmotor wordt de looptijd van timer1 verkort. De hoeksnelheid neemt immers toe. Ik loop klem met de berekening van compare1a. Als ik na het 5 graden v.b.d.p. markeringspunt moet ontsteken (tijdens starten/stationair toerental) dan moet de primaire stroom voor het input capture moment worden ingeschakeld. Als dit te dicht bij het input capture moment ligt en er volgt een plotselinge krukasversnelling kan de looptijd binnen 1 krukasomwenteling zodanig verkorten dat de waarde van compare1a niet wordt behaald. Dit zou betekenen dat de bobine niet geladen wordt. Dit heb ik voor nu opgelost door op het input capture moment de TIFR1 register af te vragen of de compare1a flag is gezet. Zoniet dan forceer ik compare1a, echter in sommige gevallen is de laadtijd dan net te kort.

Ik heb met een Kalman filter gewerkt die de versnelling van de krukas berekend en daaruit een correctie meegeeft aan de compare1a waarde maar daar heb ik 3 a 4 krukasomwentelingen voor nodig en tot die tijd gaat het net niet goed. (resolutie is te laag om sneller te kunnen berekenen)

Het werkt verder omdat ik zowel een capacitief (laadtijd is niet afhankelijk van primaire stroom bobine) als inductief ontstekingssysteem gebruik maar ik ben toch nieuwsgierig of er andere digitale oplossingen zijn voor dit probleem.

Schakeling is opgebouwd rondom een ATmega32u4

Een manier op hier mee om te gaan, zou zijn om de timer niet elke krukasomwenteling te resetten maar gewoon door te laten lopen, en dan input capture waarde op te tellen bij het gewenste hoek keer de interval tussen de input captures (dus het aantal klokpulsen in een omwenteling).

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Kruimel

Golden Member

Ja maar dat laatste ding ("het aantal klokpulsen in een omwenteling") klopt in deze gevallen dan dus niet omdat je dat pas kan berekenen na het ontvangen van de triggerpuls, waardoor je het probleem niet oplost, maar gewoon oudere snelheidsinformatie gebruikt. Ik denk dat je hier niet met een programmeerprobleem zit, maar met een informatieprobleem. Als je geen reden hebt om aan te nemen dat de motor geaccelereerd is dan kan je dus nooit van tevoren weten wanneer je de bobine moet laden. Als de informatie er niet is ga je die met een programmeertruc niet kunnen maken.

Kan je wel op tijd laden en ontsteken als je pas op -80° begint met berekenen? Dan loop je toch ook vast als de motor op hogere snelheden loopt en je de bobine al moet beginnen te laden voor de trigger komt op -80°? Ik zou zo op het eerste gezicht zeggen dat het niet mogelijk is om op het juiste moment te triggeren als je geen informatie hebt over de versnelling van de motor en hij intussen wel significant kan versnellen in een enkele arbeidsslag. Heb je geen informatie van het inlaatvacuüm of de brandstofinspuiting?

PS Gaat het om een tweetakt of een viertakt?

Ik heb weinig kaas gegeten van de materie rondom een motor-aansturing. Echter, wat ik uit je toelichting oppik is het een probleem met timing. De eerste 2 vragen die bij mij boven komen borrelen zijn :

- Reageert de sensor te traag ? (i.v.m. resolutie)
- Op welke kloksnelheid loopt de Atmega32U4 ? (i.v.m. compare1A/1B)

Wellicht dat een andere sensor, evt. in combinatie met een snelle comparator, of een hogere kloksnelheid je een stukje verder kunnen helpen.

[Bericht gewijzigd door oxurane op maandag 25 november 2019 17:53:23 (20%)

Van elk bezoek aan CO leer ik weer meer...

Bedankt voor de reacties tot dusver.

Ik ga in de gedachtegang van Kruimel mee, dat ik gebrek aan informatie heb. Ook op -160 graden(80 nokkenasgraden, niet goed in openingspost gezet) loop ik altijd 180 graden achter. (4 cil. 4-takt hall-sensor leest 2 markeringen per krukasomwenteling) de versnelling per krukasomwenteling is niet dramatisch groot. Echter als het startpunt van het inschakelen van de primaire stroom bij het markeringspunt ligt dan is een kleine versnelling op laag toerental direct een probleem.

Ik heb wel inlaatdrukinformatie maar dat is geen maat voor de krukasversnelling. Normaal gesproken gebruik ik een 36-1 triggerwheel waarmee de versnelling/vertraging tussentijds ook te berekenen valt, maar dat is nu dus niet mogelijk.

@Oxurane
Met resolutie bedoel ik aantal krukasmarkeringen per omwenteling, hoe meer het er zijn hoe nauwkeuriger de versnelling en positie van de motor te berekenen is. De sensor is een OEM sensor speciaal ontwikkeld voor deze toepassingen. De Atmega loop op 16 MHz. Ik heb niet het idee dat kloksnelheid hier het probleem is. Ik ben me bewust van het probleem zoals Kruimel zegt dat ik gebrek aan informatie heb. Maar misschien heeft iemand hier ooit eens met het zelfde bijltje gehakt....

rudig76

Golden Member

Ook zeker geen expert op dit vlak. Alleen de opmerking van ontbrekende data triggered me.

- acceleratie is iets dat langer duurt dan 1 krukas omwenteling, kun je niet bepalen hoe snel de krukas in milliseconden gaat per omwenteling en dit vergelijken met de vorige omwentelingen om acceleratie of deceleratie te detecteren?

Iets heel anders :-) http://www.echteworst.nl
Lambiek

Special Member

Op 25 november 2019 18:16:56 schreef bol00052:
Normaal gesproken gebruik ik een 36-1 triggerwheel waarmee de versnelling/vertraging tussentijds ook te berekenen valt, maar dat is nu dus niet mogelijk.

Kun je de tanden van je starterkrans niet gebruiken, of de tanden van je nokkenastandwiel. Dan heb je een veel betere indicatie voor je versnelling en positie van je krukas.

Je controller moet het aantal pulsen wel kunnen verwerken natuurlijk.

En waarom wil je pas beginnen met het laden van je bobine een X aantal graden voor je ontsteking, ligt dat aan het type bobine of anders...?

Als je haar maar goed zit, GROETEN LAMBIEK.

@Lambiek:
Ja dat zou een veel betere methode zijn. Nokkenastandwiel zou theoretisch kunnen echter die wordt aangedreven door een ketting zonder spanner, daarbij komt dat de gehele motor uitgebouwd dient te worden om er bij te kunnen. Om nog maar even te vergeten dat dit een een afgesloten iets is waarbij ik dus een aanpassing zou moeten maken in de distributiedeksel.
Het meten van motortoerental en positie is het vliegwiel het meest geschikt, zelfs beter met twee markeringen t.o.v. een distributie met speling. Zeker op lage toerentallen is dat niet stabiel genoeg.

Het vervelende is dat de eigenaar de motor in een zo origineel mogelijke toestand wil houden. Op dit moment lukt dat en het werkt wel zo, maar ik baal er van dat ik de contacttijd van de bobine vooral met starten en langzaam stationair draaien niet genoeg onder controle heb.

En waarom wil je pas beginnen met het laden van je bobine een X aantal graden voor je ontsteking, ligt dat aan het type bobine of anders...?

Ieder inductief ontstekingssysteem heeft een bobine met een optimale laadcurve, vaak tussen de 1,5 en 6 ms afhankelijk van type bobine.
Je rekent dus terug vanaf het ontstekingstijdstip. Afhankelijk van toerental zijn dat dus een x aantal krukasgraden. Boven een bepaald toerental zou het voor kunnen komen dat de laadtijd langer is dan de beschikbare tijd. Dan stel je de vonkduur primair en de rest van de tijd is dan laadtijd voor je bobine.

Kruimel

Golden Member

Het gaat inderdaad om een absolute tijd, en niet een aantal graden. De energie moet immers van de spanningsbron in de bobine worden opgeslagen. Ik vermoed dat het in het geval van stationair draaien meer uitmaakt wat de exacte ontsteekhoek is, waardoor het onhandig is dat juist in dit kritische bereik de metingen kloppen of in elk geval op tijd zijn.

Gegeven een relatief beperkte maximale acceleratie per omwenteling, zou het een drama zijn de bobine iets te oversturen (langer te laden) bij lage toeren? Als de ontsteking dan onverwachts dan toch eerder moet plaatsvinden is je bobine tenminste geladen als het gebeurt. Het zou dus betekenen dat je bij elke omwenteling de snelheid berekent en onder een bepaalde grens de laadtijd dynamisch langer maakt. In het ideale geval stel je de voedingsspanning bij of plaats je een weerstand in serie of zo, maar dan wordt het snel te complex. Het vereist echter geen aanpassingen aan de motor zelf. Ik zou zeggen dat een bobine relatief toleranter zou zijn op wat extra stroom als het aantal impulsen per seconder klein is.

Op 25 november 2019 18:16:56 schreef bol00052:
Ik heb wel inlaatdrukinformatie maar dat is geen maat voor de krukasversnelling.

Zelf ben ik niet zo een motorexpert (wat nu wel blijkt), maar kan ik de conclusie trekken dat je geen informatie kan afleiden over eventuele acceleratie? Zo niet, dan ben je nu eigenlijk een ouderwetse onderbreker aan het nabootsen. In principe zou je in dat geval voor de lage toerentallen misschien gewoon kunnen voldoen met een iets inefficiëntere "veilige" ontsteking op BDP en gewoon accepteren dat hij dan meer brandstof gebruikt en de ontstekingsvervroeging pas bij hogere toeren waar het relatief minder uitmaakt implementeert.

Corrigeer me graag als ik in het bovenstaande een redeneringsfout maak, voor mij is dit een gedachtenexperiment, ik heb weinig praktische ervaring met brandstofmotoren aansturen.

Uiteindelijk bootsen we natuurlijk allemaal de ouderwetse onderbreker na. ;) De winst in dit specifieke voorbeeld zit hem in nauwkeuriger het ontsteekmoment bepalen omdat het vliegwiel enigszins eenparig ronddraait, in vergelijking met de originele contactpunt verdeler. Die door een een nokkenas wordt aangedreven en vervolgens weer door een distributieketting zonder spaninrichting. Daarnaast is een transistor ontsteking natuurlijk in staat een krachtigere bobine te sturen.

De bobine is voor een korte tijd wel in staat een iets grotere stroom te absorberen. Jouw voorstel Kruimel is denk ik ook de beste oplossing. Ik denk dat ik de maximale vrije acceleratie wel kan achterhalen met een aantal metingen. Dit geeft dan een getal waarmee ik de contacttijd zo groot kan maken dat het probleem zich net niet voordoet.

Krukasacceleratie is lastig te berekenen als je niet genoeg markeringspunten op je vliegwiel hebt. Natuurlijk zijn er methodes, zijn zelfs wel drukopnemers waarmee het drukverloop in de cilinder te meten valt, waaruit i.c.m. andere parameters wel een acceleratie te destilleren valt echter dat valt ver buiten het kostenplaatje van dit projectje. :)

Kruimel

Golden Member

Op 25 november 2019 20:19:21 schreef bol00052:
Uiteindelijk bootsen we natuurlijk allemaal de ouderwetse onderbreker na. ;)

Haha, daar heb je wel gelijk in inderdaad... :D Helaas denk ik dat we in deze kwestie geen spectaculaire oplossingen gaan kunnen bedenken. Stiekem vind ik het altijd wel jammer dat ik nooit echt de gelegenheid heb gehad me met voertuigelektronica aan de slag te gaan, want ik vind het wel interessant om er over na te denken eigenlijk. Ik schrik altijd alleen altijd van het praktische deel ervan: je hebt meteen best een hoop spul nodig.

Op 25 november 2019 16:11:17 schreef bol00052:
Bij toepassing op een ander type motor kan ik de firmware enkel en alleen triggeren op 5 graden voor bdp. (Mechanische beperkingen en kosten maken het vrijwel niet mogelijk om plaatsing sensor en markeringen te veranderen)

5 graden voor bdp is hetzelfde als 365 graden voor bdp. 365 Graden voor bdp is veel meer dan 80 graden voor bdp.
"compare1a" en "compare1b" voer je dubbel uit, dus je voegt "compare2a" en "compare2b" toe. Per twee omwentelingen laat je eerst "compare1a" en "compare1b" het werk doen en dan "compare2a" en "compare2b". Je bent met de actuele gegevens wel één omwenteling te laat.

Dat klopt, maar enige nauwkeurigheid is wel gewenst. Maar daar zit het probleem niet. Het probleem zit hem in het feit dat bij zeer lage rotatiefrequenties het ontstekingsmoment net na het markeringspunt valt en de primaire stroom daar net voor ingeschakeld moet worden. Ik zie zo niet wat het voordeel is van het toevoegen van compare2a en 2b als ik niet de versnelling binnen 1 krukasrotatie kan bepalen...

Dat snap ik niet. Bij zeer lage toerentallen heb je toch tijd zat om electrische energie in de bobine te stoppen. Bij hoge toerentallen kan ik me voorstellen dat dat niet lukt.

Daar heb je helemaal gelijk in. Maar mijn oorspronkelijke vraag lag ook iets anders namelijk dat ik het wat beter onder contole wil hebben. De laadtijd van de gebruikte bobine is 3ms. Dan loopt er ongeveer 7A stroom. Na 6ms contacttijd loopt er al bijna 20A. Daar zijn deze bobines niet voor gemaakt en de gebruikte IGBT heeft ook zo zijn thermische beperkingen. Bij lage toerentallen heb je al gauw die contacttijd te pakken als je een aantal graden eerder de primaire stroom inschakeld.

Hoe loste je het vroeger op met de motor waarbij de sensor 80 graden voor bdp zat? Toen startte je de timer "compare1a" toch ook op het moment dat de sensor een signaaltje gaf?

Ik wilde precies hetzelfde voorstellen als Kruimel; die bobine iets eerder gaan laden, zodat je je kunt veroorloven om de vonk iets eerder te maken dan je aanvankelijk had gepland.

Je zou ook de aansturing van de bobine kunnen aanpassen; stel nou dat je die een vrijloopdiode geeft met een MOSFET of IGBT in serie; je zou de bobine dan kunnen laden (voor 3ms), en die extra MOSFET of IGBT inschakelen, voordat je de IGBT waarmee je de bobine oplaadt weer laat sperren. Op die manier kun je de stroom nog even laten recirculeren in de bobine voordat je de vonk maakt.

Uiteraard kost dat wat extra complexiteit, en raak je tijdens het recirculeren wat energie kwijt. Echter, de spanning over de bobine is op dat moment veel kleiner dan 12V (zeker als je een MOSFET gebruikt in plaats van een IGBT), waardoor het afbouwen van de stroom langzamer gaat dan het opbouwen vanaf de 12V.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Op 25 november 2019 23:00:27 schreef SparkyGSX:
Je zou ook de aansturing van de bobine kunnen aanpassen; stel nou dat je die een vrijloopdiode geeft met een MOSFET of IGBT in serie; je zou de bobine dan kunnen laden (voor 3ms), en die extra MOSFET of IGBT inschakelen, voordat je de IGBT waarmee je de bobine oplaadt weer laat sperren. Op die manier kun je de stroom nog even laten recirculeren in de bobine voordat je de vonk maakt.

Dat is een slimme oplossing die volgens mij gewoon werkt.

Op 25 november 2019 22:44:18 schreef ohm pi:
Hoe loste je het vroeger op met de motor waarbij de sensor 80 graden voor bdp zat? Toen startte je de timer "compare1a" toch ook op het moment dat de sensor een signaaltje gaf?

Iets anders, timer wordt iedere 180 krukasgraden (2 markeringen per krukasomwenteling op 160 krukasgraden voor bdp gereset. Het is een 4 cil. 4 takt Dus twee vonken per krukasomwenteling) uit het aantal ticks van de timer tussen de markeringen in wordt de rotatiefrequentie en de versnelling t.o.v. de vorige waarde betekend. I.c.m. belasting van de motor en nog wat andere parameters wordt uiteindelijk compare1a en 1b berekend. Deze worden normaliter in de volgende 180 krukasgraden afgewerkt. Het probleem wat ik hierboven beschrijf bestaat dan niet.

@sparky. Dat is een mooie hardware matige oplossing echter het is al een kant en klaar apparaat. Het is nu voor het eerst dat ik het zo moet opbouwen. Om nu het ontwerp deels aan te passen gaat eigenlijk niet. Ik heb zelf ergens deze gedachte ook gehad maar zocht de oplossing gezien bovenstaand feit eerst in de digitale kant. Maar hij staat wel op het onthouden lijstje. :)

Lambiek

Special Member

Doe je trouwens alleen de ontsteking regelen, of komt de injectie er ook nog bij. Of het moet een oud blok zijn waar nog carburateurs op zitten.

Als je haar maar goed zit, GROETEN LAMBIEK.

In dit specifieke geval is het alleen ontsteking. Heb wel eens een combi gemaakt met een "eenvoudige" opbrengstregeling voor het LPG systeem.
Het systeem in dit topic is op een 6 Volt auto geplaatst. Bij 6 volt auto's (1930-1950) is het moeilijk om onder alle bedrijfsomstandigheden genoeg energie in een bobine op te slaan. Als het mengsel dan wat rijker of juist wat armer staat heb je direct een probleem. Vooral het starten is killing, accu spanning kan dan wel zakken tot een volt of 4.

Het beschreven systeem bestaat dan ook uit een capacitief en inductief deel. Om genoeg energie in de bobine te krijgen tijdens o.a. starten laad ik eerst een condensator op tot +/- 430 Volt. Tevens laad ik de bobine op conventionele wijze op, d.m.v. een primaire stroom. Op het moment van ontsteken laat ik eerst het capacitieve deel los op de bobine, dat zorgt altijd voor genoeg ionisatiespanning aan de secundaire kant en vervolgens laat ik in de bobine opgeslagen energie los. Tot 3,5 Volt voedingsspanning haal ik nog steeds een minimale vonkduur van 1,5 ms. In tegenstelling tot het conventioneelsysteem dat dan al lang weigert te werken.

Complexere systemen koop ik gewoon in. Er zijn natuurlijk genoeg vrij programmeerbare motormanagementsystemen te koop. Alleen niet specifiek voor dit soort toepassingen.

Als je bij een andere motor geen issue had met het vervroegen en de CMP1A die voorbij het timer-ding komt, dan is in die situatie OOK de ontsteking-oplaad-periode korter geweest dan gewenst. Of eigenlijk: de hele ontsteking is dan te laat. Mijn indruk is dat je nu de compleet ontbrekende ontstekingen WEL merkt maar de "verminderde energie" of "te late" ontstekingen NIET.

In dat geval moet je gewoon Sparky's hint gebruiken. Gewoon de timer z'n 16bit rondjes laten lopen (ARR=0 geloof ik) en steeds een "ontsteking in de toekomst" plannen. Die komt dan wat aan de late kant als je motor aan het versnellen is. Dat is nu eenmaal zo en daar kan je weinig aan doen.

Wel is het zo dat als je trigger dicht bij de ontsteking zit, je een grotere nauwkeurigheid hebt: je hebt recent nog de omwentelingssnelheid gemeten, dus de hoek-naar-tijd vertaling is nauwkeuriger dan wanneer je die berekening op een "vorige omwenteling" moet doen.

Als ik het goed begrijp is het nu zo dat je de volgende ontsteking "ongeveer" moet plannen rond de tijd dat je ook de volgende trigger ontvangt. Dus bij niet eens zo veel versnelling krijg je dat de trigger inderdaad eerder komt dan de volgende ontsteking. Tja, dan draai je dus inderdaad op bijna 2 omwenteling oude "snelheidsinformatie" en is de onnauwkeurigheid dus groter. Eigenlijk KAN het niet beter dan wat ik/sparky voorstellen.

Een kleine verbetering kan wel. Normaliter start je de ontsteking cyclus net voor de volgende trigger. Als je volgende trigger dan onverwacht komt op een moment dat je nog niet de ontsteking gestart hebt, dan zou je in de trigger-interrupt de ontstekingscyclus kunnen starten, zonder het oude start-moment af te wachten. Nog niet ideaal maar wel subtiel beter. Als je ontsteking ALTIJD om het trigger moment valt, dan kan je botweg gewoon altijd de bobine-oplaad-output hoog maken.

Maar ik verwacht dat je dan het omgekeerde probleem gaat krijgen: Bij vertraging van je motor is je hele ontsteking al gebeurd, en dan krijgt je bobine dus een hele omwenteling de tijd om op te laden ipv de periode die er normaliter voor staat. Of ie daar tegen kan weet ik niet. Ik heb geen verstand van autos.

P.S. Ik doe alsof er 1 omwenteling is waarop eea moet gebeuren. Dat is een nuttige "versimpeling" van het geheel. Eerst zo over het probleem denken, en pas bij de implementatie uiteindelijk naar de details kijken voor hoe het met 3 of 4 cylinders moet.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

@bol00052,
Een optie die nog niet genoemd is, is bij lage toerentallen een extra weerstand in serie met de bobine opnemen. Bij hoge toerentallen overbrug je 'm. Maar die truc ken je vast wel. (Is eigenlijk een versie van SparkyGSX-oplossing (vrijloopdiode), maar iets minder complex). Bij starten uiteraard ook de weerstand overbruggen.