- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 10

Thema: Ansteuerung mehrerer Servos mit M32

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    29.12.2010
    Beiträge
    55
    Das Display würde ich gern verwenden. Aber auf den Beeper kann ich verzichten. Kann ich somit auch oc2 verwenden? Funktioniert die Ansteuerung dann wie beim oc1a? Ich freue mich auf baldige Rückmeldung!

    Lieben Gruß und vielen Dank für eure Unterstützung

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    29.12.2010
    Beiträge
    55
    Ich werde dann wohl die PWM des Beeper verwenden. Ich habe die ServoLib die ich verwende auch mal dementsprechend umgeschrieben. Ich weiß allerdings nicht was ich bei TCCR2 hinschreiben muss. Zur Zeit ist es aus der Control Lib der M32 geklaut als der noch zum Beepen gedacht war.

    Hier ist der Code:
    Code:
    /* **************************************************************************** 
     *                           _______________________ 
     *                           \| RP6  ROBOT SYSTEM |/ 
     *                            \_-_-_-_-_-_-_-_-_-_/             >>> RP6 CONTROL 
     * ---------------------------------------------------------------------------- 
     * 
     * **************************************************************************** 
     */ 
      
    /*****************************************************************************/ 
    // Includes: 
    
    #include "RP6ControlServoLib.h" 
    
    /*****************************************************************************/
    
    
    
    //Servosteuerung
    
    // Variablen:
    
    
    uint16_t position_1=LEFT_TOUCH + MIDDLE_POSITION;
    uint16_t position_2=LEFT_TOUCH + MIDDLE_POSITION;
    
    
    
    /*****************************************************************************/
    // Funktionen:
    
    /**
     * Servoinitialisierung
     *
     * Call this once before using the servo function.
     * Timer 1 is configured to work in "Phase and Frequency
     * Correct PWM Mode".
     *
     */
    void initSERVO(void)
    {
        DDRD |= SERVO_1_OUT;                    // SERVO_OUT -> OUTPUT
        DDRD |= SERVO_2_OUT;                    // SERVO_OUT -> OUTPUT
    
        cli();
        // Timer 1:
        // Clear OC1A when up-counting and set OC1A when down-counting,
        // mode 8 (PWM, Phase and Frequency Correct, TOP ICR1), clk/8
        TCCR1A =  (1 << COM1A1) 
                | (0 << COM1A0) 
                | (0 << COM1B1) 
                | (0 << COM1B0) 
                | (0 << FOC1A) 
                | (0 << FOC1B) 
                | (0 << WGM11) 
                | (0 << WGM10);
        TCCR1B =  (0 << ICNC1) 
                | (0 << ICES1) 
                | (1 << WGM13) 
                | (0 << WGM12) 
                | (0 << CS12) 
                | (1 << CS11) 
                | (0 << CS10);
                
                
        
        TCCR2 =  (1 << WGM21) | (1 << COM20) | (1 << CS22) | (1 << CS21);    
    
        // Setze Servo Pulswiederholung auf 50 Hz
        ICR1  = 20000;        // 50Hz = clk / (2 * prescaler * ICR1)
        
        
        //SERVO_1
        // Setze Servostellung auf Mittelstellung (~1,5ms):
        OCR1A     = position_1;
        OCR2    = position_2;
    
        // Disable output compare A match interrupts:
        TIMSK &= ~(1 << OCIE1A);
    
        sei();
    }
    
    /**
     * SET SERVO
     *
     * Das ist die Servopositionierung
     * Der Servo wird mit 50 Hz beschaltet, somit amcht es keinen Sinn,
     * die Funkrion öfter aufzurufen.
     *
     * pos = 0               : Left touch
     * pos = MIDDLE_POSITION : Middle position
     * pos = RIGHT_TOUCH     : Right touch
     *
     * Bemerkung: Der Puls wird durch eine Hardware PWM generiert, so wird rechenzeit gespart!
     *
     */
     
    void setSERVO(uint16_t pos1,uint16_t pos2)
    {
    
        OCR1A     = pos1;
        OCR2    = pos2;
    }
    
    // Aufruf in aus PCConection
    void setServoPosition(uint16_t pos1,uint16_t pos2){
        position_1=pos1;
        position_2=pos2;
    
        
        if (position_1 > RIGHT_TOUCH+LEFT_TOUCH) 
        {
            position_1 = RIGHT_TOUCH+LEFT_TOUCH;
        }
        if (position_1 < LEFT_TOUCH)
        {
            position_1 = LEFT_TOUCH;
        }
        
        if (position_2 > RIGHT_TOUCH+LEFT_TOUCH) 
        {
            position_2 = RIGHT_TOUCH+LEFT_TOUCH;
        }
        if (position_2 < LEFT_TOUCH)
        {
            position_2 = LEFT_TOUCH;
        }
    }
    
    /**
     * SERVO TASK
     *
     * Hier wird die Position des Servos in der Variable pos gespeichert und 
     * danach von setServo eingestellt.
     *
     */
    void task_SERVO(void)
    {
        setSERVO(position_1,position_2);                // aktualisiere die Servo Position
    }
    // EOF
    Ich hoffe ihr wisst eine Antwort. Vielen Dank für eure Unterstützung!
    Lieben Gruß
    Ingo

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Vielleicht hilft dir das weiter, Stichwort ist Software-PWM:
    https://www.roboternetz.de/community...iche-Servo-ISR
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    29.12.2010
    Beiträge
    55
    Oh vielen dank
    Das ist ja nochmal eine ganz andere Art der Servo Ansteuerung. Führt diese Art der Ansteuerung nicht zu Blockierungen? Dann wäre es ja noch eine Möglichkeit, die Servos anzusteuern.
    Also empfiehlst du diese Art der Ansteuerung? Dann werde ich mich in den nächsten Tagen auch mal damit beschäftigen das auf die M32 anzuwenden.


    Wenn jemand noch weitere Tipps oder Vorschläge hat würde ich mich darüber sehr freuen!

    Lieben Gruß

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Ja, das kann ich empfehlen. Vor allem das zweite Programm mit seinen wenigen ISR-Aufrufen eignet sich gut. Dazu noch ein Beispiel mit 8 Servos an einem 8MHz-Mega8: https://www.roboternetz.de/community...-walking-asuro

    Die Timersetups und die OVL-ISR kannst du vom RP6 direkt aufs m32 übertragen; beide verwenden einen Mega32. Allerdings rennt dieser beim m32 mit 16MHz, deshalb muss man den Vorteiler (Prescaler) anpassen:

    TCCR2 = (0 << WGM21) | (0 << COM20) | (1 << CS22) | (1 << CS20); // Normal Mode, prescaler /128 für m32 mit 16MHz

    Gruß

    mic
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    29.12.2010
    Beiträge
    55
    Soo heute habe ich mal wieder weiter an meinem Roboter gearbeitet. Ich habe einen 1mF Elko eingebaut. Dieser verhindert einen Reset in den meisten Fällen. Lediglich wenn sich beide Servos zeitgleich über lange Strecken bewegen bricht die Spannung hin und wieder ein.

    Und ich verwende jetzt das Programm von Radbruch, das er in dem von ihm genannten Thread vorgestellt hat. Das funktionitert auch sehr gut. genau so wie ich es mir erhofft hatte.

    Vielen Dank für eure Mithilfe

    Lieben Gruß

    Ingo Hunfeld

Ähnliche Themen

  1. Stromversorgung und Steuerung mehrerer Servos über 2 Drähte
    Von stoerpeak im Forum Eigene fertige Schaltungen und Bauanleitungen
    Antworten: 8
    Letzter Beitrag: 05.09.2014, 07:30
  2. Antworten: 7
    Letzter Beitrag: 25.03.2009, 16:24
  3. problem mit ansteuern mehrerer Servos gleichzeitig.
    Von Jango1987 im Forum Assembler-Programmierung
    Antworten: 0
    Letzter Beitrag: 09.12.2008, 22:00
  4. Idee für Ansteuerung "mehrerer" 7-Seg.-Displays?
    Von Jaecko im Forum Elektronik
    Antworten: 14
    Letzter Beitrag: 29.01.2008, 11:49
  5. Antworten: 16
    Letzter Beitrag: 22.08.2007, 09:19

Berechtigungen

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

Solar Speicher und Akkus Tests