Ik wil het toerental meten van een benzine motor.
Daarvoor pik ik de pulsjes van de bougie kabel.
(Schema voor het omzetten naar een TTL signaal heb ik op CO al zien staan).
Hiervoor gebruik ik een PIC16F876A.
Het plan is om de pulzen op pen B0 te zetten.
Hiervoor heb ik al een interrupt geprogt.
Dus als de pen hoog wordt, wordt er een interrupt gestart.
Tevens heb ik een Timer interrupt die (nu nog) iedere 16.384 milliseconds een interrupt start.
Stel het is een 4 cilinder motor, dan wordt er toch iedere 2 omwentelingen 1 puls gegeven ?
Hoe kan ik nu het beste werken:
-Een vast tijd pulzen tellen, en dan daarmee het toerental berekenen.
-Na een vast aantal pulzen kijken hoelang dit geduurd heeft, en zo het toerental berekenen.
Wie heeft er tips/info ?
roelvh
Master Industriële Wetenschappen: Elektronica-ICT
ik zou gedurende bv. 100ms de pulsen tellen, en daarmee het toerental bereken
is een 16F876A niet een beetje overkill ? (tenzij je er nog andere dingen meedoet)
uitlezing op display ?
Ik zou hoe dan ook pulsen tellen. Geen idee waar pulzen vandaan komen.
Verder krijg je 2 pulsen per omwenteling, dus niet elke 2 omwentelingen 1. Tenzij je natuurlijk op een kabel van een bougie ipv. van die van de bobine gaat zitten, maar dat is niet handig.
Normaal gesproken tel je gedurende een vaste tijd het aantal pulsen. Dat is dan een maat voor het aantal omw/min. Voor je pic-ding red je dat vast wel interrupt-driven: op elke interrupt van de ontsteking verhoog je een counter. Op elke timer interrupt (van een timer die je gate tijd bepaalt) store je die in memory en reset je het ding. Zo heb je altijd je laatste hele count beschikbaar. Enig nadeel is dat-ie onder je handen kan veranderen. Daar zal je code rekening mee moeten houden.
Leuke van deze constructie is dat je je mainloop vrij hebt voor andere leuke dingen.
als je motortje stationair draait krijg je maar ca 1 puls
per 100ms dat is te weinig dus,
je moet een interne klok laten lopen in de pic,
en die laten klokken door je ontstekings pulsen.
met de door de snelle interne klok ontstaande getallen,
kun je veel zuiverder werken.
(oftewel de tijd meten tussen de ontstekings pulsen)
je kan ook de startmotorkrans (tanden ) gaan tellen
komt ook al wat beter in de buurt.
sietse
[Bericht gewijzigd door burner op ]
Arjan M
Whatever you are, be a good one
Waar programmeer je in? Als je Proton gebruikt van Crownhill, dan kun je het commando: 'Pulsin' gebruiken. Dat gebruik ik ook voor het timen van servosignalen uit mn ontvanger.
Voor Pulsin High pakt hij iedere opkomende flank van je puls, wanneer deze weer naar beneden 'valt' berekend hij de tijd dat je puls duurde.
Voor Pulsin Low doetie het precies andersom en begint hij dus te tellen als je flank naar beneden valt en stopt als ie omhoog schiet.
Als je Pulsin op de poort zet waar je je 'sensor' of whatever aan vastknoopt aan je pic, dan kun je hiermee je toerental onwijs simpel berekenen (je krijgt je pulstijd immmers in je schoot geworpen)
Have fun
....Waar programmeer je in? Als je Proton gebruikt van Crownhill, dan kun je het commando: 'Pulsin' gebruiken. Dat gebruik ik ook voor het timen van servosignalen uit mn ontvanger.
Ik programeer in ASM, C en Basic, en heb dus de keuze.
Ik begin eerst eens met 'Pulsin' (dan kijk ik ook gelijk hoe dit er in ASM uitziet).
Stel er zit tussen 2 pulzen 125 ms., en iedere omwenteling wordt er één puls afgegeven.
Dan is het toerental toch (1 (sec) / 0,125 (125 ms) * 60 (min) = 480 omw/min. ?
roelvh
Master Industriële Wetenschappen: Elektronica-ICT
Op 21 januari 2007 08:52:15 schreef MMSoft:
Stel er zit tussen 2 pulzen 125 ms., en iedere omwenteling wordt er één puls afgegeven.
waarom de eene keer pulz en de andere keer puls ?
ik kom ook op 480 omw/min uit
waarom de eene keer pulz en de andere keer puls ?
Ik hou wel van een beetje afwisseling (was zeker nog niet goed wakker) 
Ik heb intussen een puls generator geprogt in een andere PIC, zodat ik het een en ander kan testen.
Ja, bij die gegevens klopt het. Houd er alleen rekening mee dat je binnen de ontsteking doorgaans niet makkelijk wat vindt dat elke omwenteling een puls geeft, tenzij je op een krukas sensor mee gaat luisteren. 'Aftappen' bij de bobine is dan een stuk eenvoudiger.
Het is de bedoeling dat het zeer eenvoudig aangesloten moet kunnen worden. Dus een of andere sensor plaatsen/aftappen gebruik ik niet.
Het makelijkste is dan ook de ontstingings puls.
Eventueel de laagspannings zijde, maar ik weet niet of dit bij moderne auto's nog voorhanden is.
Er wordt (dacht ik) niet altijd meer een stroom verdeler gebruikt. Maar per Cilinder een (ingegoten) bobine.
Soms wordt er één bobine gebruikt voor twéé cilinders, dan vonkt de bougie ook een keer 'loos'.
Wie is er thuis in de moderne auto/motor techniek, die hier iets over kan vertellen ?
ja klopt d.i.s. ontsteking,
maar er zijn meer systemen, aparte ontstekings
modules, die getuurd worden door de ecu,
(waar ook het toerental signaal komt)
of systemen, waar de ontsteking modul in de ecu zit..
het is inderdaad mischien handig om de bdp sensor
te gebruiken om het signaal vanaf te pikken.
hangt helemaal van het systeem af.
let wel op, de bdp sensor is erg gevoelig
bij sommige auto's houd de sensor op als je boven
weglussen staat, ook versleten startmotoren, kunnen lijden
tot het wegvallen van bdp sensor signaal.
Op 21 januari 2007 11:31:27 schreef MMSoft:
Er wordt (dacht ik) niet altijd meer een stroom verdeler gebruikt. Maar per Cilinder een (ingegoten) bobine.
Soms wordt er één bobine gebruikt voor twéé cilinders, dan vonkt de bougie ook een keer 'loos'.
Bij grote industriele motoren (vaak scheepsdiesels omgebouwd naar aardgas) is er vaak 1 bobine per cylinder: 1 vonk per twee omwentelingen
Bij de meeste auto's is er 1 bobine en een verdeler: aantal cylinders/2 vonken per omwenteling, behalve als je een bougiekabel aftapt: 1 vonk per twee omwentelingen
bij vooral tweecylinders (oude dafjes, 2CV, sommige BMW boxers, Ural, Harley's) is er 1 bobine met twee uitgangen in serie (dus uitgang--HSspoel--uitgang): 1 vonk per omwenteling
Verder zou ik om een nauwkeurig toerental te meten altijd drie aparte stukken programma maken die parallel de snelheid meten.
BV het eerste programma meet hoelang het duurt voor er 10 omwentelingen zijn geweest, het tweede hoelang het duurt voor er 50 zijn geweest en een derde dat meet hoelang 100 omwentelingen duurt.
Als na een vaste tijd de derde meting nog niet "af" is draait de motor te langzaam en kijk je naar de tweede meetmethode enz
Zo heb je altijd een snelle en nauwkeurige uitlezing.
[Bericht gewijzigd door GJ_ op ]
je neemt een timer met elke seconde een interrupt
via je telleringang , laaat je de pulsen binnenkomen
en de waarde telt op in een bytelocatie
als je de interupt hebt van de timer , kijk je op hoevvel de teller staat
als het een motor betreft met brandstofinjektie kan je ook je signaal wegpakken bij een injektor, injektoren staan bijna altijd aan plus over het kontakt geschakeld , de massa wordt door het stuurapparaat geregeld , en wel meestal 1 maal per 2 krukas omwentelingen , aan deze zijde heb je dus een mooi 12 volt on/off signaal,enige probleem wat je zou kunnen ondervinden is dat jouw motor roluitschakeling zou kunnen hebben m.a.w. bij afremmen op de motor met het gaspedaal los ,wordt de injektoraansturing afgeschakeld en valt dus ook je rpm signaal weg , succes.
Op 21 januari 2007 12:27:39 schreef Extragroot:
je neemt een timer met elke seconde een interrupt
via je telleringang , laaat je de pulsen binnenkomen
en de waarde telt op in een bytelocatie
als je de interupt hebt van de timer , kijk je op hoevvel de teller staat
Werkt niet echt lekker: het toerental word aangegeven in toeren per minuut. Als je nu gedurende 2 seconden telt (en dan heb je al een erg slome uitlezing) gaat het toerental met stappen van 30 tpm omhoog. Als je dan je uitlezing wat sneller zou willen maken en gedurende 1 seconde telt maakt ie al stappen van 60tpm.
Of dit al dan niet wenselijk is hangt natuurlijk ook een beetje van de motor en de toepassing af. Bij een motor die volgas 800tmp draait lijkt het me niks en bij een motor die zonder problemen 12.000tpm draait zal het wel best zijn al wil je daar waarschijnlijk wel een snel reagerende uitlezing hebben.
[Bericht gewijzigd door GJ_ op ]
Dit lijkt me typisch iets om de capture-functie van de PIC voor te gebruiken.
Het signaal kan op de CCP-pin aangesloten, je kiest in de software pos. of neg edge triggered flank.
Je meet dan steeds de tijd tussen twee binnenkomende pulsen in.
Komt misschien op hetzelfde neer als Arjan beschreef met 'pulsin'.
In assembler is 't in elk geval bloedjesnel en er komt een 16 bits waarde uitrollen.
Zie de capture-uitleg in de datasheet.
[Bericht gewijzigd door Zonnepaneeltje op ]
Het werkt !
De pulzen komen op pen B0 binnen.
Dit geeft een interrupt, in deze interrupt afhandeling wordt er een teller verhoogd.
Tevens loopt er een Timer die iedere 16.384 milliseconds een interrupt start. Als deze 61 keer is gestart (61x16.384ms = 1 Sec.) is er 1 sec. om.
Elke seconden wordt de puls teller uitgelezen.
Nu heb ik dus een freq. meter met een zenuwachtige uitlezing (LCD Display).
Edit:
Eerst maar eens iets aan die zenuwachtige uitlezing doen.
Doordat het getal telkens herschreven wordt, wordt de uitlezing lastig. Iemand tips hiervoor ?
Ik denk eraan om de uitlezing 'analoog' met LED's te maken. Hoeveel LED's zouden er nodig zijn om een mooie weergave te krijgen ?
[Bericht gewijzigd door MMSoft op ]
Tja, dat is een oplossing, maar dan wordt de uilezing wel erg traag he.
Ik dacht zelf iets meer in de trend van alleen digits over schrijven niet niet gewijzigd zijn, of alleen de waarde overschrijven al dit niet meer afwijkt dan een x aantal...
diode
Zoekt en gij zult vinden, vindt gij niet dan is het zoek
een aantal metingen opslaan, dan de hoogste en laagste meting negeren, en dan het aantal metingen delen door de opgetelde waardes.
voorbeeldje:
meting1: 20
meting2: 17
meting3: 31
meting4: 20
meting5: 15
hoogste en laagste negeren dus 1,2,4 blijven over.
optellen 20+17+20 = 57
dan delen door 3 = 19
Eens kijken, hoe pak ik dat aan.
De laatste 5 waardes telkens doorschuiven:
M5 = M4
M4 = M3
M3 = M2
M2 = M1
M1 = Actueel
Nu nog even denken hoe ik het makelijkste de laagste en de hoogte waarde uitfilter...
Edit:
Het probleem zit niet in de meting (denk ik), maar in de weergave op het LCD display.
Nu moet ik toch nog telkens de LCD tekst vernieuwen ?
[Bericht gewijzigd door MMSoft op ]
diode
Zoekt en gij zult vinden, vindt gij niet dan is het zoek
Ik heb het probleem al gevonden.
Tijdens het beschrijven van het LCD display, komt er regelmatig een interrupt op.
Het beschrijven van het LCD stopt dan even.
Als ik de interrupts blokkeer tijdens het beschrijven van het LCD ziet het er een heel stuk beter uit.
Helaas ben ik niet zo blij met interrups blokkeren, en al helemaal met dit programma niet...
Edit:
Net een test gedaan met een LEDje op een uitgang (die aan/uit gaat bij een bepaalde freq.).
Het blokkeren van de interrupts heeft duidelijk invloed op de meet nauwkeurigheid.
Zonnepaneeltje had het over de CCP module.
Ik heb deze module wel eens gebruikt voor PWM enzo, maar hoe werkt dat ongeveer voor een meting ?
En kan ik daarbij ook het LCD display weergave probleem verwachten ?
[Bericht gewijzigd door MMSoft op ]
Voor het gebruik van de CCP module, ben ik druk aan het zoeken in de datasheet.
Ik begrijp nog niet hoe ik deze kan gebruiken voor een freq. meting. Wie kan mij een beetje opweg helpen ?
Je stelt hem eenmalig in.
Bij elke puls komt er een interrupt.
In de interrupt haal je de waardes uit de CCPR1L en CCPR1H registers en schrijft die naar je eigen 2 variabelen.
je reset de module en timer1 en verlaat de int-routine.