PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Drehzahlmesser mit Mega32



Schorschi
27.05.2006, 22:53
Hallo.

Bin dabei mir einen Drehzahlmesser zu bauen.
Die Hardware hab ich schon fertig (Mega32, 4mal 7-Segmentanzeige).
Hab mich mal im Forum belesen und folgenden Code geschrieben.
Ich zähle damit die eingehenden Impulse von der Zündspule meines Motors über dem externen Interrupt. Als Zeitbasis nehme ich eine Sekunde (8MHz, Prescale=256, und 34285 als Zähleranfang). Das müsste dann ungefähr eine Sekunde ergeben.

Nun mein Problem:

Hab am Anfang meiner Test´s mit dem Programm nicht gemerkt, dass ich das Fusebit für den internen Takt nicht ausgeschaltet hatte. Ich bekam nur falsche Werte.
Also hab ich mit nem anderem Programm und ner Stoppuhr rumprobiert bis ich auf vernünftige Timer-Einstellungen kam.

Jetzt hab ich aber das Fusebit geändert. Arbeite also mit 8 MHz und die ausgegebene Drehzahl passt wieder überhaupt nicht.
Also hab ich wieder die Stoppuhr genommen. Diesmal passen aber die Timerwerte.
Ein Zählerüberlauf mit 8MHz, Prescale=256, und 34285 als Zähleranfang dauert genau eine Sekunde im Testprogramm, aber mein Drehzahlmesser geht voll daneben. Er zeigt ca. das Doppelte an oder sogar etwas mehr.
Braucht der Mega32 mit externem Quarz mehr als einen Takt um den Timer um eins zu erhöhen?
Wer kann mir sagen was ich falsch mache?



$regfile = "m32def.dat"
$framesize = 128
$swstack = 128
$hwstack = 128
$crystal = 8000000
$baud = 9600


Config Int0 = Falling
Config Timer1 = Timer , Prescale = 256
Config Portb = Output
Config Porta = Output

Enable Interrupts

Portd.2 = 1
Const Zaehleranfang = 34285
Timer1 = Zaehleranfang

Dim Ups As Integer
Dim Upm As Integer
Dim Einer As Integer
Dim Zehner As Integer
Dim Hunderter As Integer
Dim Tausender As Integer

Porta = &B00000000
Portb = &B00000000
Ups = 0

On Int0 Interruptroutine
Enable Int0
On Timer1 Timerueberlauf
Enable Timer1

Do


Einer = Upm Mod 10
Zehner = Upm Mod 100
Zehner = Zehner / 10
Hunderter = Upm Mod 1000
Hunderter = Hunderter / 100
Tausender = Upm Mod 10000
Tausender = Tausender / 1000


Portb = &B00000001
Porta = Einer
Waitus 100

If Zehner > 0 Or Hunderter > 0 Or Tausender > 0 Then
Portb = &B00000010
Porta = Zehner
End If
Waitus 500

If Hunderter > 0 Or Tausender > 0 Then
Portb = &B00000100
Porta = Hunderter
End If
Waitus 500

If Tausender > 0 Then
Portb = &B00001000
Porta = Tausender
End If
Waitus 500



Loop

Interruptroutine:
Incr Ups
Return

Timerueberlauf:
Upm = Ups * 60
Timer1 = Zaehleranfang
Ups = 0
Return



End


Danke für eure Hilfe

Lord Crumb
28.05.2006, 11:32
Hallo
deine Timervorgabe ist falsch, bei deiner Timervorgabe kommt
alle 1,09712s ein Interrupt, du musst ihn mit 34286 vorladen
das sollte eine Sekunde sein.
Zu der Drehzahl, was für ein Motor ist das, du musst bedenken das
z.B ein 4Takt Motor mit 2 Zylindern bei einer Zündung 2 Kurbelwellen Umdrehungen macht.
Dein Motor müsste ja dann bei einer Zündung eine halbe Kurbelwellenumdrehungen machen.
Da hätte ich noch eine frage wie greifst du das Zündspulen signal ab
Induktiv oder direkt, könntest du den Schaltplan posten.

MfG
Sandor

Schorschi
28.05.2006, 15:42
Ist ein Einzylinder, Zweitakter. also pro Zündimpuls eine Umdrehung.
Ich nehme das Zündsignal über einen Spannungsteiler an der Zündspule ab.
Dann entprelle ich über einen 74122. Das 5V Rechtecksignal gebe ich dann auf den exteren Interrupt am Mega32.

Hanni
28.05.2006, 20:46
Ist ein Einzylinder, Zweitakter. also pro Zündimpuls eine Umdrehung.

Hmm, Hatte ein Zweitakter nicht jede zweite Umdrehung einen Zündimpuls oder hab ich da jetzt nen Denkfehler ?

Schorschi
28.05.2006, 23:51
Ein Zweitakter zündet bei jeder Umdrehung.
1.Takt: Kolben bewegt sich nach unten und verrichtet Arbeit. Luft-Kraftstoffgemisch wird über die Überströmkanäle aus dem Kurbelwellenraum in den Brennraum gedrückt.
2.Takt: Kolben bewegt sich nach oben und saugt Gemisch in den Kurbelwellenraum. Gleichzeitig wird verdichtet und am OT gezündet