- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 33

Thema: Unruhige Anzeige bei Drehzahlmesser für Zweitaktmotor

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    Eine Sache, die ich bei dem beschriebenen Verfahren in den Kommentaren gesehen habe, war wohl dass bei niedriger Drehzahl logischerweise auch die Spannung sinkt und du eventuell Pulse verpasst!

    Ein kleines Problem dabei ist, daß der Timer ab und an mal überläuft
    hatte ich auch zuerst vermutet, aber er verwendet in seinem Code ja Datentypen die auf den Timer passen also unsigned int 16 und wenn ich 2 uint16 subtrahiere macht der überlauf garnichts aus, die differenz ist immer gleich und immer positiv, der Vorteil von uint halt
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Ceos Beitrag anzeigen
    hatte ich auch zuerst vermutet, aber er verwendet in seinem Code ja Datentypen die auf den Timer passen also unsigned int 16 und wenn ich 2 uint16 subtrahiere macht der überlauf garnichts aus, die differenz ist immer gleich und immer positiv, der Vorteil von uint halt
    Du wirst sicher recht haben. Aber mir gefällt es grundsätzlich nicht, daß ein Programm nur mit Sideeffects funktioniert. Das mag in Assenbler noch angehen, in anderen Sprachen gibt es unsigned gar nicht. Ich versuche alles so zu halten, daß ein int zwar mindestens 16 Bit hat, der Code aber auch funktioniert, wenn es mal 64 sind. Mir sind noch die Problem beim Übergang von 16-Bit auf 32-Bit Code in Erinnerung. "unsigned" heißt bei mir eigentlich immer, es ist das Abbild eines HW-Registers, und da ist die Anzahl der benutzten Bits fest im Silizium. 10/12/14 Bit ADCs kann man direkt in ein int16_t einlesen und weiterrechnen, obwohl sie nie negativ werden. Nur bei Timern, wie hier, werden häufig alle Bits genutzt.

    Das sind aber meine persönlichen Vorlieben. Ich war hier einfach zu faul, das Ganze beim Überlauf mal durch den Debugger laufen zu lassen und alle Grenzwerte auszutesten. Wenn bei tausend Touren mal eine Umdrehung nicht gemessen wird, merkt man das in der Anzeige nicht und es ist halt so im Code geblieben.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.188
    Soweit Ich den Code verstanden habe benutzt er ja den ICP Interrupt für die Drehzahlmessung.
    Das sollte im Prinzip auch gut funktionieren und auch relativ unabhängig vom Auslesezeitpunkt sein.
    Ich vermute hier eher einen Fehler auf der Hardwareseite.
    Es kommen da evtl. unerwünschte Impulse durch.
    Bei so Magnetzündungen hab Ich auch schon mal einen unidirektionalen Hallsensor verbaut.
    Der liefert ein sehr gutes Rechtecksignal?!

    Die Mittelung der Werte kann man auch über einen Ringpuffer machen.

    Ein Zeiger erhält den Wert 0...4 bei jedem neuen Messwert inkrementierend.
    Jeder Messwert wird dann in das Array geschrieben, an den Platz auf den der Zeiger zeigt.
    Bei der Auswertung werden dann alle 5 Werte zusammengezählt und durch 5 geteilt.

    Nimmt man für das Array 2^n Werte gehts auch mit ner Schiebeoperation dann noch schneller.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Also echt. Klebwachs. Und alle anderen. Ihr habt mir ja eine Menge Input gegeben. Das will erst mal verarbeitet werden. Vielen Dank.

    Werde zunächst kurz die wichtigsten Fakten durchgeben:

    - Die Schaltung zur Abnahme des Zündimpulses vom Zündkabel ist im Eröffnungspost verlinkt.
    - Überlauf bei der Differenzbildung von zwei aufeinanderfolgenden Meßwerten aus dem ICR ist gewollt und von Ceos schon gut erklärt. Dort liegt das Problem nicht.
    - @wkrug: Mittelung mit Array hatte ich mit 8 Werten schon ausprobiert. War mir noch zu unruhig.
    - Frequenzgenerator hatte ich dran. Sinusgenerator an den 1µF aus dem verlinkten Schaltbild und GND Anzeige ist von 1020Upm bis 17000Upm (17Hz bis 283Hz) stabil.

    Ich tendiere jetzt auch schon ein wenig auf die Unzuverlässigkeit der Signalgewinnung für den µC.
    Oszi zeigte aber auch keine 100% stabile Zündfrequenz von der Maschine was aber auch normal ist. Die angezeigte große Abweichung von der mittleren Frequenz irritiert mich halt.

    Ich werde euren Input in Ruhe durchgehen und schauen, daß ich ein paar Meßreihen und aussagekräftige Ozillogramme aufzeichne und hier zeigen. Leider hat mein Oszi keinen großen Speicher, so daß es nicht einfach ist, seltene Ausreißer festzuhalten.

    @Klebwachs: Für Deinen Post muß ich mir nochmal extra Zeit nehmen.

    Gruß
    Searcher

    - - - Aktualisiert - - -

    PS: Noch zum Programm:

    Es gibt zwei ISR. Die Hauptschleife (do Loop) ist leer.

    Die "get_icr" wird aufgerufen, wenn am ICP-Pin eine steigende Flanke erkannt wird.
    Innerhalb der ISR wird das ICR Register, in den der aktuelle Timer1 durch die Flanke gesichert wurde, ausgelesen und die Differenz zum vorherigen ICR-Wert gebildet. Die Differenz ist die Zeit in µs zwischen zwei Zündimpulsen. Die Zeiten werden in der ISR in Accumul_difference noch aufaddiert. In Icp_events werden noch die Anzahl der Zündimpulse gezählt. Wenn nach Einschalten des Drehzahlmessers der alte ICR-Wert noch Null ist, ist die erste Drehzahlanzeige falsch.


    In der update_display, die ich einfach an den Timer1 angehangen habe, aber nur etwa einmal pro Sekunde wirklich was tun soll. Deshalb das "If Tov_count = 15 then" Hier werden dann die in "get_icr" gesammelten Werte für die Anzeige aufbereitet und über RS232 mit Print zum PC.
    Sind in Accumul_difference zB 990000µs zusammengekommen und in icp_events 45events werden 990000/45=22000µs als mittlere Zeit zwischen zwei Zündungen ausgerechnet. Entspricht einer Frequenz von 1/0,022s = 45 Hz. Das auf eine Minute in der Variablen Upmd (d für Double Word - 4 Byte unsigned Variable) gerechnet: 60000000/22000 entspricht 2727Upm.

    Sind 1000000µs bei 100 events zusammengekommen. 1000000/100=10000µs mittlerer Zündabstand, 60000000/10000=6000Upm
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Hallo,
    ich habe mal ein paar Messungen gemacht. Zunächst die verwendete Schaltung, die den Zündimpuls für den µC aufbereitet. (Mittlerweile fand ich im MC net weitere Kritiken dazu, die auch gar nicht gut aussehen).

    Bild hier  

    Abblockkondensatoren sind am 4093er und ATtiny2313 vorhanden. Versorgungsspannung ist sauber.

    Das Programm wurde nur dahingehend verändert, daß man vom PC Terminal die Messungen untereinander geschrieben werden und wurden von dort kopiert. SW Hysterese testet auf >-1 statt auf >10, so das von einer Sekunde zur anderen jede Änderung geschrieben wird. Außerdem wird am Anfang einer Zeile eine Meßsequenznummer ausgegeben und am Ende einer Zeile steht die Anzahl der Zündimpulsabstände, die innerhalb einer Sekunde addiert wurden und durch die dann zur Mittelwerterzeugung geteilt wurde. Zum Start einer Meßreihe wurde die Versorgungsspannung für den stromlosen Drehzahlmesser eingeschaltet.

    Hier die Meßwerte mit dem Sinusgenerator (alter analoger Pegelsender von Siemens, ein W2040).
    Anhang 45Hz_Sinus_1Min_lang_60Updates.txt
    Anhang 283Hz_Sinus_1Min_lang_60Updates.txt

    Und Oszillogramme:
    45Hz_Sinus_Pin8.png, Kanal 1 - Generatorsignal wie in Schaltung an C3, Kanal 2 - von Pin 8 des CD4093
    Bild hier  

    45Hz_Sinus_µC.png, Kanal 1 - Generatorsignal wie in Schaltung, Kanal 2 - rechte Seite von R4
    Bild hier  

    283Hz_Sinus_Pin8.png
    Bild hier  

    283Hz_Sinus_µC.png
    Bild hier  


    Hier Messungen an einer Motorsäge im Leerlauf, die vom Werk auf 2700Upm eingestellt ist. Dazu muß man sagen, daß je nach Temperatur die Leerlaufdrehzahl anders ist. Abweichungen davon sind also normal. Ich wüßte nur zu gerne in welchem Maße die Drehzahl zB im Sekundentakt abweicht. Im Oszi erkennt man deutlich Abweichungen von einem Zündungsabstand zum anderen. Der Zündimpuls wurde einmal einadrig mit Krokoklemme am Zündkabel abgenommen und an C2=220pF angeschlossen. Bei den beiden anderen Meßreihen wurde der Draht mit 3 Windungen um das Zündkabel gelegt und mit C2=220pF und mit C2=1nF gemessen. (Meßreihe mit Kroko an 1nF ist verschwunden )

    Anhang Kroko_220pF.txt
    Anhang 3Wdg_220pF.txt
    Anhang 3Wdg_1nF.txt

    Die Oszillogramme zeigen Kanal 1 an Pin 8 vom CD4093, Kanal 2 an rechter Seite von R4, also das Signal daß zum µC geht. Kanal 1 ict AC gekoppelt. +5V Gleichspannungsanteil dazu rechnen.

    Kroko_220pF.png
    Bild hier  

    Kroko_1nF.png
    Bild hier  

    3Wdg_220pF.png
    Bild hier  

    3Wdg_1nF.png
    Bild hier  

    Und noch das Zündabnahmedrahtsignal Kanal 1 (Kein Gleichstromanteil) direkt vor C2 und Kanal 2 nach R4.

    raw.png
    Bild hier  

    Alles erstmal ohne Kommentar, da selbst noch nicht genauer analysiert. Jedoch sind die Schwankungen geringer als bei meinen ersten Versuchen - warum auch immer? Subjektiv funktioniert es mit Wicklung um das Zündkabel besser..


    Gruß
    Searcher
    Angehängte Dateien Angehängte Dateien
    Geändert von Searcher (06.06.2019 um 19:13 Uhr) Grund: Inhalt von Kroko_220pF.txt berichtigt
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.188
    Eeventuell entstehen die Schwankungen auch durch schwankende / fehlerhafte Teilerfaktoren?!

    Probier mal pro sekunde nur 8 aufeinanderfolgende Messwerte aufzuaddieren und das Ergebnis duch 8 zu teilen.
    Das funzt dann runter bis 500 U/min.
    Wenn die Anzeige dadurch stabiler wird hab ich vermutlich mit meiner Annahme recht.

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    Zitat Zitat von wkrug Beitrag anzeigen
    Probier mal pro sekunde nur 8 aufeinanderfolgende Messwerte aufzuaddieren und das Ergebnis duch 8 zu teilen.
    Ich glaub, so etwas hab ich schon gemacht und verworfen. Bevor ich die Säge wieder anschmeiße und Meßreihen dazu aufnehme :meintest Du es so? ...

    In einem Ringpuffer mit 8 Plätzen ( Middle( 8 ) ) werden 8 aufeinanderfolgende ICP Meßwerte, also der Abstand von einer Zündung zur anderen reihum abgespeichert.
    Ist nach etwa einer Sekunde ein Update der Anzeige dran, wird der Mittelwert der letzten 8 Meßwerte gebildet und angezeigt. Siehe Code.

    Code:
    $regfile = "ATtiny2313.DAT"
    $framesize = 24
    $swstack = 24
    $hwstack = 34
    $crystal = 8000000
    $baud = 57600
    $lib "mcsbyteint.lbx"
    
    Dim Icr_new As Word
    Dim Icr_old As Word
    Dim Icr_difference As Word
    Dim Upmd As Dword
    Dim Upm_o As Word
    Dim Tov_count As Byte
    
    Dim Middle(8) As Word
    Dim Ar_idx As Byte
    Dim Idx As Byte
    Dim Diff As Dword
    Dim Icp_alive As Byte
    Dim Disp_upd As Byte
    Dim Icp_events As Word
    
    Print "Drehzahlmessung"
    
    Tccr1b = Bits(cs11 , Ices1)                                 'prescaler = 8, input capture event on rising edge
    
    On Timer1 Update_display
    Enable Timer1
    
    On Icp1 Get_icr
    Enable Icp1
    
    Enable Interrupts
    
    Do
    Loop
    
    Get_icr:                                                    'called by an ICP event
       Incr Icp_events
       Icr_new = Icr1                                           'save ICR register
       Icr_difference = Icr_new - Icr_old
       Icr_old = Icr_new
       If Idx < 8 Then Incr Idx Else Idx = 1                    'value into 8 elements ring buffer
       Middle(idx) = Icr_difference                             'value into 8 elements ring buffer
       Icp_alive = 1
    Return
    
    Update_display:
      Incr Tov_count
      If Tov_count >= 15 Then                                   'display update in about 1s interval
        Incr Disp_upd                                           'sequence number for display update
         For Ar_idx = 1 To 8
           Diff = Middle(ar_idx) + Diff                         'add last 8 values before display upd
         Next
        Upmd = 480000000 / Diff                                 'calculate rpm 60.000.000/(diff/8)
        Upm_o = Upmd
        If Icp_alive = 0 Then Upm_o = 0
    'Remark    Print "     " ; Chr(13) ; Upm_o ; Chr(13);
         Print Disp_upd ; ": " ; Upm_o ; "  " ; Icp_events
        Tov_count = 0
        Diff = 0
        Icp_alive = 0
        Icp_events = 0
      End If
      If Disp_upd = 60 Then Disp_upd = 0
    Return
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

Ähnliche Themen

  1. Drehzahlmesser
    Von -Hurricane- im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 18.08.2014, 22:33
  2. Drehzahlmesser
    Von highcom im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 05.05.2010, 10:58
  3. Drehzahlmesser
    Von vohopri im Forum Vorstellungen+Bilder von fertigen Projekten/Bots
    Antworten: 24
    Letzter Beitrag: 14.03.2010, 08:08
  4. Drehzahlmesser
    Von derdaswar im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 10
    Letzter Beitrag: 17.07.2009, 16:45
  5. Drehzahlmesser
    Von TheHawk im Forum Elektronik
    Antworten: 13
    Letzter Beitrag: 14.12.2007, 20:04

Berechtigungen

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

Labornetzteil AliExpress