-         

Ergebnis 1 bis 6 von 6

Thema: Asuro PWM Signal erzeugen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    16.11.2011
    Beiträge
    26

    Asuro PWM Signal erzeugen

    Anzeige

    Hallo,
    ich schreibe im Moment meine eigene Asurolib, um zu verstehen wie das "hinter den Kulissen abläuft". Die Funktionen für die LEDs sind kein Problem, doch ich weiß nicht, wie ich das PWM Signal für den Motor erzeugen muss. Das ist ja im Grunde genommen eine Leitung, welch in einer bestimmten Frequenz zwischen 1und 0 pendelt, oder habe ich da etwas falsch verstanden?
    Vielen Dank.

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    ... eigene Asurolib ... PWM ... für den Motor ... eine Leitung ... zwischen 1und 0 pendelt ...
    Das stimmt - für "NUR-PWM". Für die Motoransteuerung ist nicht ganz sooo einfach, da musst Du eine so genannte H-Brücke bedienen.

    Es sind DREI Leitungen PRO MOTOR. Zwei werden zwischen 0 und 1 geschaltet; das ergibt je nach Schaltmuster: vorwärts, rückwärts und Stillstand - Leerlauf, manchmal als vierten Zustand "dynamische Bremse". Die dritte Leitung bringt das PWM-Signal - damit wird die Motordrehzahl gesteuert. Das Ganze ist hier ganz gut beschrieben (klick). Da wird auch die Prinzipschaltung gezeigt (Genaueres natürlich im asuro-Schaltplan).

    Der Ablauf ist im Link weiter unten, bei der Beschreibung zu Motor-IC´s nochmal vorgestellt. Siehe dort auch die Wahrheitstabelle der Schaltung.

    Viel Erfolg.
    Ciao sagt der JoeamBerg

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    16.11.2011
    Beiträge
    26
    Danke für die Links nach so etwas habe ich gesucht, bin aber immer auf das asurowiki gekommen, wo def teil mit dem pwm signal ausgelassen wurde.

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    ... bin aber immer auf das asurowiki gekommen, wo def teil mit dem pwm signal ausgelassen wurde.
    Die asurolib ist ja schon mal ne gute Vorlage für eigene Ansätze. WENN Du etwas mehr Gehirnschmalz (zur Erleuchtung oder Verwirrung - beides ist möglich) möchtest, dann lies Dir vielleicht meinen Code durch. Der ist für nen mega168/328/20MHz geschrieben und bedient einen L263D. Da ist auch - denke ich - die Pindefinition und -funktion einigermassen deutlich. Aber die eigenen Töchter sind ja auch immer die schönsten.

    Daher - nicht zum Lesen gedacht:
    Code:
    /* >> 
      Sicherung 14Aug12 1704   ..C2\D01_41\D041_mot60.c
     ===================================================================================
      Target MCU        : siehe main
      Target Hardware   : MiniD0
      Target cpu-frequ. : In der Quelle wählbar
     ================================================================================ */
    // ============================================================================== =
    // ==  PWM-Routinen zur Motoransteuerung
     void TC0PWM_init(void) //Init Timer/Counter0 für Erzeugung des PWM-Signals
     {
       TCCR0A |= (1<<COM0A1)|(1<<COM0B1);   //Clear/set OC0A/OC0B on Compare Match,
                                            //    doc S102 , OC0A/OC0B ist Port PD6/D5
       TCCR0A |= (1<<WGM01)|(1<<WGM00);     // Fast PWM, TOP=0xFF=dez255,     doc S104
                    //  das ergibt aus 20 MHz mit Prescaler 1/64  1220 Hz
       TCCR0B |= (1<<CS01)|(1<<CS00);       // Prescaler ist clk/64           doc S106
       TIMSK0 &= ~(1<<OCIE0A)|(1<<OCIE0B); // Tmr/Cntr0 Oput CompB Match intrrpt dsabld
       TIMSK0 &= ~(1<<TOIE0);  // Tmr/Cntr0 Overflow interrupt disabled
       OCR0A     = 0;                       // PWM auf Null setzen
       OCR0B     = 0;                       // PWM auf Null setzen
    }            
    // ============================================================================== =
    void setPWMrechts(uint8_t speed)        //Geschwindigkeit Motor 12 (rechter)
    {OCR0B = speed;}                        //  PWM auf PD5/OC0B, korrig. 24mrz09
    // ============================================================================== =
    void setPWMlinks(uint8_t speed)         //Geschwindigkeit Motor 34 (linker)
    {OCR0A = speed;}                        //  PWM auf PD6/OC0A, korrig. 24mrz09
    // ============================================================================== =
    
    // ============================================================================== =
    // Motoransteuerung mit dem L293D, hier werden die Drehrichtungen gesetzt 
    //   Anschlüsse M168 für R3D01 für die Motoransteuerung (Stand 24mrz09 1410) :
    //   Motor 12 ist in Fahrtrichtung rechts (Kennzeichen 1 Punkt)
    //   Motor 34 ist in Fahrtrichtung links  (Kennzeichen 2 Punkte)
    //                                 
    //  (E7)  _|-- 1,2 Guz, PD4___6   23___PC0, SFH 5110, IN irDME 1-2    
    //                      . . . . . . . . . . . .
    //               XTAL1  PB6___9   20___VCC
    //               XTAL2  PB7  10   19   PB5, SCK, Taster2                  
    //  (E6) PWM 1,2 uz+Guz,PD5  11   18   PB4, MISO,  _|-- 1,2  uz, Taster1  
    //  (E5) PWM 3,4 uz+Guz,PD6__12   17___PB3, MOSI, Reserve 2
    //  (E8)   _|-- 3,4  uz,PD7  13   16   PB2, Servo
    //  (E9)   _|-- 3,4 Guz,PB0  14   15   PB1, OC1A = SFH 415, OUT (irDME) 
    //   -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
    //      vgl. Erklärung von Hubert.G     (zu L293D)
    // http://www.roboternetz.de/community/threads/59146
    //-Wieso-benötigt-RN-Control-(1-4-)-für
    //-integrierten-Motortreiber-gleich-3-freie-Ports?p=558716&viewfull=1#post558716
    //      Zitat   Mit setzten von Kanal 1 und 2 auf 0 ist der Motor im Freilauf, 
    //              werden beide Kanäle auf 1 gesetzt wird der Motor gebremst
    //   -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -
    //                -----------------------
    //  Drehrichtungsbefehle für Motor 1,2 = "rechter" Motor
    //             r r r r r r r Motor 1,2 = rechter Motor r r r r r r
    // ============================================================================== =
      void Mrechtsvor (void)        // Mot12 dreht im Uhrzeigersinn = neg. math.
     {                              //   .. dann fährt rechtes Rad "vorwärts"
    // TCCR0A |=  (1<<COM0B1);      // Enable clear/set OC0B on Compare Match
       PORTD  &= ~(1<<PD4);         // Setze 1A low
       PORTB  |=  (1<<PB4);         // Setze 2A high
       mdir12 = 1; 
     }                              //
    // ============================================================================== =
      void Mrechtszur (void)        // Mot12 dreht im mathematisch positiven Drehsinn
     {                              //   .. dann fährt rechtes Rad "rückwärts"
    // TCCR0A |=  (1<<COM0B1);      // Enable clear/set OC0B on Compare Match
       PORTD  |=  (1<<PD4);         // Setze 1A high
       PORTB  &= ~(1<<PB4);         // Setze 2A low
       mdir12 = -1;                 //
     }                              //
    // ============================================================================== =
      void Mrechtsstop (void)       // Motor 12 aus
     {                              //
    // TCCR0A &= ~(1<<COM0B1);      // Disable clear/set OC0B on Compare Match
       PORTD  &= ~(1<<PD4);         // Setze 1A low
       PORTB  &= ~(1<<PB4);         // Setze 2A low
     }                              //
    //                -----------------------
    //  Drehrichtungsbefehle für Motor 3,4 = "linker" Motor
    //             l l l l l l l Motor 3,4 = linker Motor l l l l l l
    // ============================================================================== =
      void Mlinksvor (void)         // Mot3,4 dreht im mathematisch positiven Drehsinn
     {                              //   .. dann fährt linkes Rad "vorwärts"
    // TCCR0A |=  (1<<COM0A1);      // Enable clear/set OC0A on Compare Match
       PORTB  |=  (1<<PB0);         // Setze 3A high
       PORTD  &= ~(1<<PD7);         // Setze 4A low
       mdir34 = 1; 
     }                              
    // ============================================================================== =
      void Mlinkszur (void)         // Mot3,4 dreht im Uhrzeigersinn = neg. math.
     {                              //   .. dann fährt linkes Rad "rückwärts"
    // TCCR0A |=  (1<<COM0A1);      // Enable clear/set OC0A on Compare Match
       PORTB  &= ~(1<<PB0);         // Setze 3A low
       PORTD  |=  (1<<PD7);         // Setze 4A high
       mdir34 = -1;                 //
     }                              //
    // ============================================================================== =
      void Mlinksstop (void)        //  Motor 34 aus
      {                             //
    //  TCCR0A &= ~(1<<COM0A1);     // Disable clear/set OC0A on Compare Match
        OCR0A        =   0;         // PWM-Wert Mot34 auf Null setzen
        PORTB  &= ~(1<<PB0);        // Setze 3A low
        PORTD  &= ~(1<<PD7);        // Setze 4A low
      }                             //
    // ============================================================================== =
    Ach so - kleine Erklärung:
    uz ... Uhrzeigersinn - auf Motor-Abtriebswelle gesehen
    Guz ... Gegenuhrzeigersinn = math. positiver Drehsinn
    1,2 ... Motor eins, Anschlüsse 1,2
    3,4 ... Motor "zwei", Anschlüsse 3,4
    Ciao sagt der JoeamBerg

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    16.11.2011
    Beiträge
    26
    Auf der Verlinkten Seite von oberallgeier habe ich diesen Link gefunden, da wird das Gott sei dank etwas verständlich erklärt, ich glaube ich habs verstanden.
    Das heißt im Endeffekt das bei PWM 255 eine logische 1 anliegt (oder 0 je nach Schaltung) und bei 0 eine 0. Bei werten dazwischen, wird für eine bestimmte zeit 1 und dann für eine bestimmte zeit 0 geschaltet. Zum Beispiel bei PWM_max/2 wäre es 50% an und 50% aus, oder habe ich da was falsch verstanden?

    EDIT: Hier ist das auch nochmal schön erklärt.
    Geändert von SuperManitu (09.03.2014 um 12:45 Uhr)

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    ... wird für eine bestimmte zeit 1 und dann für eine bestimmte zeit 0 geschaltet ...
    Du hast das richtig verstanden. Anschaulich wird die Pulsweitenmodulation vielleicht besser beschrieben als ein Rechteckmodulation mit einer bestimmten/bestimmbaren Einschaltdauer. Die Einschaltdauer bzw. der duty cycle definiert dabei den Anteil einer Periode, bei dem das Signal high ist - bzw. wie Du schreibst: es ist 1. Den Rest der Periode - also Periodendauer minus Einschaltdauer - ist das Signal low = 0.

    Neben der Leistungsregelung von Elektromotoren, Glühbirnen, LEDs oder so - simpel ausgedrückt fließt Strom nur als der Anteil bei dem er eingeschaltet ist - wird PWM auch zur Signalübertragung benutzt, siehe Servoansteuerung *ggg*.
    Ciao sagt der JoeamBerg

Ähnliche Themen

  1. PWM-Signal erzeugen
    Von datatom im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 23.12.2012, 22:32
  2. RN-Mega2560 2 kHz-PWM-Signal erzeugen
    Von datatom im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 03.02.2012, 22:53
  3. Antworten: 0
    Letzter Beitrag: 04.07.2007, 17:10
  4. PWM-Signal erzeugen
    Von theodrin im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 11.12.2006, 16:10
  5. PWM Signal erzeugen - Motor steuern
    Von spom im Forum Motoren
    Antworten: 3
    Letzter Beitrag: 07.06.2006, 11:18

Stichworte

Berechtigungen

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