-
Hallo,
Ich habe meinen Drehzahlmesser jetzt soweit fertig. Und um es vorweg zu nehmen, das klappt auf die Drehzahl genau. (+/- 2 U/M) .ich habe ihn aber noch nicht am Motor getestet. Bis jetzt nur mit Frequenzgenerator die Drehzahl simuliert. Aber ob die Impulse vom Motor kommen oder vom Frequenzgenerator ist ja egal.
Anfangs war das ganze ziemlich ungenau, aber das lag daran, daß ich den internen Oszillator benutzt habe. Jetzt mit einem externen Quarz ist das genau. Der interne Oszillator scheint ziemlich viel von seiner Frequenz abzuweichen.
Was ich jetzt nicht verstehe sind Aussagen wie " bascom verschlingt intern zuviel zeit." Ich habe ja bei 18000 u/minute nur 300 Hz. Da müßte doch jeder Controller locker mit kommen, selbst wenn er nur mit 1 Mhz läuft.
Ich habe das so gemach, daß ich die Dauer einer Umdrehung messe. Also auf steigender Flanke warten und den Timer starte, auf die nächste steigende Flanke warten und dann den Timer auslesen und auf null setzen. Dann Berechnung durchführen, Drehzahl anzeigen und so weiter. Das kann ruhig einige Zeit dauern, auch wenn da einige Umdrehungen nicht gemessen werden, ist das nicht schlimm, denn ich zeige die Umdrehung ja nur alle 300-400 ms an, damit die anzeige ruhig steht und nicht flackert.
Von dem Prinzip währen einer gewiesenen Zeit die Impulse zuzählen, hallte ich nicht viel. Zumale wenn sich die Drehzahl in kurzen Abstände oft ändert. Denn dann muß man die Messzeit sehr kurz halten, und wenn da ein paar Impulse fehlen, und man das auf eine Minute hohe rechnet ist die Fehlerquote groß.
Bei konstanter Drehzahl mach das sicher Sinn. Wo man die Impulse während einer Minute mißt und die dann anzeigt.
Mit freundlichen Grüßen
Guy
-
Hallo,
toll, dass es bei dir jetzt funktioniert. Könntest du vielleicht deinen Code veröffentlichen?
Gruss
Florian
-
Hallo Florian,
Ich werde den Code mal hier rein setzen, das kann aber ein paar Tage dauern. Ich muß nur meinen Loptop mal mit zur Arbeit bringen, denn Zuhause habe ich kein Internet. Ich will kein Internet Zuhause, denn sonst hänge ich zuviel auf dem Computer.
Bis dann,
Guy
-
@Guy: Für das kann ich dir nur diese USB-Sticks empfehlen, wie es sie erstens überall und auch manchmal beim Aldi gibt. Wirklich praktisch, das Zeug.
-
Ja, ist eine Gute Idee. Ich habe ja erst meinen Computer vor einem Monat gekauft. Und das nur um meinen Datalogger vom Modellauto auszulesen. Ich wolle meine Freizeit nicht mehr wie Früher nur am Computer verbringen. Darum habe ich auch kein Internetanschluß .
Und da ich eine Schaltung für den Datalogger brauchte, habe ich auch wieder angefangen Controller zu progen.
Werde mir mal gleich im Supermark so einem USB-Sticks besorgen.
Danke für die Idee, und einen schönen Tag noch.
Guy
-
Hier mal meinen Code für den Drehzahlmesser.
Der soll die Drehzahl messen und dann die 5 oder 10 maximal Drehzahlen speichern. Das ist wichtig damit ich sehe ob das Modellauto mit der Übersetzung die Maximale Drehzahl erreicht. (Fehlt aber noch im Programm).
Dann soll der Drehzahlmesser zwischen z.B. 8000 und 9000 U/m eine Lampe an schalten. (einstellbar) Das ist um die Fliehkraftkupplungs einstellung zu vereinfachen. Denn die Kupplung darf nicht zu früh kuppeln und auch nicht zu spät.
Ich setzt mal den ganzen Code hier rein, wichtig ist aber nur der Code zwischen dem do –loop. Also die Hauptschleife.
Das Prinzip ist einfach. Auf Steigende Flanke (oder fallende Flanke) warten dann Timer starten, auf fallende Flanke warten, und wieder auf Steigende Flanke warten. Dann Timer aus lesen. Im Timer steht die Zeit von einer Umdrehung. Umdrehung ausrechnen usw.. Wenn das schneller geht als das Hi von der Steigende Flanke braucht, sollte man wieder auf fallende Flanke warten bevor man neu beginnt.
Ich arbeite erst seit 2-3 Wochen mit Bascom. Wenn einer was sieht was man besser machen kann, nur zu. Freue mich für jeden Vorschlag.
Code:
$regfile = "m16def.dat"
$crystal = 8000000
$baud = 19200
Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Porta.2 , Db6 = Porta.4 , Db7 = Porta.6 , E = Portc.7 , Rs = Portc.6
'Config Lcd = 16 * 2
Config Lcd = 16 * 1
'$sim
Dim Count1 As Single
Dim Rpm As Word
'Dim Temp As Single
Dim Uberlauf As Bit
Dim Menuselect As Byte
Dim Zylinder As Byte
Dim Lampe_an As Word
Dim Lampe_aus As Word
Config Timer1 = Timer , Prescale = 8
'On Timer1 Timer1_isr
Config Pind.4 = Output
Portd.4 = 1
Set Portb.0
Config Pinb.0 = Input ' eingang fur drehzahl
' ********* Menu Tasten *************
Config Pind.2 = Input
Set Portd.2
Config Pinb.4 = Input
Set Portb.4
Config Pinb.5 = Input
Set Portb.5
Config Pinb.6 = Input
Set Portb.6
Config Pinb.7 = Input
Set Portb.7
' ********* end Menu Tasten *************
On Int0 Menu_int0
Enable Int0
Enable Timer1
Enable Interrupts
Stop Timer1
Do
Bitwait Pinb.0 , Reset
Start Timer1
Timer1 = 0
Bitwait Pinb.0 , Set
Bitwait Pinb.0 , Reset
Stop Timer1
Count1 = Timer1
Count1 = 1000000 / Count1
Count1 = Count1 * 60
Rpm = Int(count1)
Cls
Cursor Off Noblink
Lcd Rpm ; " RPM"
If Rpm > Lampe_an And Rpm < Lampe_aus Then
Portd.4 = 0
Else
Portd.4 = 1
End If
Waitms 300
Bitwait Pinb.0 , Set
Loop
End 'end program
Timer1_isr:
Cls
Lcd "Fehler"
Waitms 100
Rpm = 0
Count1 = 0
Return
Menu_int0:
Menuselect = 0
Do
Waitms 100
If Pind.2 = 0 Then
Incr Menuselect
Do
Loop Until Pind.2 = 1
End If
If Menuselect > 6 Then
Menuselect = 1
End If
Select Case Menuselect
Case 1 'Max_drehzahl
Cls
Lcd "Drehzahl"
If Pinb.4 = 0 Then
Do
Loop Until Pinb.4 = 1
Gosub Max_drehzahl
End If
Case 2 'Motortype
Cls
Lcd "Motortype"
If Pinb.4 = 0 Then
Do
Loop Until Pinb.4 = 1
Gosub Motor_type
End If
Case 3 'Zylinder Zahl
Cls
Lcd "Zyl. Zahl"
If Pinb.4 = 0 Then
Do
Loop Until Pinb.4 = 1
Gosub Zyl_zahl
End If
Case 4 ' Lampe an
Cls
Lcd "Lampe an"
If Pinb.4 = 0 Then
Do
Loop Until Pinb.4 = 1
Gosub Lampe_an
End If
Case 5 ' Lampe aus
Cls
Lcd "Lampe aus"
If Pinb.4 = 0 Then
Do
Loop Until Pinb.4 = 1
Gosub Lampe_aus
End If
Case 6 ' ruruck
Cls
Lcd "return"
If Pinb.4 = 0 Then
Exit Do
End If
End Select
Loop
Return
Max_drehzahl:
'Cls
'Lcd "Max Drehzahl"
'Waitms 100
Return
Motor_type:
'Cls
'Lcd "Motor type"
'Waitms 100
Return
'***************************************
Zyl_zahl:
Cls
Do
Cls
Lcd "Zylinder"
Lcd Zylinder
Waitms 100
If Pinb.5 = 0 Then
Incr Zylinder
If Zylinder > 8 Then
Zylinder = 1
End If
Do
Loop Until Pinb.5 = 1
End If
If Pinb.6 = 0 Then
Decr Zylinder
If Zylinder = 0 Then
Zylinder = 8
End If
Do
Loop Until Pinb.6 = 1
End If
If Pinb.4 = 0 Then
Do
Loop Until Pinb.4 = 1
Exit Do
End If
Loop
Return
'*******************************************
Lampe_an:
Cls
Do
Cls
Lcd "Lam. An "
Lcd Lampe_an
Waitms 100
If Pinb.5 = 0 And Pind.2 = 0 Then
Lampe_an = Lampe_an + 100
If Lampe_an > 23000 Then
Lampe_an = 0
End If
End If
If Pinb.6 = 0 And Pind.2 = 0 Then
Lampe_an = Lampe_an - 100
If Lampe_an =< 0 Then
Lampe_an = 23000
End If
End If
If Pinb.5 = 0 And Pind.2 = 1 Then
Incr Lampe_an
If Lampe_an => 23000 Then
Lampe_an = 0
End If
End If
If Pinb.6 = 0 And Pind.2 = 1 Then
Decr Lampe_an
If Lampe_an =< 0 Then
Lampe_an = 23000
End If
End If
If Pinb.4 = 0 Then 'zuruck
Do ' enprellen
Loop Until Pinb.4 = 1
Dta1:
Data Lampe_an
Exit Do
End If
Loop
Return
'*******************************************
Lampe_aus:
Cls
Do
Cls
Lcd "Lam. aus "
Lcd Lampe_aus
Waitms 100
If Pinb.5 = 0 And Pind.2 = 0 Then
Lampe_aus = Lampe_aus + 100
If Lampe_aus > 23000 Then
Lampe_aus = 0
End If
End If
If Pinb.6 = 0 And Pind.2 = 0 Then
Lampe_aus = Lampe_aus - 100
If Lampe_aus =< 0 Then
Lampe_aus = 23000
End If
End If
If Pinb.5 = 0 And Pind.2 = 1 Then
Incr Lampe_aus
If Lampe_aus => 23000 Then
Lampe_aus = 0
End If
End If
If Pinb.6 = 0 And Pind.2 = 1 Then
Decr Lampe_aus
If Lampe_aus =< 0 Then
Lampe_aus = 23000
End If
End If
If Pinb.4 = 0 Then 'zuruck
Do ' enprellen
Loop Until Pinb.4 = 1
Exit Do
End If
Loop
Return
-
Ja,
ich wäre auch an dem Code interessiert, da ich auch eine Drehzahlmessung per CNY70 vor habe.
Majus