- Labornetzteil AliExpress         
Seite 9 von 10 ErsteErste ... 78910 LetzteLetzte
Ergebnis 81 bis 90 von 92

Thema: Howto Frequenzzähler

  1. #81
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124
    Anzeige

    Praxistest und DIY Projekte
    Hallo Teslanikola,

    stimmt, beachte aber bitte, das die Anzahl der Timer1 Interrupts dabei 128 mal höher ist als bei Prescale=1024. Das kann irgendwann Probleme mit der Rechenleistung geben.

    Zudem gilt: die 1s Messzeit ist erreicht wenn der 39. Interrupt ausgelöst wird. Zu dem Zeitpunkt stoppt der Timer aber noch nicht. Der µC führt erst noch einige Operationen aus, die allesamt Zeit brauchen.
    - Die Register werden auf dem Stack gespeichet
    - es wird in die Interrupt Routine gesprungen
    - der Zähler wird erhöht
    - die IF-Abfrage wird abgearbeitet
    - der PinD.5 wird getoggelt (warum überhaupt)
    Erst dann wird Timer1 ausgelesen!
    Während der Zeit die für die Zwischenschritte benötigt werden misst Timer1 noch munter weiter.

    Eh Du also anfängst den Messzeit-Timer zu optimieren, solltest Du Dir ein paar Gedanken machen was in welcher Reihenfolge abgearbeitet werden könnte.
    Was spricht z.B. dagegen unmittelbar nach der Abfrage ob es der 39. Interrupt ist als aller erstes den Timer1 zu stoppen, damit der nichtmehr weiter misst?

    Im übrigen:
    Wie kommst Du auf 3906/4882 Interrupts? Ich komme auf andere Zahlen. (Zwar nicht deutlich andere aber wenn ich mit dem Holzhammer hinter Dir stehen würde, so würde ich Dir doch mit Genuß einen überbraten. :teufel: )

    10E6/8/256 = 4882,8125. Was passiert zwischen 0,8125 und 1? Ein Interrupt! Die Anzahl der Interrupts lautet daher...!?

    Ciao,
    Werner

  2. #82
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    36
    Beiträge
    470
    Pind.5 war nur zur Kontrolle, das ist jetzt raus!
    10E6/8/256 = 4882,8125. Was passiert zwischen 0,8125 und 1? Ein Interrupt! Die Anzahl der Interrupts lautet daher...!?
    4883 OK, hab ich vergessen!
    Hast du schon mal mit EXt. Speicher geschaft, wenn ja scho mal auf meinen EXt. Speicher Thread, hab nähmlich nedn Problem.
    Danke für deine Hilfe. Ach wie kann ich denn noch genauer ( Frequenzz. ) machen, wenn ich den von meinem Vater nehme ( schon fast 30 Jahre alt ) kommt da ne Frequenz mit einer abweichung von 10% raus! Wie kann ich meinen Frequenzz. kalibrieren??????
    G

  3. #83
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124
    Hallo Teslanikola,

    zum Kalibrieren mußt Du Deinen Frequenzzähler gegen ein Frequenznormal antreten lassen. Das kann ein nach DKD der NYST kalibrierter Frequenzzähler oder ein Frequenzgenerator sein. Sowas kostet in einem Kalibierlabor 500-1000 Euro, also vergiss es.

    Um zu sehen wie genau dein Frequenzzähler ist hast Du imo zwei praktikable Wege. Zum einen teste Deine Software sorgfältig im Simulator aus. Hier ist es insbesondere interessant, daß die Messzeit möglichst genau stimmt. Überpüfen kannst Du dieses anhand des Zykluszählers im Simulator und der Funktion "Running to Cursor".

    Dann brauchst Du ein Oszi und überprüfst damit, ob Deine Eingangsbeschaltung irgendweche Takte verschluckt. Wenn das nicht der Fall ist, dann kannst Du eigentlich davon ausgehen, das der Frequenzzähle mit passabler Genauigkeit läuft.

    Ansonsten nimm z.b. einen 2. Atmel, programmier einen Rechteckgenerator, Threads mit Codebeispielen gibts genug, und verwende den zu testen Deines Frequenzzählers.

    10% Abweichung bei einem 30Jahre alten Frequenzgenerator/-zähler halte ich nicht für ungewöhnlich viel. Vermutlich ist das Teil einfach nicht mehr genauer. Bei so alten Geräte ist die Takterzeugung / Torzeiterzeugung noch analog gelöst und driftet damit entsprechend stark bei Bauteilalterung. Unser 20000DM teurer Rohde&Schwarz Generator weist eine Abweichung von fast 1% auf und der ist gerademal 10 Jahre alt und volldigital.
    (Getestet gegen ein frisch kalibriertes Fluke ScopeMeter. Genauigkeit in Frequenzzählmodus laut Kalibrierprotokoll besser als 0,000005%. (0.1% der zulässigen Abweichung von 0.5%. Ich liebe Kalibrieprotokolle ).

    Bezüglich externem Speicher hab ich keine praktische Erfahrung.
    Nur wie es theoretisch geht. Gibt 'nen schönes kleines Beispiel im Rowalt Buch (aber das hab ich Dir ja schon einige male ans Herz gelegt).

    Ciao,
    Werner

  4. #84
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    36
    Beiträge
    470
    Wenn ich wieder Flüssig bin lege ich mir das Buch zu, hast die ISBN?

  5. #85
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124
    Hallo Teslanikola,

    Wenn ich wieder Flüssig bin lege ich mir das Buch zu, hast die ISBN?
    ISBN gibts leider nicht. Rowalt verlegt im Eigenverlag www.rowalt.de
    Das Buch ist trotzdem keine kopierte Blättersammlung. Ich war positiv überrascht. Wo man sich dran gewöhnen muß ist seine Eigenart alles was man einfach in Assembler machen kann auch in Assembler zu machen. Das hat aber den positiven Nebeneffekt, daß einem gleichzeitig die Angst vor Assembler genommen wird. Und alles was er macht, egal ob in Basic oder Assembler erklärt er schritt für schritt.

    Es gibt noch eine Experimentierplatine zu Buch. Imo braucht man die aber nicht. Wenn man nichts hat hat um einen AVR zu programmieren ist sie sicher nicht verkehr, aber wenn mans eh schon kann, dann gehts auch mit 'nen Steckbrett/Lochrater oder einfach nur im Kopf.

    Ciao,
    Werner

  6. #86
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    36
    Beiträge
    470
    Nicht schlecht, kaufe ich mir ( sobald die sch*** Prüfungen rum sind, weil wenn ichs hab lern ich nix mehr [Prüfungen] )

  7. #87
    Neuer Benutzer Öfters hier
    Registriert seit
    25.03.2005
    Beiträge
    10

    Einfacher Frequenzzähler

    Hallo zusammen

    In Sachen AVR und Bascom bin ich noch ein ziemlicher Anfänger. Trotzdem wollte ich einen Frequenzzähler bauen und habe folgende Lösung gefunden:

    Timer/Counter0 funktioniert als Zähler, er zählt also die externen Impulse. Bei jedem Überlauf wird in einem Interrupthandler ein Byte (oder evtl. ein Word) um eins hochgezählt.

    Timer/Counter1 stellt die Torzeit (z. B. eine Sekunde) zur Verfügung. Dazu wird die Taktfrequenz (4 MHz) mit dem Prescaler durch 64 geteilt und der Compare-Wert auf 65200 gesetzt. Zwischen je zwei Compare-Ereignissen vergeht so genau eine Sekunde.

    In einer weiteren Interrupt-Routine wird nun bei jedem solchen Compare-Ereignis Timer0 ausgelesen. Die Frequenz ergibt sich dann aus der Anzahl Überläufe von Timer0 mal 256 plus dem Schlussstand von Timer0. Dann wird Timer0 zurückgesetzt und alles beginnt von neuem.

    Diese Lösung funktioniert, soweit ich das bis jetzt getestet habe, gut. Zugegebenermassen werden bei hohen Frequenzen die Interrupts etwas häufig aufgerufen.
    Falls irgendein "alter Hase" mir verborgene Schwächen dieser Methode aufzeigen könnte, würde mich das sehr interressieren

  8. #88
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    36
    Beiträge
    470
    So funkt meiner auch, der eine Timer generiert die Torzeit, der andere zählt die Impulse, der Arbeitet recht gut!!!

  9. #89
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124

    Re: Einfacher Frequenzzähler

    Hallo deuterius,

    Falls irgendein "alter Hase" mir verborgene Schwächen dieser Methode aufzeigen könnte, würde mich das sehr interressieren
    schwäche nicht gerade, aber eine nicht optimale Ressourcen-Ausnutzung.

    Du benutzt Timer0 als externen Zähler und Timer1 als Torgenerator. Damit mußt Du für jeden Zählimpuls einen Interrupt auslösen, was bei niedriegen Frequenzen kein Problem darstellt, die maximal mögliche Frequenz aber unnötig verringert.

    Benutzt Du Timer 0 als Torgenerator und Timer1 als externen Zähler, dann kannst Du die Counter-Unit des Timer1 verwenden und die Zähl-Interrupts einsparen.

    Alternativ kannst Du, je nach verwendetem AVR, auch Timer2 als externen Zähler verwenden. Dieser besitzt meist ebenfalls eine Counter-Unit.

    Nikolas Lösung entspricht, vom Grundprinzip Deiner her, nur daß er eben die Timer getauscht hat und die Counter-Unit nutzt. IMO ist das eleganter.

    Wenn ich ihn noch dazu bringen OVERLAY zu verwenden, anstatt *256 oder +65536 zu rechnen, dann wär ich mit seinem Programm (fast) gänzlich zufrieden. :teufel:

    Ciao,
    Werner

  10. #90
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    36
    Beiträge
    470
    So habs noch nen bissele Verbessert ( siehe Pulses und Sek )
    Code:
    $regfile = "2313def.dat"
    Config Portb = Output
    Config Portd = Output
    Config Pind.5 = Input
    
    Dim Var1 As Byte
    Dim Freq As Long
    Dim S As String * 5
    Dim X As Byte
    Dim Pos As Byte
    Dim Z As String * 1
    Dim L As Byte
    Dim W As Long
    
    
    Config Timer1 = Counter , Edge = Rising
    
    Enable Interrupts
    
    Enable Timer1
    
    Portd.5 = 0
    
    Timer0 = 216                                                ' Constante zum erzeugen einer "Exacten" Sek.
    Timer1 = 0
    
    
    Start Timer0
    Start Timer1                                                'Auf die Pins, Fertig, Messen!
    On Timer0 Sek
    On Timer1 Pulses                                            ' Anzeige Schlaufe
    Do
    
        S = Str(freq)
        L = Len(s)
    
    For X = 1 To L
    
          S = Str(freq)
          Pos = L - X
          Pos = Pos + 1
          Z = Mid(s , Pos , 1)
    
        If Z = "0" Then Portb = 63
        If Z = "1" Then Portb = 34
        If Z = "2" Then Portb = 94
        If Z = "3" Then Portb = 118
        If Z = "4" Then Portb = 99
        If Z = "5" Then Portb = 117
        If Z = "6" Then Portb = 125
        If Z = "7" Then Portb = 38
        If Z = "8" Then Portb = 127
        If Z = "9" Then Portb = 119
    
        If X = 1 Then Portd = 1
        If X = 2 Then Portd = 2
        If X = 3 Then Portd = 4
        If X = 4 Then Portd = 8
        If X = 5 Then Portd = 16
        Waitms 2
    Next X
    Loop
    
    Sek:
    
    Incr Var1
    
    If Var1 = 39 Then                                           'Wenn Timer0 39 überlief (1 Sek) dann:
    
      Freq = W + Counter1
      Var1 = 0
    
      Timer0 = 216
      Timer1 = 0
    
      End If                                                    ' Wenn Timer0 (Gatetimer) voll, dann Var1 + 1
    
    
    Return
    
    
    Pulses:
    
    W = W + 65536
    
    Return
    Das ist der Komplete Code inklusive Multiplex Ausgabe!!!

Seite 9 von 10 ErsteErste ... 78910 LetzteLetzte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress