-         

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

Thema: ATMega32 mit mehreren Drehgebern

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.07.2004
    Beiträge
    510

    ATMega32 mit mehreren Drehgebern

    Anzeige

    Guten Morgen liebes Forum,

    ich beschäftige mich gerade damit wie man Drehgeber an dem Mega32 anschließt.
    http://www.reichelt.de/?;ACTION=3;LA...cbf53e7a2a9946

    Ich habe ein Bespiel gefunden wie man einen Drehgeber anschließt und auswertet.
    http://www.mschrod.de/Elektronik/AVR...Drehgeber.html

    Wie verhält es sich nun aber wenn man mehrere Drehgeber auswerten will?
    Konkret geht es darum zwei Motoren mit einem Controller zu steuern und die Drehgeber auszuwerten.

    Das Beispiel arbeitet mit externen Interrups, allerdings hat der Mega32 keine vier Interrupt-Pins die ich für zwei Drehgeber bräuchte.

    Wie kann man hierbei vorgehen?

    Danke für eure Mühe und eure Ideen!
    Crypi

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551

    Re: ATMega32 mit mehreren Drehgebern

    Hi,
    Zitat Zitat von jcrypter
    ... wie man Drehgeber an dem Mega32 ... allerdings hat der Mega32 keine vier Interrupt-Pins die ich für zwei Drehgeber bräuchte ...
    soweit ich die Materie (theoretisch) kenne, brauchst Du für einen Drehgeber im Prinzip nur einen Interrupt. Der "andere" Pin des Drehgebers kann für die Drehrichtungserkennung in der ISR des einen Interrupts ganz normal ausgewertet werden.

    ABER Du könntest Dir natürlich auch einen ~644~ holen. Der ist pinkompatibel zum m32, hat deutlich mehr Speicher (Flash, SRAM und EEPROM), hat drei "reine" externe Interrupts und Du kannst fast alle Pinns als PCINTx definieren. Solche PCINTnx habe ich auch schon mit Erfolg verwendet (aber noch nie für Drehgeber und bisher nur an m168/m32.
    Zitat Zitat von At[size=1
    [/size]mel-doc 8011M–AVR–08/09 auf Seite 67]... The External Interrupts are triggered by the INT2:0 pin or any of the PCINT31:0 pins ...
    Softwaremässig sind diese zusätzlichen Interrupts in zwei Gruppen an zwei verschiedene Interruptvektoren gebunden - muss man halt berücksichtigen.
    Ciao sagt der JoeamBerg

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.07.2004
    Beiträge
    510

    Re: ATMega32 mit mehreren Drehgebern

    Zitat Zitat von oberallgeier
    Hi,
    Zitat Zitat von jcrypter
    ... wie man Drehgeber an dem Mega32 ... allerdings hat der Mega32 keine vier Interrupt-Pins die ich für zwei Drehgeber bräuchte ...
    soweit ich die Materie (theoretisch) kenne, brauchst Du für einen Drehgeber im Prinzip nur einen Interrupt. Der "andere" Pin des Drehgebers kann für die Drehrichtungserkennung in der ISR des einen Interrupts ganz normal ausgewertet werden.
    Dass heißt, den zweiten Pin kann man an einen beliebigen Port hängen um die Drehrichtung auszuwerten?

    Crypi

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Bei meiner letzten Drehgeber Routine hab ich den Drehgeber im Timer 0 Overflow Interrupt gemacht, der alle 2ms abgefragt wird.

    Der letzte Zustand wird in einer Variable abgespeichert.
    Nur wenn sich daran was geändert hat wird eine Auswerte Routine ausgeführt, die Abhängig vom Ursprungszustand eine weitere Variable hoch oder runter zählt. Es werden nur Ereignisse gezählt, die in den Grey Code passen.

    Dadurch findet auch gleich eine Entprellung des Drehgebers statt.

    Das Ganze liesse sich relativ einfach auf 2 oder noch mehr Drehgeber erweitern.

    Die Drehgeberfrequenz darf dabei allerdings nicht zu hoch werden, sonst könnten Impulse "übersehen" werden.

    Man könnte die Timerintervalle noch weiter verkürzen um das zu verhindern.

    Bei mir wird der Drehimpulsgeber von Hand bedient, was ja nun auch nicht sehr schnell geht.

    Den Codeschnipsel kannst Du gerne haben, der ist allerdings in "C".

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551

    Re: ATMega32 mit mehreren Drehgebern

    Zitat Zitat von jcrypter
    ... den zweiten Pin ... an einen beliebigen Port hängen um die Drehrichtung auszuwerten ...
    Zitat Zitat von oberallgeier
    ... soweit ich die Materie (theoretisch) kenne ....
    Wie geschrieben - soweit ich weiß . . . .

    Aber Du drehst doch Deine Geber von Hand, da ist der vorletzte Satz von wkrug DIE Möglichkeit . . . .
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.07.2004
    Beiträge
    510
    Danke für eure Antworten!
    Ich versuche das nochmal zusammen zufassen.
    Ich schließe zwei Drehgeber an beliebige Pins des Controllers an.
    Der Timer checkt jetzt nach einer vorgegebenen Zeit den Zustand der Pins.
    Die Variablen werden hochgezählt.
    Wie ändert sich denn der Zustand an den Pins?

    Je mehr Impulse pro Umdrehung der Drehgeber sendet, desto größer wird auch die Wahrscheinlichkeit, dass einer übersehen wird, oder? Natürlich ist das auch abhängig von der Drehgeschwindigkeit.

    Crypi

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    Zitat Zitat von jcrypter
    ... Je mehr Impulse ... desto ... übersehen ...
    In solchen Fällen rechne ich nach der Methode Milchmädchen. Bei Dir also: abschätzen, wie schnell Du drehst (z.B. in Upsec) - mal Impulse pro Umdrehung. Diese x Impulse pro Umdrehung mal genüsslich betrachten unter der Angabe, wieviel Megahertz Dein Controller macht. Vorteil beim Pollen im Timerinterrupt wäre ja, dass Du immer gleichzeitig beide Encoder auslesen könntest.

    Dein ALPS STEC12E macht 24 I/Umd. Wenn ich mich bemühe, drehe ich einen dünnen Drehknopf höchstens 10 x pro Sekunde. Gäbe also bei zwei Encodern allenfalls 500 Hz. WENN ich einen Controller langsam laufen lasse, macht der 1 MHz. . . . . . . . Meine bevorzugten m168/m328 machen 20 MHz . . . . . . . Wenn die nix anders zu tun bekommen ausser Encoder auslesen, sind die total gelangweilt (aber Du willst ja sicher mit dem ausgelesenen Wert etwas machen).
    Ciao sagt der JoeamBerg

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.07.2004
    Beiträge
    510
    Ok, danke für deine Analyse
    Ich denke das trifft es so ganz gut.

    Wie würde ich die Pins abfragen?
    So wie man auch einen Taster abfragen würde?

    Crypi

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Das Coding ist immer
    00 - 10 - 11 - 01
    ausgehend von einem Zustand kann als nächstes immer nur der Code rechts oder Links davon als nächstes kommen. Je nach dem ob man rechts oder links rum dreht.
    Ich stell den Code, obwohl in C, trotzdem mal ein...
    Im Prinzip dürfte es mit Bascom ja genauso gehen.
    Code:
    // Timer 0 overflow interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    
    // Rotary Encoder PD2 + PD3
    uc_rot=(PIND&0b00001100);
    if(uc_mode>100)   //Hab das Modus abhängig gemacht
        {
        // Diese 4 Ursprungszustände sind möglich    
        if(uc_oldrot==0b00000000)
            {
            if(uc_rot==0b00001000){ui_sendbuffer[uc_position]-=2;}; //Die Variable wird runter gezählt
            if(uc_rot==0b00000100){ui_sendbuffer[uc_position]+=2;}; //Die Variable wird hoch gezählt
            }
        if(uc_oldrot==0b00001000)
            {
            if(uc_rot==0b00001100){ui_sendbuffer[uc_position]-=2;};
            if(uc_rot==0b00000000){ui_sendbuffer[uc_position]+=2;};
            }    
        if(uc_oldrot==0b00001100)
            {
            if(uc_rot==0b00000100){ui_sendbuffer[uc_position]-=2;};
            if(uc_rot==0b00001000){ui_sendbuffer[uc_position]+=2;};
            }    
        if(uc_oldrot==0b00000100)
            {
            if(uc_rot==0b00000000){ui_sendbuffer[uc_position]-=2;};
            if(uc_rot==0b00001100){ui_sendbuffer[uc_position]+=2;};
            }
        }    
    uc_oldrot=uc_rot;  //Der aktuelle Zustand wird für den nächsten Durchlauf abgespeichert
    
    }

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.07.2004
    Beiträge
    510
    Ok, danke!

    Ihr habt mir sehr geholfen!
    Dann werde ich mal daran gehen mir zwei Drehgeber zu bestellen.

    viele Grüße,
    Crypi

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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