-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Drehzahl- und Geschwindigkeitsmessung ATMEGA88 BASCOM

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    15.08.2013
    Ort
    Güstrow
    Beiträge
    31

    Frage Drehzahl- und Geschwindigkeitsmessung ATMEGA88 BASCOM

    Anzeige

    Hallo an das Forum,

    Ich weiß, hier verwenden die meisten Leute C oder Assembler.
    Ich würde aber gerne weiter in Bascom Programmieren, da es VB ähnelt und ich damit beruflich zu tun habe.

    Ich würde gern für eine Fahrende Bierkiste Drehzahl und Geschwindigkeit auslesen.
    Der Bau der Geber stellt kein Problem dar. Die Zündung und die Antriebswelle sollen pro Umlauf nur ein Signal abgeben, aber ich verstehe die Funktionsweise der Timer nicht.

    Mein Plan ist den Timer1 laufen zu lassen, die Drehzahl aus der Differenz eines alten und neuen Wertes zu errechnen und bei Erreichen des Geschwindigkeitssensor den Timer auf null zu setzen.

    Der Timer läuft hoch, aber die Interrupts lösen anscheinend nicht aus

    hier der Code:
    Code:
    $regfile = "m88def.dat"
    $crystal = 16000000
    $hwstack = 40
    $swstack = 40
    $framesize = 40
    
    'Display Einrichten
    Config Lcdpin = Pin , _
           Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portb.4 , Rs = Portb.5
    
    Config Lcd = 16 * 2
    
    Dim Drehzahl As Word
    Dim Geschwindigkeit As Word
    Dim D_timer_1 As Single
    Dim D_timer_2 As Single
    Dim G_timer As Single
    Dim Timer_multi As Single
    
    Config Pind.2 = Input                             'drehzahl
    Config Pind.3 = Input                             'Geschwindigkeit
    
    Portd.2 = 1
    Portd.3 = 1
    
    On Int0 Dreh_route
    On Int1 Gesw_route
    On Timer1 Timer_over
    
    Config Int0 = Rising
    Enable Int0
    Config Int1 = Rising
    Enable Int1
    Enable Interrupts
    
    Enable Timer1
    Start Timer1
    
    Config Timer1 = Timer , Edge = Rising , Prescale = 1024       'so niedrig, dass erlangsam zählt
    
    Timer_multi = 1
    
    Do
            Cls
            Upperline : Lcd Drehzahl ; "  " ; Geschwindigkeit
            Lowerline : Lcd D_timer_1 ; " " ; Timer1
            Waitms 20
    Loop
    
    End
    
    Dreh_route:
            D_timer_2 = Tcnt1 * Timer_multi
            If D_timer_2 > D_timer_1 Then Drehzahl = D_timer_2 - D_timer_1
            D_timer_1 = D_timer_2
    Return
    
    Gesw_route:
            G_timer = Timer1 * Timer_multi
            Geschwindigkeit = G_timer
            Timer1 = 0
            Timer_multi = 0
    Return
    
    Timer_over:
            Timer_multi = Timer_multi + 1
            If Timer_multi > 100 Then Timer_multi = 1
    Return
    
    End
    Geändert von therealosram (01.08.2014 um 00:48 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    Die Edge-Option solltest du beim Timer weglassen, wenn du ihn nicht als Counter benutzt.
    Die Berechnung der Drehzahl sieht mir auch nicht gut aus. Hier willst du den Timerwert erfassen (Periodendauer) und daraus den Kehrwert errechnen (Frequenz = Drehzahl) Der Überlauf kommt nur, wenn die Drehzahl zu niedrig ist.

    Gruß, Michael

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    15.08.2013
    Ort
    Güstrow
    Beiträge
    31
    Nochmals hallo an das Forum.

    Ich verzweifel hier echt und versteht die Timer irgendwie nicht. Auch die verschiedenen Tutorials zu den Timer raff ich nicht. Vielleicht denk ich auch nicht genug um die Ecke.

    Ich möchte nur gleichzeitig die Drehzahl von Motor 500-8000 (0,002-0,000125sec/puls) und der Achse 1-20 (1-0,05sec/puls) auslesen.
    Nehm ich dann alle drei Timer und lasse einen bis zum Überlauf zählen und zähle dann die anderen zusammen?
    Zu was würdet ihr mir raten, unabhängig in welcher Sprache ihr arbeitet. Ich möchte nur das System verstehen.

    Grüße

  4. #4
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die Drehzahlen werden üblicherweise in Umdrehungen pro Minute angegeben, je Sekunde ist das dann nur 1/60 der Umdrehungen bzw. Pulse. Ggf. kann aber der Aufnehmer mehr als 1 Puls je Umdrehung geben.

    Der Übliche weg ist es einen Timer durchlaufen zu lassen, und dann jeweils die Zeiten auszulesen und die Differenzen zu bilden. Den Timer sollte man dabei nicht zurücksetzen, sondern besser den Überlauf richtig berücksichtigen - das ist nicht so schwer, aber ggf. je nach Compiler / Sprache etwas verschieden. Wie das in C geht sieht man etwa in Wissens Artikel unter Timer(AVR) - Input Capture. Wegen der recht verschiedenen Drehzahlen wird bei nur einem 16 Bit timer die Auflösung für die hohe Drehzahl eher klein. Da wäre es schon hilfreich die Auflösung des Timers in Software zu erweitern (zählen der Überläufe) oder ggf. alternativ die Zeit für mehr als 1 Periode zu Messen.

    Wenn der µC 2 16 Bit Timer hätte, könnte man auch je Drehzahl einen Timer nutzen und so ohne die Erweiterung der Auflösung auskommen. Ein 8 bit Timer hilft aber nicht weiter, denn da kann man auch gleich den 16 Bit timer auf 32 Bit erweitern und damit alle erledigen.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    15.08.2013
    Ort
    Güstrow
    Beiträge
    31
    Hier jetzt mal der aktuelle Code.

    Code:
    $regfile = "m88def.dat"
    $prog &HFF , &HE2 , &HDF , &HF9                   ' generated. Take care that the chip supports all fuse bytes.
    $hwstack = 128
    $framesize = 128
    $swstack = 128
    
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portd.0 , _
           Db7 = Portd.1 , E = Portb.4 , Rs = Portb.5
    Config Lcd = 16 * 2
    Cursor Off
    
    Config Timer1 = Timer , Prescale = 64
    
    Config Int0 = Falling
    Config Int1 = Falling
    
    On Int0 Ges                                       'Geschwindigkeit
    On Int1 Dre                                       'Drehzahl
    On Timer1 Timer_irq
    
    Enable Int0
    Enable Int1
    Enable Timer1
    
    Config Sda = Portc.4
    Config Scl = Portc.5
    Config Portd.2 = Input
    Config Portd.3 = Input
    Config Portd.0 = Output
    
    Pind.2 = 1
    Pind.3 = 1
    
    Dim G_pre As Long
    Dim G_set As Word
    Dim G_calc As Single
    Dim G_out As Integer
    
    Dim D_pre As Long
    Dim D_set As Word
    Dim D_out As Integer
    
    Do
          Upperline : Lcd " " ; D_out ; "  " ; G_calc ; "                   "
          Lowerline : Lcd " " ; Timer1 ; "                   "
          Waitms 1000
    Loop
    
    Ges:
        G_calc = G_set - G_pre
        G_pre = G_set
        G_set = Timer1
    Return
    
    Dre:
        D_out = D_set - D_pre
        D_pre = D_set
        D_set = Timer1
    Return
    
    Timer_irq:
       D_pre = D_pre - 65535
       G_pre = G_pre - 65535
    Return
    
    
    End
    Was mach ich falsch, dass er die Trigger INT0/1 gegen Masse nicht erkennt und die Differenz zwischen den 'pre" und 'set' nicht ausgibt?

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von malthy
    Registriert seit
    19.04.2004
    Ort
    Oldenburg
    Beiträge
    1.379
    Hi,

    unabhängig von allem anderen: Du musst die Interrupts noch global einschalten

    Code:
    Enable Interrupts
    Gruß
    Malte

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.410
    Blog-Einträge
    101
    Hallo,

    Zitat Zitat von therealosram Beitrag anzeigen
    Was mach ich falsch, dass er die Trigger INT0/1 gegen Masse nicht erkennt und die Differenz zwischen den 'pre" und 'set' nicht ausgibt?
    Gibt er nichts aus oder nur das falsche? Auf jeden Fall fehlt das "Enable Interrupts". Ob der Rest paßt habe ich nicht überprüft.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  8. #8
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die Art wie Überläufe berücksichtigt werden sieht interessant aus - könnte aber fast funktionieren (2^16 ist einer mehr). Ein Problem gibt es ggf. mit einem Überlauf beim Ergebnis, da nur integer. Der grobe Fehler ist erst einmal das fehlende globale einschalten der Interrupts.

    Schließlich gibt es ggf. noch eine seltenes Problem wenn der Timer Überlauf und der Int0/1 fast gleichzeitig kommen. Da ist es nicht so einfach zu entscheiden ob der Überlauf vor oder hinter dem Interrupt kommt. Ich fürchte der Prescaler von 64 reicht noch nicht aus um da seltene Fehler zu vermeiden. Wie das richtig gehen kann, steht im RN-Wissen unter Timer(AVR), da allerdings unter Ausnutzung der Hardware ICP Funktion.

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    15.08.2013
    Ort
    Güstrow
    Beiträge
    31
    Oh man. Wie so oft lag das Problem zwischen den Ohren.
    Oder wie hier mal jemand schrieb: "uC machen nicht immer was sie sollen, aber alles was man ihnen sagt..."

    Jetzt gehts.
    Hab bei 8000 U/min = 16 clicks und bei 1000 U/min = 130 Clicks. Die Genauigkeit reicht völlig aus, da ich eh nur 1000er Schritte brauch.
    Dafür ist dann die Geschwindigkeit genauer messbar. Bis zu 65535. Soll etwa 3-60 Km/h anzeigen.

    Ist für ne Fahrende Bierkiste

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.557
    ... etwa 3-60 Km/h ... Ist für ne Fahrende Bierkiste ...
    Uuuups - oder hicks? Formula Bierkiste?
    Ciao sagt der JoeamBerg

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Atmega88 wird in bascom nicht erkannt
    Von nrg_mario im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 09.07.2011, 19:19
  2. MCS-Bootloader für ATmega8 und ATmega88 compilieren
    Von felack im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 24.09.2008, 15:47
  3. IR-Empfänger an ATMega88 und Timer2
    Von Schokohoernl im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 21.02.2007, 01:23
  4. 4 x PWM mit ATMega88 und BASCOM
    Von Trabukh im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 04.08.2006, 10:35
  5. Atmega88 und rc5 codes
    Von Furtion im Forum AVR Hardwarethemen
    Antworten: 19
    Letzter Beitrag: 30.12.2005, 23:21

Stichworte

Berechtigungen

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