-
        

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: Ganz simpler Drehzahlmesser

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178

    Ganz simpler Drehzahlmesser

    Anzeige

    Hallo,

    ich bräuchte einen ganz einfachen Drehzahlmesser und habe auch mal die SuFu bemüht. Ich will die Drehzahl von meinem Roller auslesen (2Takt - 1 Zylinder), dass heisst ja das ich pro Impuls eine Umdrehung habe oder?
    Das Ganze soll dann am besten auf 4 7-Segment Anzeigen angezeigt werden (Ist Preiswerter als LCD und auch schneller oder?).
    ich möchte gerne einen AtMega8 benutzen.


    Mit der SuFu habe ich folgendes gefunden:

    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
    Welchen Teil davon brauche ich, da steht ja noch ziemlich viel anderer Code drinne, aber ich brauche ja nur den Drehzahlmesser Ohne LCD,Lampen etc.?
    Und wie steuer ich denn am Besten die 7 Segmentanzeigen an? Der Mega8 hat ja keine 28 IO Pins die ich dafür nehmen könnte (Wäre ja auch eine ziemliche verschwendung).

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Im Grunde recht einfach: du definierst einen Interrupt auf INT0 oder INT1, mit dem zählst du einfach die Impulse, die vom Unterbrecher kommen. Weiters einen Timer, der in Zeit-Intervallen die gezählten Impulse auf Geschwindigkeit umrechnet und herzeigt, der Zähler stellt er wieder auf Null.
    Und die Anzeige machst du mit "multiplexen", da brauchst du 7 Pin für die Segmente und 4 zur Auswahl der Anzeige.
    Ich glaub, das sollt' sich beim Mega8 ausgehen. Eventuell, wenn die LED größer sind, 4 Treiber-transistoren. That's it.
    Im Detail kann man dir dann noch helfen.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178
    hmm... klingt alles leichter als es ist wenn man ein totaler Anfänger is :P

    Ich habe einen fertigen Code für einen DZM mit 5 7-Segment Anzeigen gefunden die auch gemultiplext werden, also genau das was ich suche.
    Blos ist das für einen Motor mit 4 Zylindern und ich weiss nicht genau wie ich den Code umändern muss das er bei mir stimmt. Wäre nett wenn ihr mir helfen könntet.

    Hier mal der Code:

    Code:
        '           Drehzahlmesser für 4-Zylinder Motoren
          '           (c) formtapez (Oktober 2003)
          '		  5-stellige Version (ungetestet)
    
          '           Hardware:
          '           ---------
          '           PD0:     gelbe LED (ab 6250 Umdr./min.)
          '           PD6:     Signaleingang
          '           PB0-PB6: 7-segment - Segment A bis G
          '           PD1-PD5: 7-segment - Ziffer - Select
    
    
          $regfile = "2313def.dat"                      'AT90S2313
          $crystal = 8000000                            '8MHz Quarz
          Ddrb = &B11111111                             'PortB = Ausgang
          Ddrd = &B0111111                              'PortD = Ausgang bis auf PD6
    
          Dim Icount As Long At &H60
          Dim Wcountlo As Word At &H60 Overlay
          Dim Wcounthi As Word At &H62 Overlay
          Dim Temp As Integer At &H80
          Dim Temp2 As Integer At &H80 Overlay
          Dim Y As String * 5 At &H70
          Dim Z(5) As Byte At &H70 Overlay
          Dim Frequenz As Long
          Dim Freq As Word
          Dim Freq1 As Word
          Dim Freq2 As Word
          Dim Timeout As Byte
          Dim Impulse As Byte
          Dim X(5) As Byte
          Dim Test As Integer
          Dim Test2 As Integer
          Dim Zaehler As Byte
          Timeout = 0
    
          On Icp1 Oncapture
          On Ovf1 Onoverflow
          Config Timer1 = Timer , Prescale = 8 , Capture Edge = Rising
          Enable Icp1
          Enable Ovf1
          Enable Interrupts
    
    
    '*******************
    '* Start-Animation *
    '*******************
    
          Do
             Portb = 1
             Portd = 2
             Waitms 50
             Portd = 4
             Waitms 50
             Portd = 8
             Waitms 50
             Portd = 16
             Waitms 50
             Portb = 2
             Waitms 50
             Portb = 64
             Waitms 50
             Portd = 8
             Waitms 50
             Portd = 4
             Waitms 50
             Portd = 2
             Waitms 50
             Portb = 16
             Waitms 50
             Portb = 8
             Waitms 50
             Portd = 4
             Waitms 50
             Portd = 8
             Waitms 50
             Portd = 16
             Waitms 50
             Portb = 4
             Waitms 50
             Portb = 64
             Waitms 50
             Portd = 8
             Waitms 50
             Portd = 4
             Waitms 50
             Portd = 2
             Waitms 50
             Portb = 32
             Waitms 50
          Loop Until Temp2 = 1                          'Bis zum 1. Impuls
    
    
    
    '******************************************
    '* Hauptschleife - LED-Anzeigen ansteuern *
    '******************************************
    
    Main:
    Incr Timeout                                        'Bei Timeout: 0 U/min.
     If Timeout = 10 Then
      Timeout = 10
      Freq = 0
      Y = Str(freq)
      Z(1) = 0
      Z(2) = 0
      Z(3) = 0
      Z(4) = 0
      Z(5) = 48
     End If
    
    For Test2 = 1 To 5                                          'Wert sichern .....
     X(test2) = Z(test2)
    Next Test2
    
    For Test2 = 1 To 400                                        '..... und 400 mal Anzeigen
     For Zaehler = 1 To 5
      Test = X(zaehler)
      Select Case Test
       Case 48 : Portb = 63
       Case 49 : Portb = 6
       Case 50 : Portb = 91
       Case 51 : Portb = 79
       Case 52 : Portb = 102
       Case 53 : Portb = 109
       Case 54 : Portb = 125
       Case 55 : Portb = 39
       Case 56 : Portb = 127
       Case 57 : Portb = 111
       Case Else : Portb = 0
      End Select
      Portd.zaehler = 1
      Waitus 100                                        'Zeit für jede Anzeige
      Portd.zaehler = 0
     Next Zaehler
    Next Test2
    
    Goto Main
    
    
    
    
    '*************************************
    '* Interrupt-Routine (Zeiten messen) *
    '* (wird bei jedem Impuls ausgelöst) *
    '*************************************
    
    Oncapture:
     Disable Icp1
     Incr Impulse
     If Impulse = 8 Then
      Impulse = 0
      Timeout = 0
      Wcountlo = Timer1
      Timer1 = 0
      Frequenz = 240000000 / Icount                             'Umrechnung für 4-Zylinder
      Wcounthi = 0
    
      Freq2 = Freq1
      Freq1 = Frequenz
      Frequenz = Freq1 + Freq2
      Frequenz = Frequenz / 2
      Freq = Frequenz
    
      If Freq > 5999 Then Portd.0 = 1 Else Portd.0 = 0          ' gelbe LED ab 6000 U/min
      If Freq < 150 Then
       Freq = 0
       Y = Str(freq)
       Z(1) = 0
       Z(2) = 0
       Z(3) = 0
       Z(4) = 0
       Z(5) = 48
    
      Else
    
       Y = Str(freq)
       If Z(4) = 0 Then                                         'Führende Nullen eliminieren
        Do
         Z(5) = Z(4)
         Z(4) = Z(3)
         Z(3) = Z(2)
         Z(2) = Z(1)
         Z(1) = 0
        Loop Until Z(5) > 0
       End If
      End If
     End If
    
     Temp = 1
     Enable Icp1
    Return
    
    Onoverflow:
     Incr Wcounthi
    Return

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178
    Keiner der mit helfen kann? Ist echt wichtig.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124
    4 Zylinder, 4Takter -> 2 Impulse / Umdrehung

    "Frequenz = 240000000 / Icount" ; Frequenz in U/min
    240.000.000 = F_osz * 60s / Anz_Imp/U

    ohne Gewähr.

    Ciao,
    Werner

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178
    Also einfach 480000000, werde gleich mal zu Conrad heizen und die benötigten bauteile kaufen. Brauche ich zum Multiplexen der 7-Segmentanzeigen eigentlich Transistoren um die Katoden zu Schalten oder kann ich die direkt an den ATMega8 klemmen?

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Sicherer ist es schon. Nachdem sowas öfter vorkommt, nehme ich immer bei Gelegenheit aus wühlkisten sackweise irgendwelche "no-name" npn u. pnp.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178
    Hab mit jetzt einfach 5 BC gekauft... Kann ich das Signal eigentlich direkt vonner Zündung abgreifen (pickup - sind 1-3V) und aufn atmega schicken?

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    14.09.2005
    Alter
    61
    Beiträge
    77
    Der Code ist von mir. Im Prinzip braust du nur diesen Teil. Wenn du weniger als 1000 Umdrehungen messen willst mußt du noch den Überlauf des Timers berücksichtigen.

    Code:
    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) 
     Loop 
    End
    Du hast zwei Möglichkeiten die Drehzahl zu messen. Einmal zählst du die Impulse über eine bestimmte Zeit, oder die Umlaufgeschwindigkeit messen. Ich benutze hier die Umlaufgeschwindigkeit.

    Das Prinzip ist folgendes. Ich warte auf eine steigende Flanke, dann auf eine fallende Flanke, und wenn dann wieder eine steigende Flanke kommt habe ich eine Umdrehung, und aus der gemessenen Zeit rechne ich die Drehzahl.

    Wenn du die Impulse zählst wird das nicht so genau, sagen wir mal du zählst die Impulse währen einer Hundertstelsekunde. In dieser Zeit kann deine Drehzahl sich viel verändern und dein Ergebnis ist falsch.

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Hallo,
    ist schon etwas her das hier geschrieben wurde...

    kann mir jemand den Code erklären? Hab´da ein paar Fragen:
    ------
    was passiert hier? Portb = 64 ? Ich kenne es so, dass damit ein Pin vom µC auf 1 oder 0 gesetzt wird aber den Pin 64 gibt es beim 2313 nicht....
    ------

    Freq = 0
    Y = Str(freq)
    Z(1) = 0
    Z(2) = 0
    Z(3) = 0
    Z(4) = 0
    Z(5) = 48

    Y ist der Strin mit 5 "Ziffern" aber wofür stehen die 0 und 48?

    -----

    For Test2 = 1 To 400 '..... und 400 mal Anzeigen
    For Zaehler = 1 To 5
    Test = X(zaehler)
    Select Case Test
    Case 48 : Portb = 63
    Case 49 : Portb = 6
    Case 50 : Portb = 91
    Case 51 : Portb = 79
    Case 52 : Portb = 102
    Case 53 : Portb = 109
    Case 54 : Portb = 125
    Case 55 : Portb = 39
    Case 56 : Portb = 127
    Case 57 : Portb = 111
    Case Else : Portb = 0
    End Select
    Portd.zaehler = 1
    Waitus 100 'Zeit für jede Anzeige
    Portd.zaehler = 0
    Next Zaehler
    Next Test2

    400 mal anzeigen? oder hat das etwas damit zu tun, wie lange jede Anzeige leuchtet?
    CASE 48-57?

    freue mich auf ganz viele Antworten...

    Tobias

    PS. eigendlich wollte ich nur eine Variableauf der LED-Anzeige anzeigen aber wenn ich den Wert in die Variable Freq schreibe passiert nichts....

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •