PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frequenz in analoge Spannung wandeln



xtremecoder
28.11.2008, 19:14
Hallo zusammen!

Ich hätte folgendes Problem, habe schon im Internet danach gesucht, leider nichts brauchbares gefunden:

Ich möchte das Zündsignal, also die Zündfrequenz, eines 2-Takt-Motors in eine analoge Spannung umwandeln. Soweit ich weiß, geht das mit einer monostabilen Kippstufe, einem MonoFlop, das mit einem NE555 recht gut zu realisieren ist, ich weiß aber leider nicht wie so etwas geht...

hättet ihr eine kleine Anleitung dazu? Oder wie würdet ihr das machen?

Dieses analoge Signal werte ich dann mit einem A/D Wandler aus, der mir dann ein paar LEDs ansteuert, die einen Drehzahlmesser darstellen sollen.

Das mit dem A/D Wandler ist kein Problem, da weiß ich bereits wie ich das mache, aber mir bereitet noch die Umwandlung der Frequenz in ein analoges Signal Kopfzerbrechen...

Wäre euch sehr dankbar wenn ihr mir helfen könntet :-)

vielen vielen dank!!!

-alexander

Besserwessi
28.11.2008, 19:44
Der Umweg Frequenz -> Spannung -> Digital ist nicht unbedingt der beste Weg. Das macht schon sinn, wenn man als A/D Wadnler so eine LED aussteuerungsanzeige nutzt. Wenn es aber über einen µC geht, dann sollte man die Frequenz direkt messen, ohne AD Wandler.

Jaecko
28.11.2008, 19:47
Wenns unbedingt der Umweg sein soll, gibts dafür den LM2907 (Frequenz/Spannungs-Konverter)

PICture
28.11.2008, 20:21
Hallo!

Und wenn es unbedingt mit dem NE555 seien sollte, muss die Impulslänge so gewähl werden, dass bei der maximalen Drehzahl noch zwischen den Impulsen Unterbrechungen gibt. Danach werden die Impulse durch einen Tiefpass zur fast Gleichspannung geglättet und durch den ADC gemessen.

MfG

xtremecoder
28.11.2008, 21:56
hey zusammen! danke schonmal für eure antworten!

aso, diese möglichkeit habe ich gar nicht bedacht..:-)

ist denn für die messung einer frequenz mit einem microcontroller tadellos möglich? kann ich das mit einem atmega8 realisieren?
sry, ich habe noch nicht recht viel erfahrung mit microcontrollern...

danke für eure antworten!

Jaecko
28.11.2008, 22:41
Also mein allererster Drehzahlmesser war ein Aufbau mit dem LM2907. Funktioniert hats zwar, aber nicht so wie's sollte.

Der Nachfolgende wurde dann genau mit nem ATmega8 aufgebaut.
( http://cihome.kilu.de/projects_tankrpm.htm )

Zuerst die Dauer zwischen 2 Impulsen gemessen => Nur Grütze rausgekommen wg. Rechenfehler etc.

Hab dann einfach ne halbe Sekunde lang gemessen, wie viele Pulse von der Zündspule kommen. Da noch den Faktor 60 dazu (4-Zylinder, 4-Takt = 2 Impulse pro Umdrehung) und schon hat man die Drehzahl in U/min mit "Mittelwert" über ne halbe Sekunde.

Ein "kleinerer" AVR tuts auch; du brauchst im Prinzip nur nen Timer, nen Interrupt-Pin und nochn paar entsprechende Pins für die Ausgabe.

xtremecoder
30.11.2008, 15:50
danke für deine antwort jaecko!

genauso probier ich es auch!
ich habe noch sehr wenig erfahrung mit microcontrollern, desshalb muss ich mal schauen wie ich das realisieren kann.
ich führe mal einige Versuche durch, wenn ich mit etwas nicht weiterkomme, melde ich mich wieder hier in diesem thema oke? :-)

vielen vielen dank!!

xtremecoder
01.12.2008, 11:50
hey leute!

habe noch eine frage:
wenn ich die zündimpulse auswerten will, wo hänge ich meinen microcontroller dran? direkt an den zündkabel in den zylinder? also das wird doch schlecht gehen denk ich mal, immerhin habe ich da 50000-60000 V.
kann ich den microcontroller vor der zündspule dranschließen, denn da habe ich ja eine kleinere spaannung, die dann in der zündspule hochtransformiert wird? aber da habe ich ja auch nicht immer die gleiche spannung bei jedem zündimpuls...

wie wäre es wenn ich eine kleine spule um den zündkabel, der in den zylinder geht, also von der zündspule weg gebe, und dann die jeweilige induzierte spannung messe?
muss ich diese spannung dann noch irgendwie regeln dass sie für meinen atmega16 "brauchbar" ist?

ich weiß, ein kleinerer controller würde es auch tun, aber ich brauche genügend digitale ausgänge für das ansteuern der leds...und ich habe ein paar 16er hier rumliegen, also was solls...

danke für eure antworten!!

alexander

Jaecko
01.12.2008, 13:04
Es gibt an der Zündspule einen Kontakt (Klemme 1) vom Zündunterbrecher.
(bzw. gab, bei den alten, noch nicht vollständig elektronischen).
Dort kann man ein Schaltsignal abgreifen, welches man mit nem Transistor schön auf 5V umbauen kann. Ich weiss leider nicht mehr genau, wie dort geschaltet wird, also obs ein 12V/GND-Impuls ist oder ob der Schalter nur nach GND bzw. 12V schaltet. Aber sollte sich ja ausprobieren lassen.

Nachtrag: Grad mal in nem Schaltplan geschaut: Klemme 1 wird zwischen "offen" und GND geschaltet.

xtremecoder
01.12.2008, 13:44
ah super danke :-) das heißt dann mit nem pnp transistor kann ich das signal für meinen controller umbauen?

noch ne frage: ich möchte diesen drehzahlmesser für eine vespa bauen, 2 takt motor mit 1 zylinder, ist da die rechnung mit den 2 impulsen pro umdrehung immer die gleiche?

oZe
01.12.2008, 13:54
Nein 2 Takt Motoren Zünden pro Umdrehung einmal. Das heißt du musst 1:1 rechnen. Ein Impuls entspricht einer umdrehung.
Und zum Thema wo du das Zündsignal abnehmen sollst: Eine Vespa hat ne CDI Zündung und ein Pickup am Polrad. Das Kabel vom Pickup ist rot und geht bis zur CDI durch. Du kannst das Signal direkt dort abgreifen aber es muss noch geglättet werden, da der Pickup ein Induktivgeber ist. Das heißt es wird eine Spannung induziert die du in geeignete Form bringen musst für den ADC des Mikrocontrollers. Sollte aber kein Problem sein mit nem Tiefpass und einem begrenzenden widerstand.

Jaecko
01.12.2008, 13:54
Wenn ich meine Schaltung noch richtig weiss, hab ich mit nem Pullup die Kl. 1 auf 12V gezogen. Der Schalter zieht die dann regelmässig nach GND.
Dann da einfach nen NPN mit der Basis hin, Emitter auf Masse und Kollektor über nen Widerstand an 5V. Dann liegt am Kollektor das Schaltsignal in 0V/5V vor.

Zur Rechnung: immer gleich ist das nicht. Hängt von der Zylinderzahl sowie Taktanzahl ab.

Ein 2-Takt-Motor braucht jede Umdrehung einen Zündfunken. Da nur 1 Zylinder da ist, ist also die Anzahl der Zündpulse = Drehzahl.
Wenn du ne halbe Sekunde misst und dann die Umdrehungen pro Sekunden brauchst, ist der Faktor 120 (weil ja 120 halbe Sekunden in ne ganze Minute passen)

xtremecoder
01.12.2008, 14:02
aaahso verstanden:-)

ok, passt, ich hätte noch eine frage:

ich habe begonnen den controller mit bascom zu programmieren, habe aber basic noch nie gemacht, in C wäre es mir lieber, aber ich krig das einfach nicht hin mit diesem makefile und dem ganzen shit...aber das ist jetzt egal, könntest du mir nicht ein codeschnipsel in bascom schicken, das zeigt wie man sie einen impuls "liest", also das zählen der impulse und so...

wäre sehr hilfreich!!

vielen dank!!

-Alexander

pongi
01.12.2008, 16:25
Wenn Du AVR Studio von Atmel kostenlos runterlädst, brauchst Du kein Makefile, und kannst in C arbeiten.

xtremecoder
01.12.2008, 16:52
ok :-) ich lade gerade avr studio runter :-)

@jaecko: könntest du mir irgend ein codeschnipsel schicken für das zählen der impulse?
wäre sehr nett!

danke!!

wkrug
01.12.2008, 17:06
Wenn Du ohnehin schon ein Polrad ( = Magnet ) hast, könntest Du die Drehzahl auch gleich mit einem Magnetsensor wie z.B. den TLE4905L abnehmen.
Der funktioniert auch mit 5V wie der Microcontroller und Du bist vom Zündstromkreis komplett galvanisch getrennt.
Du brauchst dir somit also über Überspannungen und Ausschwingeffekte keine Gedanken machen.

Elefunty
01.12.2008, 17:07
wenn das signal nicht prellt, kann man es einfach auf einen der beiden interrupteingänge des mega legen und bei jedm interrupt den zählerstand um eins erhöhen, da sollte man ein 16 bit register, wenn nicht sogar ein 24-bit register nehmen, kommt auf die max drehzahl an: bei 16bit maximal 65535 rpm; bei 24: 16777215 rpm, hmm scheint doch etwas viel^^; hab grad keine vorstellung,, wie schnell son teil dreht (bin leider zu jung um sowas zu fahren^^).

dann braucht man nen timer, der alle jede sekunde überläuft (Timer 1 im ctc modus glaub ich), der gibt dann den wert der rpm irgendwo aus und setzt den wert wieder auf 0, oder man lässt ihn alle halbe sekunde überlaufen und multiplizert die umdrehungszahl mit 2 und hat die rpm, dann sollte man wohl dicke mit nem 16-bit register auskommen^^
man könnte dann vielleicht noch ne rundung oder eine interpolation(?) über die zeit hinzufügen, damit der wert nicht so springt und man besser lesen kann.

mit uart oder lcd könnte das in assembler vielleicht maximal ne gute DinA4 seite sein, wenn man die ansteuerungsroutinen nicht dazurechnet.
in basic sollte das n fliegenschiss sein und in c auch nich sonderlich viel, da hat man allerdings auch wieder die ansteuerungsroutinen/libs für lcd bzw uart oder was man sonst haben will.

basic code könnte ich jez nich posten, weil ich in C progge (und gelegentlcih assembler), aber ich bin ja auch nich gefragt^^

Ele

wkrug
01.12.2008, 21:42
Die Impuls Zählmethode mit fester Torzeit ist sicher die einfachste Möglichkeit einen Drehzahlmesser zu bauen.
Dabei gibts allerdings den Nachteil, das man nur Schritte mit 60U/min dabei hat.
Und auch nur dann, wenn man als Torzeit 1sek verwendet.

Bei 0,5sek und 1 Impuls pro Umdrehung sind es dann schon 120 U/min.

Ich bin da lieber für die Periodendauermessung.

Man lässt einen Timer mit Überlaufzähler frei laufen.
tritt ein Impuls auf wird der Zählerstand des vorherigen Impulses vom aktuellen Zählerstand abgezogen.
Verwendet man dazu unsigned Variablen ist auch der Überlauf des Zählers kein Problem.
Dieser Wert entspricht quasi der Periodendauer der Drehzahl und kann in diese Umgerechnet werden.
Diese Methode ist gerade bei niedrigen Drehzahlen sehr genau und man erhält bei jedem Impuls eine Aussage über die Drehzahl.

Ab einer bestimmten Drehzahl werden die ermittelten Zählerstände wiederum so klein, das die Impulszählmethode wieder genauer ist.
Bei meinem letzten Projekt lag diese Drehzahl bei 22000 U/min.
Und da wir auch ein kleiner 2 Takter nur schwer drüber kommen.

Ein Problem der Periodendauermessung möchte ich auch nicht verschweigen. Wenn die Drehzahl so niedrig ist, das der Zähler in einer Periodendauer überläuft, kommt es natürlich zu Fehlmessungen.

Das sollte man in der Soft berücksichtigen und abfangen.

Eine BASCOM Source kann ich Dir leider auch nicht anbieten, ich progge auch in "C".
Ausserdem hab ich die letzte gut funktionierende Drehzahlmeßroutine in Assembler geschrieben. Die geht aber auch bis 800000 U/min hoch.

xtremecoder
01.12.2008, 23:05
also wenn ich jetzt den controller in C programmiere ist das kein problem :-) wäre auch mit einem schnipsel in C zufrieden ^^
würde mir sehr helfen, da ich leider nicht viel ahnung davon habe wie das ganze funktioniert^^

ich bn nicht recht fit mit microcontroller und muss mir erst mal diese ganzen timer und interrupt sachen anschauen^^

ich glaube ich mache es schon mit der periodendauermessung, da mein motor sicher nicht unter diesen bereich in der es fehler gibt mit der drehzahl kommt, und da er auch keine 22000 u/min macht ^^

würde mich sehr über einen beispielcode freuen :-)


vielen dank!!

-alexander

Jaecko
02.12.2008, 07:47
ALso den Drehzahlmesser hab ich damals auch in Bascom gemacht.
Der "Nachteil" mit der Auflösung war mir im Prinzip egal. Da es ja eigentlich keinen Unterschied macht, ob der Motor jetzt mit 3400 oder 3460 dreht.

Also mal ein Codeteil (Kann sein, dass irgendwo noch kleine Fehler sind, also ein = zuviel o.ä., aber seit Februar hab ich Bascom eigentlich nicht mehr verwendet)



' INT0 initialisieren
Config INT0 = Falling ' oder Rising; an sich egal
On INT0 ISR_Int0 ' Bei Auslösung: Springe nach ISR_Int0
Enable INT0 ' INT0 einschalten
Enable Interrupts ' Interrupts global freigeben

' Timer einstellen
Config Timer1 = ... je nach gewünschter Dauer...
On Timer1 ISR_Timer1
Enable Timer1

DIM Pulse as Word ' Zählvariable
DIM Drehzahl as Word

DO
'Main-Loop, irgendwas machen, z.B. Ausgaben etc
LOOP

ISR_Int0:
INCR Pulse ' Pulse um 1 erhöhen
Return

ISR_Timer1:
Drehzahl = Pulse * Faktor ' (Faktor je nach Motortakte/Zylinderzahl/Messzeit)
Pulse = 0
Return




So lassen sich schon mal die Pulse zählen. Jetzt nur noch nen Timer mit der gewünschten Zähllänge dazu, dort die Anzahl der Pulse auswerten und die Variable 'Pulse' wieder auf 0 setzen.

Thoralf
02.12.2008, 08:12
zum Abgriff des Signal von der Zündung steht hier auch was:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=44170&highlight=

Wenn deine Kiste nicht grade ne Magnetozündung hat (wo ich mir den Signalabgriff schwierig vorstelle), geht es im Prinzip so wie Jacko sagt. Nur .... dort liegt eine ziemlich hohe Selbstinduktionsspannung an. Die wird zwar bei modernen Zündanlagen Per Zenerdiode geclipped aber nicht auf 0...5V.
Wenn du dort das Signal abgreifst, dann über Vorwiderstand von sagen wir 10 kOhm und 5V-Zenerdiode gegen Masse. Dann überlebts auch der ATMega.

Prinzipiell würde ich IMMER bei Basteleien, die nicht nur am grünen Tisch laufen sollen, alle Analogeingänge durch Zenerbarrieren schützen. Ein wegen Induktions- oder anderer Störspannungen zerknallter µC kostet mehr als ne lappsche Zenerdiode.

wkrug
02.12.2008, 08:23
Wenn deine Kiste nicht grade ne Magnetozündung hat (wo ich mir den Signalabgriff schwierig vorstelle), geht es im Prinzip so wie Jacko sagt.
Wenn das Ding ein Polrad hat, was ich annehme, sollte es am einfachsten mit einem Magnetfeldsensor machbar sein.
Das Teil läuft mit 5V und Angst wegen vagabundierender Hochspannung braucht man auch nur wenig haben, es sei denn man legt die Signalleitungen direkt neben das Zündkabel.

Zum Thema Codeschnipsel:

Zuerst die beiden Interruptroutinen zur Ermittlung der Drehzahlen:

/* Turn registers saving off */
#pragma savereg-
// External Interrupt 1 service routine Drehzahlmesser impulseingang
interrupt [EXT_INT1] void ext_int1_isr(void)
{
new_drimp=1;
#asm
PUSH r26
IN r26,SREG
PUSH r26
PUSH r27

;*** Erste Phase der Drehzahlermittlung mittels Timerabfrage = Periodendauermessung ***
IN r26,TCNT0 ;Aktuelle Zeit holen
LDS r27,(_li_oldtimer) ;Vorherigen Wert holen
STS (_li_oldtimer),r26 ;Vorheriger alten Wert überschreiben
SUB r26,r27 ;Unterschied berechnen
STS (_li_drwert),r26 ;Die berechnung als Wert abspeichern

LDS r26,(_li_timer+1) ;Das gleiche für die 2te Stelle _li_timer+1 ist der überlauf des TCNT0
LDS r27,(_li_oldtimer+1)
STS (_li_oldtimer+1),r26
SBC r26,r27
STS (_li_drwert+1),r26

LDS r26,(_li_timer+2) ;Das gleiche für die 3te Stelle
LDS r27,(_li_oldtimer+2)
STS (_li_oldtimer+2),r26
SBC r26,r27
STS (_li_drwert+2),r26

LDS r26,(_li_timer+3) ;Das gleiche für die 4te Stelle
LDS r27,(_li_oldtimer+3)
STS (_li_oldtimer+3),r26
SBC r26,r27
STS (_li_drwert+3),r26

;*** Zweite Phase der Drehzahlermittlung mittels Pulszählung ***
LDS r26,(_ui_intpulses)
INC r26
STS (_ui_intpulses),r26
BRNE ENDINT1
LDS r27,(_ui_intpulses+1)
INC r27
STS (_ui_intpulses+1),r27
ENDINT1:
POP r27
POP r26
OUT SREG,r26
POP r26
#endasm;
}



// Timer 0 overflow interrupt service routine Drehzahlmesser Pulsdauermessung
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
#asm
PUSH r26
IN r26,SREG
PUSH r26
LDS r26,(_li_timer+1)
INC r26
STS (_li_timer+1),r26
BRNE ENDINT0
LDS r26,(_li_timer+2)
INC r26
STS (_li_timer+2),r26
BRNE ENDINT0
LDS r26,(_li_timer+3)
INC r26
STS (_li_timer+3),r26
ENDINT0:
POP r26
OUT SREG,r26
POP r26
#endasm
}
/* re-enable register saving for the other interrupts */
#pragma savereg+


Nun der Teil der für die Sekundenzählung ( Torzeit ) und Mittelung der Drehzahlimpulse zuständig ist.

// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
/* 1 Sekunde */
ui_timer++;
if (new_drimp>0)
{
li_drmittel+=li_drwert; /* Aufaddierung für Drehzahlmittelwertbildung */
uc_stellen++; /* Aufaddierung der Stützstellen */
new_drimp=0; /* Neue Drehzahl Flag löschen*/
};
if (ui_timer>19)
{
ui_drpulses=ui_intpulses;
ui_intpulses=0;
ui_timer=0;
new_sec=1;
uc_overflow++;
}
}


Nun die Berechnung der Drehzahl


//Drehzahlermittlung
if (ui_drpulses<3) /* Drehzahlen unter 120 U/min werden ignoriert */
{
li_drehzahl=0;
}
else
{
if (ui_drpulses<350) /* Entscheidung welches Drehzahlermittlungsverfahren angewendet wird bei 21000 U/min*/
{
li_drmittel=li_drmittel/uc_stellen; /* Mittelwert der Drehzahlmessungen errechnen */
li_drehzahl=7500000/(li_drmittel*uc_blatt); /* Periodendauermessung */
}
else
{
li_drehzahl=ui_drpulses; /* Pulszählung in Torzeit ( 1Sekunde )*/
li_drehzahl=(li_drehzahl*60)/uc_blatt;
}
}
ui_drpulses=0; /* Pulszählung zurücksetzen */
li_drmittel=0; /* Mittelwertbildner zurücksetzen */
uc_stellen=0; /* Stützstellenzähler zurücksetzen */


Und die dazugehörige Timer initialisierung

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125,000 kHz
TCCR0=0x03;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
// CTC Mode : On
TCCR1A=0x00;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0xC3;
OCR1AL=0x4F;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x11;



Die Routine arbeitet mit beiden möglichen Messmethoden und schaltet ab 350 Impulsen pro Sekunde ( ~21000 U/min ) zwischen den beiden Berechnungsverfahren um.
Der Controller läuft mit einem externen 8MHz Quarz.

xtremecoder
02.12.2008, 16:20
hallo! ich habe mir den code angeschaut und finde den code von jaecko recht übersichtlich, eines brauche ich allerdings noch, und zwar wie ich den timer1 so einstelle dass er mir jede halbe sekunde überläuft? oder auch jede sekunde, das muss ich dann später anpassen...aber was schreibe ich denn da?

Config Timer1 = ???

keine ahnung was ein polrad ist, ich kann nur sagen es ist ein vespa motor, also ein älterer, baujahr ~ 1980. ist bei diesen motoren sowas üblich?

wahrscheinlich trenne ich dann den zündstromkreis und den microcontroller galvanisch mit einem optokoppler, aber um das möchte ich mich später kümmern ^^

vielen dank!!!!


vielen dank :-)

@wkrug: vielen dank für deinen code! hobe jetzt aber doch mal probiert, das in bascom zu realisieren, da ich es sehr angenehm finde. aber deinen code könnte ich mir zu herzen nehmen! vielen vielen dank!!

oZe
02.12.2008, 17:14
Also bei sooo ner alten Vespa bin ich mir nicht sicher ob die schon ne CDI haben da bin ich ein bischen überfragt momentan aber da is google dein freund ;-)
Du kannst mir auch mal das Modell schreiben oder einfach in meinem Forum nachfrage: www.scooter-point.de (Moderator Matthias-SP) dann kann ich dir eventuell dort helfen.

Jaecko
02.12.2008, 17:25
Also der Timer-Init müsste so aussehen:



Config Timer1 = Timer, Prescale = x ' Normaler Timer mit Prescaler x
Timer1 = y ' Timer mit y vorladen


In der ISR des Timers gehört noch als erste Zeile ebenfalls "Timer1 = y" rein.

Bei beiden musst du aber x bzw. y noch gegen die folgenden Werte austauschen, abhängig von der CPU-Frequenz:

1 MHz: x = 8, y = 3036
4 MHz: x = 64, y = 34286
8 MHz: x = 64, y = 3036
16 MHz: x = 256, y = 34286

xtremecoder
03.12.2008, 14:51
@oZe: ja ist nicht besonders modern, glaub auch nicht dass die so was hat.

danke jeacko! jetzt funktioniert es! aber ich verstehe nicht wie ich die zahlen abändern muss wenn ich z.b. den timer in 1s zeitintervall überladen will, oder z.b. 1/4 s

Jaecko
03.12.2008, 15:07
Da gibts 2 Möglichkeiten...
#1 Umständlich per Datenblatt raussuchen und rechnen
#2 meine Favoritenlösung: Programm "RNAVR", gibts auch hier zum Download: https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=169

xtremecoder
03.12.2008, 17:37
hab das noch nicht ganz verstanden...in diesem programm muss ich die frequenz eingeben, dann bekomm ich bestimmte werte, aber die anzahl an interrupts pro sekunde(frequenz) ist doch variabel, immerhin sind di umdrehungen pro minute des motors doch nicht konstant.
ich müsste die zeit halbieren bzw. verdoppeln, in der der timer überläuft

oZe
03.12.2008, 17:59
Ne da haste wirklich was nicht verstanden:
Du hast einen Timer der sagen wir mal einmal pro Sekunde überläuft. Dann hast du zusätzlich noch deinen Interrupt eingang an dem du die Zündimpulse entgegen nimmst. Jetzt startest du deinen Timer und beginnst zu zählen wieviele Interrupts von der Zündung ausgelöst werden. Nach einer Sekunde löst dein Timer dann seinen Interrupt aus und du kannst schauen wieviele Zündsignale du bis dahin erhalten hast. Das multiplizierst du einfach mit 60 und schon hast du deine Drehzahl pro Minute. Danach einfach wieder deinen Zähler zurücksetzten und das spiel geht von vorne los ;-)

xtremecoder
03.12.2008, 18:20
jaja klar das habe ich schon verstanden :-)

aber im moment löst mein timer im abstand von einer halben sekunde sein interrupt aus, aber wie schaffe ich es, dass er es jede sekunde, oder jede viertel sekunde auslöst? :-)

edit: srysry, habe schon verstanden! habe ursprünglich gemeint das wären nicht dir timer interrupts sondern die interrupts dir mit dann das zündsignal auslöst:-)
danke

xtremecoder
04.12.2008, 16:09
hey leute!

mein programm läuft nun auf meinem microcontroller, mit den leds und so. habe zum testen einen kleinen rechteckspannungsgenerator gebaut, und meinen microcontroller daran angeschlossen.
die frequenz ist dabei variabel, also kann ich das ganze gut damit testen.

nun habe ich mal ba der zündspule nachgeschaut, es gibt dabei ein kleines problem, meine zündspule hat gar keine klemme 1...genau genommen gibt es nur habe ich nur einen anschluss für die masse, einen für dein eingang (kA was das ist, ist das nicht die spannung am fahrzeug, also für das licht usw..? oder ist das schon der impuls?) und der ausgang mit der hohen spannung in den zylinder...

also da habe ich keine andere klemme, kein ausgangssignal mit der frequenz der zündungen...oder dieser zweite anschluss ist es vielleicht, aber glaube ich weniger...

dann bleibt halt noch die möglichkeit, dass ich um den kabel, der von der zündspule in den zylinder geht eine spule herumgebe, und ich dann die jeweils induzierte spannung auswerte....

wie mache ich das am besten? könntet ihr mir helfen? habe sowas noch nie gemacht mit einer induzierten spannung gearbeitet....

vielen dank!!!

-alexander