- fchao-Sinus-Wechselrichter AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: ENCODER Befehl zu langsam

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    21.07.2005
    Beiträge
    18

    ENCODER Befehl zu langsam

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich habe versucht den Encoder Befehl praktisch wie in der Hilfe angegeben zu benutzen. Das funktioniert auch ganz ausgezeichnet wenn ich wirklich langsam drehe, sobald ich etwas schneller werde wird nur noch ab und zu etwas gezählt.

    Gibt es eine Möglichkeit den Befehl mit einem Interrupt zu nutzen ?
    Ich habe schon andere Vorschläge hier aus dem Forum versucht, aber die bringen nicht so gute Resultate wie der Bascom Befehl.

    Ach so, ich nutze einen ATMega32 und einen Schrittmotor mit einem LM393 als Drehgeber.

    Beste Grüße

    Markus

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Das Voll-dekodieren ist, wenn's schneller geht, ein absoluter Full-Time-Job. Du mußt mal ausrechnen, wieviel Impulse du nun tatsächlich brauchst und dann sehen, ob sich das überhaupt ausgehen KANN.
    Der Code von Bascom ist ja eigentlich nicht sehr lang.
    https://www.roboternetz.de/wissen/in...ur-.29_ENCODER

    Beim Interrupt isses ja auch nicht so, daß auf einmal ein Wunder geschieht. Die Minimallösung wäre, von jedem Encoder ein Signal auf INT0
    bzw INT1 zu legen, und im Interrupt das andere Signal zu checken, ob's rauf oder runter geht.

    Rechne wirklich mal nach, was für Erfordernisse du tatsächlich hast.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    21.07.2005
    Beiträge
    18
    Danke erst einmal für die Antwort Robert !

    Ich drehe das Ding von Hand und über den LM393 liefert der Stepper den ich als Encoder "missbrauche" nur 12 Impulse pro Umdrehung.
    Das ganze soll als Eingabe in einem DDS Generator dienen und da schubst man den Knopf halt schon mal an. Das schafft die ENCODER Routine aber nicht.

    Ich habe schon mit optischen Encodern gearbeitet, allerdings über eine Interruptroutine. Da schaffe ich es selbst mit schnellem drehen nicht das Zählen aus dem Takt zu bringen obwohl ich da von dem optischen Encoder bis zu 500 Impulse pro Umdrehung bekomme.

    Leider hab ich mit der Abfrage, die ich dort benutzt habe kein Glück gehabt, damit habe ich Probleme bei der Richtungsabfrage seltsamerweise.

    Naja ich werde dann mal weiterbasteln, vieleicht finde ich ja auch den Fehler in meiner alten Routine.

    Danke,
    Markus

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    Also eigentlich sollten auch 500 Impulse / sek nicht das große Problem für einen Mikrocontroller darstellen.

    Vielleicht solltest du mal die minimallösung von Picnic austesten.

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Also, mit dieser beschaulichen Geschwindigkeit sollten alle Varianten klarkommen, möcht' man meinen.
    Jetzt müßte man von deinem Programm wohl etwas mehr wissen, glaub ich. Vielleicht ist ja wo eine Ecke drinnen ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    21.07.2005
    Beiträge
    18

    Programm

    Danke nochmal für eure Mühe !

    Hier das Programm, das mit meinem optischen Encoder einwandfrei funktioniert:

    Code:
    $regfile = "m32def.dat"
    $crystal = 8000000
    $baud = 9600
    
    Ddrd.2 = 0                                                  'Eingänge mit Pullup für Drehgeber
    Portd.2 = 1
    
    Ddrd.4 = 0
    Portd.4 = 1
    
    On Int0 Onint0
    Mcucr.isc00 = 1                                             'INT0 bei FALLING + RISING
    Mcucr.isc01 = 0
    Gimsk.int0 = 1
    
    Dim Drehgeber As Long                                       'wird von ISR (INT0) verändert
    Dim Drehgeber_alt As Long
    
    Drehimpuls1 Alias Pind.2
    Drehimpuls2 Alias Pind.4
    Onint0:
      If Drehimpuls2 <> Drehimpuls1 Then                        'test phase B
       If Divider1 = 9 Then                                     'soll 9 sein
        Divider1 = 0
             Incr Drehgeber
       Else
        Incr Divider1
        Divider2 = 0
       End If
      Else
       If Divider2 = 9 Then                                     'Soll 9 sein
        Divider2 = 0
             Decr Drehgeber
       Else
        Incr Divider2
        Divider1 = 0
       End If
     End If
    Return
    Den Divider hab ich nur drin um die über 500 Impulse pro Umdrehung auf ein Maß zu bringen, dasss man auch von Hand drehen kann

    So und hier der Versuch mit dem Bascom Befehl :

    Code:
    $regfile = "m32def.dat"                                     ' specify the used micro
    $crystal = 8000000                                          ' used crystal frequency
    $baud = 19200                                               ' use baud rate
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 10                                               ' default use 10 for the SW stack
    $framesize = 40                                             ' default use 40 for the frame space
    Config Lcd = 20 * 4a , Chipset = Ks077                      '20*4 LCD DIP
    Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.3 , Rs = Porta.2
    Cls
    Locate 1 , 1
    Lcd "Encoder test"
    Dim B As Byte
    Dim Wert As Integer
    Dim Divider1 As Integer
    Dim Divider2 As Integer
    Wert = 100
    'we have dimmed a byte because we need to maintain the state of the encoder
    
    Portb = &B11                                                ' activate pull up registers
    
    Do
       B = Encoder(pind.3 , Pind.2 , Links , Rechts , 0)
       '                                               ^--- 1 means wait for change which blocks programflow
       '                               ^--------^---------- labels which are called
       '              ^-------^---------------------------- port PINs
       Lcd B
       Locate 4 , 1
       Lcd "" ; Wert ; "  "
      Waitms 10
    Loop
    End
    
    'so while you can choose PINB0 and PINB7,they must be both member of PINB
    'this works on all PIN registers
    
    Links:
    Locate 2 , 1
      Lcd "left rotation   "
      Decr Wert
    Return
    
    Rechts:
    Locate 2 , 1
      Lcd "right rotation  "
      Incr Wert
    Return
    
    
    End
    Das ist praktisch genau der Code aus der Hilfe.

    Gruß Markus

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Nun, "Waitms 10" nach jeder Abfrage (ohne change WAIT) ist nicht zweckmäßig, da geht ihm ja was verloren.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    21.07.2005
    Beiträge
    18
    Das habe ich gerade einmal auskommentiert, nützt aber nicht viel. Sobald ich den Knopf ein bischen "andrehe", so wie man das von Funkgeräten kennt z.B. verliert er den Takt und erkennt auch die Drehrichtung nicht sauber.

    Ich vermute aber so langsam vieleicht ein Problem mit meiner Hardware, wobei die Signale auf dem Oszilloskop eigentlich ganz ok aussehen.

    ich werde aber morgen mal mit einem Speicheroszi messen, dann kann ich auch die Abstände sehen, die kommen auf meinem analogen Oszi nicht so gut raus.

    Vielen Dank erst mal

    Markus

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Code:
    Do 
       B = Encoder(pind.3 , Pind.2 , Links , Rechts , 1) 
                          --- 1 means wait for change which blocks programflow 
       Lcd B 
       Locate 4 , 1 
       Lcd "" ; Wert ; "  " 
     Loop 
    End
    Probier's mal mit "WAIT" beim "ENCODE"
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    21.07.2005
    Beiträge
    18
    Hi

    hab ich auch versucht, wird aber nicht schneller, hält mir nur das Programm an.

    mfG
    Markus

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress