- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: Frequenzmesser bis 100Hz

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    07.01.2010
    Ort
    Deutschland
    Beiträge
    739

    Frequenzmesser bis 100Hz

    Hallo Forum,
    Ich möchte mir gerne einen Frequenzmesser bauen der bis 100Hz arbeitet.
    Wie wird das in Bascom programmiert??
    Ich würde dafür gerne einen ATmega8 mit 4MHz Quarz benutzen.
    Ich wäre euch für Antworten sehr dankbar.

    Mfg
    bnitram

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Glaubst Du, dass Du einen Code, den ich mal für ATMega32 geschrieben hab', umbasteln kannst ?

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    07.01.2010
    Ort
    Deutschland
    Beiträge
    739
    Hallo MagicWSmoke,
    Danke für deine schnelle Antwort. Ich denke das ich das schon irgend wie hinkriegen sollte. Ansonsten ist es aber mir bestimmt auch so eine Hilfe. Also wäre ich dir sehr dankbar wenn du das Programm mir schicken oder posten könntest.

    Mfg
    bnitram

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Dann versuch' Dich mal hiermit:
    Code:
    $regfile = "m32def.dat"
    $crystal = 8000000
    $hwstack = 64
    $swstack = 64
    $framesize = 64
    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.1 , Db6 = Portd.5 , Db7 = Portd.0 , E = Portd.2 , Rs = Portd.3
    Config Lcd = 16 * 2
    Cursor Off
    
    Const True = 1
    Const False = 0
    Const Measure_success = 0
    Const Measure_failed = 1
    Const Measure_request = 2
    
    Dim Frequency As Long
    Dim Capt_prev_val As Word
    Dim Capt_curr_val As Word
    Dim Measure_result As Long
    Dim Capt_result As Word At Measure_result Overlay           ' Differenz aus Capture beschreibt das Low-Word von Measure_Result
    Dim Ovf_result As Word At Measure_result + 2 Overlay        ' Mit dem Overflowergebnis das High-Word von Measure_Result beschreiben, spart das multiplizieren mit 65536
    Dim Ovf_ctr As Word
    
    Dim F_str As String * 10
    
    ' Variablen zur Ablaufsteuerung
    Dim Got_edge As Byte
    Dim Measure_status As Byte
    
    Config Timer1 = Timer , Prescale = 1                        ' , Noise Cancel = 1     ' , Capture Edge = Falling       ' , Noise Cancel = 1
    
    ' Trigger durch Analogkomperator an Pin4, AIN1, AIN0 an Bandgap Reference 1V
    Config Aci = On , Compare = On
    Acsr.acbg = 1 
    
    On Capture1 Isr_capt Nosave
    Enable Capture1
    
    On Ovf1 Isr_ovf
    Enable Ovf1
    
    Ovf_ctr = 0
    Got_edge = False
    Tifr = Bits(icf1 , Tov1)
    Enable Interrupts
    
    Initlcd
    Cursor Off Noblink
    Cls
    Locate 1 , 1
    Lcd "START"
    Wait 2
    
    Cls
    Do
      Locate 1 , 1
    
      Measure_status = Measure_request
        While Measure_status = Measure_request
        Wend
          If Measure_status = Measure_failed Then
            Lcd "Timeout K.Erg."
          End If
          If Measure_status = Measure_success Then
            If Measure_result > 0 Then
              Measure_result = Measure_result / 10
    '           Frequency = 826787928 / Measure_result           ' Kalibrierung für abweichenden internen RC Oszillator
               Frequency = 830996156 / Measure_result
    '          Frequency = 800000000 / Measure_result
              F_str = Str(frequency)
                Lcd "Freq: " ; Format(f_str , "000.000") ; " Hz"
            Else
              Lcd "Fehler, Ergebnis = 0"
            End If
          End If
        Waitms 50
    Loop
    
    End
    
    Isr_capt:
      PUSH    R22
      LDS     R22,                  ICR1L
      STS     {Capt_curr_val},        R22
      LDS     R22,                  ICR1H
      STS     {Capt_curr_val +1},     R22
      POP     R22
        Pushall
          If Measure_status = Measure_request And Got_edge = True Then       ' Messung angefordert und eine Flanke erkannt ?
            Capt_result = Capt_curr_val - Capt_prev_val         ' Ja, dann Werte übernehmen
              Measure_status = Measure_success
                If Capt_curr_val < Capt_prev_val Then           ' Natürlicher Overflow ?
                  Decr Ovf_ctr                                  ' Bereichsgrenze überschritten, Overflows um 1 erniedrigen
                End If
              Ovf_result = Ovf_ctr
        End If
           Capt_prev_val = Capt_curr_val                        ' Aktuellen CAP-Wert speichern
             Ovf_ctr = 0                                        ' Overflowzähler zurücksetzen
               Got_edge = True
      Popall
    Return
    
    Isr_ovf:
        Incr Ovf_ctr
    '      If Ovf_ctr > 122 Then                                 ' Niedrigste Messfrequenz 1 Hz unterschritten
          If Ovf_ctr > 126 Then                                 ' Korrektur für zu hohe RC Oszillatorfrequenz
            Got_edge = False
              Ovf_ctr = 0
                If Measure_status = Measure_request Then Measure_status = Measure_failed
          End If
    Return
    Edit:
    µC wird momentan mit 'nem 16MHz Quarz betrieben, war noch so im Code gestanden, hab's geändert.
    Musst die Werte halt auf 4MHz Takt anpassen.

    EditEdit:
    Hab' gerad' mal den ATMega8 als µC angegeben, das compiliert ohne Probleme. Es sollte also reichen den Takt auf 4MHz anzupassen, da ist nur:
    Code:
    Frequency = 830996156 / Measure_result
    If Ovf_ctr > 126 Then
    zu ändern. Dann LCD anpassen und der Analog-Comparator-Pin ist auch ein anderer.
    Geändert von MagicWSmoke (10.11.2012 um 18:01 Uhr)

  5. #5
    Erfahrener Benutzer Roboter-Spezialist Avatar von Thegon
    Registriert seit
    21.01.2011
    Beiträge
    562
    Hallo,

    weil ich eigentlich auch gerade an einen Drehzahlmesser gedacht habe (und ich nehme an, es handelt sich noch um das Thema mit dem Benzinmotor)
    habe ich das mal ausprobiert.
    Ich habe leider auch nur einen ATmega16 herumliegen, das Programm ist also auch für Mega16, jedoch sollte es reichen, einfach die Pins, an die das Display angeschlossen ist, zu ändern.

    Der Eingang ist Int0 (den es ja auch beim Mega8 gibt).
    Die Umrechnung ist jetzt so ausgelegt, dass der Timer1 1Mio mal pro Sekunde tickt. Wenn man z.B. einen Quarz anderer Frequenz verwenden möchte müsste man das halt entweder im Prescaler oder in der Umrechnung ändern.

    Code:
    $regfile "M16def.dat"
    $hwstack = 32
    $swstack = 32
    $framesize = 32
    $crystal = 1000000
    
    'Initialisiere Timer1
    Config Timer1 = Timer , Prescale = 1
    Enable Timer1
    On Timer1 Isr_timer1
    
    'Das LCD konfigurieren
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
    
    'Den Int0 konfigurieren, er dient zum erfassen der Pulse
    Config Int0 = Rising
    Enable Int0
    On Int0 Isr_puls
    
    'Die Interrupts global aktivieren
    Enable Interrupts
    
    'Variablen Definieren
    Dim Timer1_overflows As Byte
    Dim Ticks As Long
    Dim Rpm As Long
    
    'Variable auf Null setzen, nur um sicher zu gehen
    Timer1_overflows = 0
    'Anfang Hauptprogramm +++++++++++++++++++++++++++++++++++++++++
    Do
    
    'Die Ticks in Umdrehunge pro Sekunde umrechnen
    Rpm = 60000000 / Ticks
    
    Cls
    Locate 1 , 1
    Lcd "Umdrehungen: "
    Locate 2 , 1
    Lcd Rpm
    
    'Eine viertelsekunde warten, damit das Display nicht zu häufig
    Waitms 250
    
    Loop
    'Ende Hauptprogramm +++++++++++++++++++++++++++++++++++++++++
    
    
    
    Isr_puls:
    'Es wurde ein Puls registriert
    
    
    'Anzahl der Ticks ermitteln
    Ticks = Timer1_overflows * 65536
    Ticks = Ticks + Timer1
    
    'Zurücksetzen
    Timer1 = 0
    Timer1_overflows = 0
    
    Return
    
    Isr_timer1:
    'Timer 1 ist übergelaufen
    Timer1_overflows = Timer1_overflows + 1
    Return
    Der Code ist getestet und hat bei mir funktioniert.

    Klicke auf die Grafik für eine größere Ansicht

Name:	102_0185.jpg
Hits:	24
Größe:	87,4 KB
ID:	23694

    Natürlich, es wurde ja schon Code gepostet, aber das habe ich jetzt gerade eben ausprobieren müssen und villeicht nützt es dir ja etwas

    EDIT: Habe gerade gesehen, dass die Textphrase "Umdrehungen * 1/min: " garicht platz hat am LCD, siehe Foto.
    Also im Code auf "Umdrehungen: " geändert...

    Mfg Thegon
    Geändert von Thegon (11.11.2012 um 08:00 Uhr)

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    07.01.2010
    Ort
    Deutschland
    Beiträge
    739
    Danke euch beiden!!
    Vielen Dank für die beiden Programme.

    @Thegon:
    Ja genau für den Verbrenner war es gedacht....
    Ich denke ich werde dann den Code von Thegon morgen mal testen, da er eh schon perfekt für meinen Einsatzzweck ist. Trotzdem Danke an MagicWSmoke.

    Mfg
    bnitram

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    07.01.2010
    Ort
    Deutschland
    Beiträge
    739
    Danke Thegon für deine Antwort.
    Habe das mal mit dem Raster getestet. Ging schneller Da hat auf Anhieb alles geklappt. Dann das ganze noch mal mit dem hallsensor getestet. Und siehe da.....es funktioniert. Der Fehler war mein steckbrett. Dort war ein Kontakt verbogen. Naja jetzt funktioniert es. Werde dann morgen den Test am Motor machen. Der ist jetzt zu laut. Aber vielen Dank für das Programm.

    Mfg
    bnitram

  8. #8
    Erfahrener Benutzer Roboter-Spezialist Avatar von Thegon
    Registriert seit
    21.01.2011
    Beiträge
    562
    Na dann Glückwunsch!

    Freut mich wenn es funktioniert

    Mfg Thegon

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    07.01.2010
    Ort
    Deutschland
    Beiträge
    739
    Hallo zusammen,
    heute konnte ich den Drehzahlmesser testen, in der Hoffnung den Motor einstellen zu können, ABER es gab da ein RIESEN Problem.
    Wenn der Motor in Leerlauf Geschwindigkeit ist(also die fast tiefste Drehzahl die die Motor läuft ohne aus zu gehen) dann sollten ja Werte von 750 bis ca.1100 rauskommen. Der Motor dreht laut Hersteller auch nicht schneller als 4300, da er einen mechanischen Drehzahlbegrenzer besitz. Allerdings will ich den guten Motor keinem 50 Jahre alten Drehzahlbegrenzer an vertrauen. Wenn von dem Drehzahlmesser bekomme ich im Leerlauf allerdings angeblich schon 4250 UPM, was auf keinen Fall stimmen kann. Unter ca. Halbgas bekomme ich Werte um die 5500. Da is was auf jeden Fall nicht richtig. Hat jemand ne Idee woran das liegen könnte??

    Mfg
    bnitram

    PS:
    Wenn ich den Magneten jede sek. vor den Hallsensor halte dann bekomme ich trotzdem Werte um die 60.

  10. #10
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Es kann sein, dass der Motor mehr als einen Impuls pro Umdrehung erzeugt, sondern z.B. 4 oder 6. Die Pulse kommen dann schneller und täuschen eine höhere Drehzahl vor.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Frequenzmesser
    Von Matze 3 im Forum PIC Controller
    Antworten: 1
    Letzter Beitrag: 01.03.2012, 11:53
  2. Frequenzgenerator mit Frequenzmesser
    Von Meister Joda im Forum Elektronik
    Antworten: 15
    Letzter Beitrag: 12.08.2010, 17:04
  3. Stimmgerät / Frequenzmesser
    Von EDatabaseError im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 3
    Letzter Beitrag: 30.03.2007, 13:01
  4. Probleme bei C->Basic Frequenzmesser
    Von EDatabaseError im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 22.09.2006, 14:17
  5. Frequenzmesser mit ATtiny2313
    Von Raven² im Forum AVR Hardwarethemen
    Antworten: 7
    Letzter Beitrag: 18.04.2006, 17:46

Berechtigungen

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

Labornetzteil AliExpress