- 12V Akku mit 280 Ah bauen         
Seite 1 von 9 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 89

Thema: 1 Servo mit 2 Tasten ansteuer, aber wie :-(

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77

    1 Servo mit 2 Tasten ansteuer, aber wie :-(

    Hi @ll,

    Newbie braucht wieder hilfe
    Meine Überlegung ist folgende:

    2 Taster, 1 Servo.
    Taster 1 drehe Servo nach rechts solange taster gedrückt ist. Bei Max Servo Stop (nicht weiter nach rechts drehen!).

    Das gleiche umgekehrt mit Taster 2 Servo drehe links bis min. Bei min.
    Servo Stop (nicht weiter nach links drehen!).

    Hab schon mal folgendem Code programmiert:


    Code:
     int main (void){ 
    
      DDRD  |= (1<<PD5);    /* Pin D5 als Ausgang für Servo */ 
        
    
    //*** Taster ***
    
         DDRD  &= ~ (1<<PD2);          /* Pin D2 als Eingang */ 
         PORTD |= (1<<PD2);            /* Pull Up von PIN D2 aktivieren */ 
         DDRD  &= ~ (1<<PD3);          /* Pin D3 als Eingang */ 
         PORTD |= (1<<PD3);            /* Pull Up von PIN D3 aktivieren */ 
    
    
       while(1) 
       { 
         if (!( PIND & (1<<PIND2)))      /* mache was wenn PinD2 low ist */ 
          { 
                    /* PWM +1 drehe nach rechts bis max, wenn max dann Servo stop */ 
    		
          } 
         else { 
                    /* Servo Stop  */ 
    	  
         } 
    	 
    	      if (!( PIND & (1<<PIND3)))      /* mache was wenn PinD3 low ist */ 
          { 
                    /* PWM -1 drehe nach links bis min, wenn min dann Servo stop */ 
    		
          } 
         else { 
                    /* Servo Stop  */ 
    	  
         } 
         
        } 
       return 0; 
    
       }
    wie binde ich da den PWM ein?
    Habe schon stunde lang in Forum durchgeschaut und verstehe die codierung von PWM nicht. Wäre nett, wenn mir eine dabei helfen könnte!!!


    Danke

    P.s benutze ein atmega8

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    11.09.2007
    Ort
    Leipzig
    Alter
    43
    Beiträge
    31
    Bist du dir sicher, dass du richtig geschaut hast? Die Frage wird hier fast täglich gestellt und auf verschiedenste Art und Weise beantwortet.

    Im Grunde läuft es so:
    1. PWM-Modus aussuchen (8,9,10Bit)
    2. bei z.B. 8Bit: 2 x 2^8 = 512 -> passenden Prescaler wählen, damit die 512 Ticks/Increments in 20ms abgearbeitet werden
    3. ins OCR Register Wert schreiben, so dass OCR/2 * ZeitProTick= 1 bis 2 ms


    Wenn nun jemand einen Taster drückst, inkrementierst/dekrementierst du einfach den Wert in OCR und somit die "High-Zeit" deines PWM-Signals.
    Code:
    // initalize mega8 Timer1 with 9Bit, inverted, Prescaler 256
    // this gives us a signal with 21.76ms at 12MHz
    TCCR1A |= (1<<WGM11)|(1<<COM1A1)|(1<<COM1A0);
    TCCR1B = (1<<CS12); 
    
    OCR1A = 476; // pulse of 1.5ms 512- 1500*(F_CPU/256/1000000)/2
    Steht eigtl. alles hier: http://www.mikrocontroller.net/artic...WM-Betriebsart

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Hi Zimble,

    danke erstmal für deine Hilfe!

    Wie schon gesagt, bin in C Newbie

    Was ich über PWM gelesen hab ist,

    brauche eine Periodendauer von ca. 20 ms
    (durch dein Code komme ich drauf), in dieser Zeit kommt dann ein Signal mit der länge:

    1ms für links Drehung
    oder
    1,5ms für Mittelstellung
    oder
    2ms für rechts Drehung

    Diese Signal schicke ich dann auf ein Pin wo mein Servo angeschlossen ist.
    Kann ich jeden Pin dafür benutzten oder?

    Wie inkrementierst/dekrementierst OCR?

    Danke

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    PWM-Ausgänge sind OC1A und OC1B.
    Increment / decrement geht OCR1A++; oder OCR1A--; du musst dann einen min. / max. Wert vorgeben damit das Servo auch stehen bleibt. Du kannst auch gleich den Endwert eingeben.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Kann ich PWM nicht über Software programieren?
    Denn ich will 2 Servos steuern und auch noch 2 Getriebemotoren über L293D. Und dafür brauche ich ja 4 PWM oder nicht?

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Ja, kannst du, ich würde dann die Servos über Timer1 machen und die Motoren über die SW-PWM.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Über Timer1, ist dass das Beispiel von Zimble mit OC1A und OC1B?

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Ja, genau das ist es.

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    11.10.2007
    Beiträge
    77
    Ok,

    also könnte das alle so aussehen, wenn ich nur Taster1 betätige dreht sich der Servo nach rechts (2ms) auf eine bestimte Position und danach geht der Server wieder in die Mittelstellung???

    Code:
    #include <avr/io.h>
    
    // Timer1 initialisieren
    
    void timer1_init(void)
    {
     TCCR1A |= (1<<WGM11)|(1<<COM1A1)|(1<<COM1A0); // initalize mega8 Timer1 with 9Bit, inverted, Prescaler 256 
     TCCR1B = (1<<CS12); // this gives us a signal with 21.76ms at 12MHz 
    
     OCR1A = 476; // pulse of 1.5ms 512- 1500*(F_CPU/256/1000000)/2 
                 // Hier wieder der PWM auf mittelstellung gebracht oder?
    }
    
    
    
     int main (void){ 
    
      DDRD  |= (1<<PD5);    /* Pin D5 als Ausgang für Servo */ 
        
    
    //*** Taster *** 
    
         DDRD  &= ~ (1<<PD2);          /* Pin D2 als Eingang */ 
         PORTD |= (1<<PD2);            /* Pull Up von PIN D2 aktivieren */ 
    
    
       while(1) 
       { 
         if (!( PIND & (1<<PIND2)))      /* mache was wenn PinD2 low ist */ 
          { 
        OCR1A =???;      /* Servo dreht sich mit 2ms */ 
           
          } 
         else { 
        OCR1A = 476;      /* Servo Mittelstellung*/ 
         
         } 
        
          
        } 
       return 0; 
    
       }
    Könnte der Code so aussehen ist das inkrementierst/dekrementierst ?
    Was für ein Wert schreibe ich in Zeile:
    OCR1A = ???; /* Servo dreht sich mit 2ms */

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    11.09.2007
    Ort
    Leipzig
    Alter
    43
    Beiträge
    31
    PIN PD5 als Ausgang fürs Servo sollte falsch sein.
    Schau noch mal ins Datenblatt von deinem mega8. Die Ausgänge der Hardware-PWM sollten PB1-3 sein. In deinem Fall mit OCR1A also PB1.

    Ansonsten sollte der Code soweit eigentlich funktionieren.
    Bei mir hat der Servo einen max. Ausschlag bei 720us und bei 2520us.
    Wenn du das umrechnest (s. erster codeschnippsel von mir)
    kommst du auf OCR1A=495 bis 452.

    Ich würde testweise noch ein delay einbauen, sonst dürfte er zu schnell runterzählen.
    Code:
    while(1){
       if (!( PIND & (1<<PIND2)))      /* mache was wenn PinD2 low ist */
       {
          if(OCR1A > 452){
            OCR1A--;      /* Pulsbreite verkürzen */
          } 
       } else {
          OCR1A = 476;
       }
       for(i=0;i<50;i++)
          _delay_ms(10);
    }
    Sollte also so lange der Taster gedrückt ist aller 500ms die Pulsbreite reduzieren und so den Servo bis max in eine Richtung drehen und beim loslassen wieder resetten.

    Zum testen sollte es reichen. Evtl. noch Taster entprellen.

Seite 1 von 9 123 ... LetzteLetzte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad