-         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Frequenz messen und zählen

  1. #1
    BascomBenutzer
    Gast

    Frequenz messen und zählen

    Anzeige

    Hallo,

    Ich stehe gerade auf dem Schlauch.
    Mit der Benutzung der Timer bin ich vertraut und auch
    der Interrupts.
    Ich möchte wenn ein 1 kHz Signal an einem Eingang ansteht eine Variable um 1 hoch gezählt wird. Das Signal kommt von einer geputzten LED.
    Wie stell ich das am einfachsten an?

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.945
    Deine Anfrage ist irgendwie unklar.
    Willst Du nun eine Frequenz messen, oder beim anliegen eines periodischen Signals eine Variable hochzählen, oder eine Kombination von beiden?

    Grundsätzlich gibt es für die Frequenzmessung mehrere Methoden.
    1. Eine wäre eine echte Frequenzmessung mit fester Torzeit.
    Du gibst die unbekannte Frequenz auf den Takteingang eines Timers und konfigurierst einen 2ten Timer so, das er nach genau einer Sekunde einen Interrupt produziert. In diesem Interrupt wird der Zählerstand des ersten Timers ausgelesen und wieder auf 0 gesetzt für die nächste Messung und ist dann ein direktes Maß für die Frequenz.
    Diese Methode eignet sich eher für hohe Frequenzen und ist relativ Jitterstabil.

    2. Eine weitere wäre die Messung der Periodendauer.
    Ein Timer läuft frei, lediglich Overflows müssen erkannt werden.
    Das unbekannte Signal wird auf den Input Capture Pin des verwendeten Timers gelegt und der zugehörige Interrupt freigegeben.
    In diesem Interrupt wird dann der Zählerstand des vorherigen Interrupt vom aktuellen Wert abgezogen und bildet dann ein Maß für die Periodendauer des Signals.
    Diese Periodendauer muss dann unter Berücksichtigung der Timerfrequenz in eine Frequenz umgerechnet werden.
    Die Umrechnung bitte nicht in der Interruptroutine machen, sondern im Hauptprogramm.
    Diese Methode ist sehr gut für niedrige Frequenzen geeignet ( jede Periode produziert einen Interrupt ) und liefert sehr schnell neue Ergebnisse.
    Nachteil der Methode ist, das immer nur eine Periode des Eingangssignals gemessen wird. Unregelmässige oder verjitterte Signale machen bei dieser Methode Probleme. Also mehrere Messungen samplen und einen Mittelwert daraus bilden.

    Mir ist auch nich ganz klar was Du mit der LED meinst. Hast Du die LED als Fotodiode verwendet? Nimmst Du das Signal mit einer Fotodiode oder einem Fotowiderstand vom Licht der LED ab, oder gehst due einfach auf die Anschlusspins der LED ???
    Ich denke auch, das Du das LED Signal, wo immer es auch herkommt über einen Schmitt Trigger in ein sauberes Rechtecksignal umformen musst.

    Dann würde ich noch ein Flag anlegen "1kHz Signal vorhanden". Wenn ein 1kHz Signal detektiert wird geht diese Variable von 0 nach 1 und dein Zähler zählt eins weiter.
    Wird kein 1kHz Signal detektiert geht die Variable wieder nach 0.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    11.05.2014
    Ort
    Weinböhla
    Beiträge
    5
    Kann es sein dass Du die Frage schon einmal im Bascom-Forum gestellt hast?

  4. #4
    Unregistriert
    Gast
    Es geht darum.
    Hab hier einen CNY 70 der die Drehzahl eines Motor misst.
    Die LED habe ich mit Timer0 gepulst.
    Der Transitor geht dann auf einen Eingang des AVR.
    Es muß nicht genau die Frequenz gemessen werden sondern
    nur unterschieden werden, ob eine Frequenz anliegt (dann Variable +1) oder 0V Level.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    11.05.2014
    Ort
    Weinböhla
    Beiträge
    5
    OK, das habe ich verstanden: CNY70 arbeitet als Reflexlichtschranke und soll zur Unterdrückung von Störlicht mit 1kHz getaktet werden, in Deinem Fall von Timer0 per PMW. (letzteres geraten)

    Da ich die mögliche Drehzahl des Motors nicht kenne (es mach schon einen Unterschied, ob Du bis 10.000 U/min oder bis zu 100.00 U/min messen willst) - könnte Deine Modulation mit 1kHz viel zu gering sein, weil schlicht und einfach zu wenig Zeit bleibt um das Ende des Impulses zu messen.

    Beispiel: Deine Messung erfolgt per Reflexion an einem Rad, der Reflektor ist ca. 10mm vom Zentrum entfernt. Der Einfacheit halber ist alle 36° ein Reflektor, so dass 360°/36° = 10 Sekmente möglich wären - sondt wird es zu winzig. Wenn Du also mehr Segmente brauchst (genauer bzgl. des Drehwinkels), oder weniger - z.B. nur 1 Segment über die Hälfte des Umfangs (ca. 31,5mm weiß, 31,5mm schwarz) - dann ist die mögliche Messzeit sehr verschieden.

    Bei 1kHz ist die HIGH-Phase alse 0,5ms, so dass sich in unserem Beispiel mit 1 Segment und z.B. 10.000 U/min ==> 166,6 U/sec in etwa 166,6 x 63mm = 10.495,8mm/s bzw. 10,4958 mm/ms zurückgelegt werden. Das heißt: Das halbe Segment ist ja nur 31,5mm lang und so passen gerade noch 3 Impulse (!!) auf den weißen Reflektor.

    Die Wahrscheinlichkeit, dass Störungen mit 1kHz durch die Luft flimmern ist relativ groß - und damit ist die erwünschte Wirkung nicht gut genug. Empfehlung: Frequenz hochsetzen. Normale TV-Fernbedienungen arbeiten oft im Bereich 35...45kHz.

  6. #6
    Unregistriert
    Gast
    habe es mal so versucht.
    geht relativ gut.

    'Auwertung einer Drezahl mit einem CNY70
    'Die LED des CNY70 wird an Protb.5 mit Timer2 gepulst
    'am Transitor des CNY wird das Singnal mit einem RC Hochpaß aufbereitet und
    'auf den INT0 (Portd.2) gegeben.
    'Die Signale an Portd.2 werden während einer Torzeit(Timer0/Merker1) gezählt
    'Liegt eine Frequenz an gab es während der Torzeit ca.6 Impulse
    'Liegt eine Frequenz an wird hochgezählt und gewartet bis die Frequenz wieder weg ist.
    'Liegt erneut eine Frequenz an wird wieder hochgezählt

    $regfile = "m8adef.dat"
    $crystal = 1000000
    $hwstack = 40
    $swstack = 16
    $framesize = 32

    Dim Wert As Word 'Erkannte Impulse
    Dim Zaehler As Word 'Impulse Frequenz zählen
    Dim Merker As Bit 'Merker Torzeit abgelaufen
    Dim Merker2 As Bit 'Frequenz Ja/Nein

    Config Portb.5 = Output 'Ausgang LED CNY 70
    Config Portd.2 = Input 'Impulseingang
    Config Portb.1 = Output 'Anzeige-LED Frequenz erkannt

    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portb.0
    Config Lcd = 20 * 4
    Cursor Off
    Cls

    Config Timer0 = Timer , Prescale = 256 'Torzeit Impulse
    On Timer0 Torzeit
    Enable Timer0

    Config Timer2 = Timer , Prescale = 8 'LED Pulsen CNY70
    On Timer2 Ledpulsen
    Enable Timer2

    Config Int0 = Rising 'Interrupt zum Frquenz zählen
    On Int0 Eingangsimpuls
    Enable Int0
    Enable Interrupts

    Do
    If Merker = 1 Then Gosub Auswerten 'Auswert nach Torzeit Frequenz Ja/Nein '

    Locate 1 , 1
    Lcd Wert ; " " 'Anzeige der erkannten Impulse


    Loop

    End

    Auswerten:
    Merker = 0 'Torzeitmerker auf 0
    If Zaehler > 3 And Merker2 = 0 Then 'Prüfung neuer Frequenzimpuls Ja/Nein bei dieser Torzeit ca.6 Impulse
    Incr Wert 'Erkannte Impulse hochzälen
    Portb.1 = 1 'Frequenz erkannt
    Else
    Portb.1 = 0 'Frequenz nicht erkannt
    End If

    If Zaehler > 3 Then
    Merker2 = 1 'Frequenz erkannt
    Else
    Merker2 = 0 'keine Frequenz erkannt
    End If
    Zaehler = 0 'Zähler auf 0 für nächsten Durchgang
    Return

    Ledpulsen:
    Timer2 = 130
    Toggle Portb.5 'LED CNY70 pulsen
    Return

    Eingangsimpuls:
    Incr Zaehler
    Return

    Torzeit:
    Timer0 = 100 'Timer0 auf Startwert 100
    Merker = 1 'Torzeit abgelaufen
    Return

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    30
    Beiträge
    4.686
    Ich würde das etwas anders machen. Ich würde die Frequenz mit einem AMV erzeugen. Mit dem Empfänger des CNY gehst du auf einen Monoflop und somit musst du nur das Signal vom Monoflop auswerten. Frequenz würde ich ebenfalls auf ca. 30kHz (oder mehr) hochgehen.

    MfG Hannes

  8. #8
    Unregistriert
    Gast
    Klar Frequenz kann ich erhöhen.
    Wie im Titel vom Programm steht nehm ich das Signal vom Transistor des CNY 70 und filter die Gleichspannung mit einem RC Hochpass weg und mach mit einem OP LM358 TTL Pegel drauß.
    Hat noch jemand andere Programmieransätze oder Vereinfachungen?

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.945
    Der TTL Pegel ist ja wieder ein 30kHz Signal.
    Das kannst Du nun mit dem Controller auswerten, oder Du schaltest noch ein Monoflop nach, wie Hannes schon vorschlug, und kannst dann die Impulse direkt mit dem AVR zählen.
    Die Triggerschwelle des LM 358 würde ich einstellbar machen um die Impulse auch sicher zu detektieren.

  10. #10
    Unregistriert
    Gast
    Ja richtig...Hab ein Poti an den - Eingang des LM358 dran gebaut um
    die Empfindlichkeit und Abstand zur reflecktierenden Markierung
    ein zu stellen. Wollte die Außenbeschaltung weitestgehend gering
    halten und in der Software erledigen. Aber welches retriggerbares Monopflop würdet ihr vorschlagen.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Frequenz messen (260 Hz)
    Von Bastel-Wastel im Forum PIC Controller
    Antworten: 2
    Letzter Beitrag: 10.05.2012, 08:25
  2. Frequenz messen
    Von mariosey im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 26.02.2010, 14:35
  3. frequenz messen
    Von kleinstar im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 05.06.2007, 22:14
  4. Frequenz messen
    Von TobiasBlome im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 28.11.2006, 15:03
  5. Frequenz messen mit PIC
    Von TB1 im Forum PIC Controller
    Antworten: 5
    Letzter Beitrag: 07.07.2006, 16:08

Benutzer, die dieses Thema gelesen haben: 3

Berechtigungen

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