- LiFePO4 Speicher Test         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 29

Thema: bis zu 12 Servos gleichzeitig ansteuern

  1. #11
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Anzeige

    Powerstation Test
    Das Erweiterungmodul taktet doch mit 16MHz, oder? Dann muss in OCR1A 20 (oder 19?) anstelle der 9. Außerdem glaube ich nicht dass die Register vom Timer0 direkt auf den Timer1 übertragbar sind. Das hier passt sicher nicht:

    TIMSK = (1 << OCIE0); // Interrupt ein

    Hier wird der Timer0-Interrupt aktiviert. Im Zweifel kannst du das mal mit Timer0 testen. Dann müßte der Base-Code mit angepasstem OCR-Wert funktionieren. Ein bisschen must du schon selbst im Datenblatt forschen...
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.10.2007
    Ort
    Solingen
    Alter
    31
    Beiträge
    177
    Hi, ich hatte jetzt erst wieder zeit etwas für die Beine zu machen und habe diese Fragen:

    1. Was ist OCR?

    2. Was ist der unterschied zwischen Timer0/1?

    3. Was ist OCR1A/B?

    4. Was machen die Zeilen eigendlich, ich habe sie nur kopiert:
    TCCR1A = (0 << WGM00) | (1 << WGM01);
    TCCR1A |= (0 << COM00) | (0 << COM01);
    TCCR1A |= (0 << CS02) | (1 << CS01) | (1 << CS01) | (0 << CS00);
    TIMSK = (1 << OCIE0);
    OCR1A = 20;


    5. Wo kriege ich das Datenblatt her, nicht die Anleitung



  3. #13
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    5. Wo kriege ich das Datenblatt her, nicht die Anleitung
    Auf der RP6-CDROM:
    "ATMEGA32.PDF" im Verzeichnis "Documentation\Datasheets"

    In dem Datenblatt werden auch deine Fragen 1..4 beantwortet.

    Gruß Dirk

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.10.2007
    Ort
    Solingen
    Alter
    31
    Beiträge
    177
    OOh, mist ich komme damit einfach nicht zurecht ich habe jetzt diese Einstellungen:

    TCCR1A = (0 << WGM10) | (1 << WGM11); // CTC-Mode
    TCCR1A |= (0 << COM1A0) | (0 << COM1A1); // ohne OCR-Pin
    TCCR1A |= (0 << CS02) | (1 << CS01) | (0 << CS00); // prescaler /8
    TIMSK = (1 << OCIE1A); // Interrupt ein
    OCR1A = 19; // 100kHz?




    DDRC |= IO_PC6; // SERVO_OUT -> OUTPUT
    PORTC &= ~IO_PC6; // SERVO_OUT -> LOW
    DDRC |= IO_PC2; // SERVO_OUT -> OUTPUT
    PORTC &= ~IO_PC2; // SERVO_OUT -> LOW
    DDRC |= IO_PC3; // SERVO_OUT -> OUTPUT
    PORTC &= ~IO_PC3; // SERVO_OUT -> LOW
    DDRC |= IO_PC5; // SERVO_OUT -> OUTPUT
    PORTC &= ~IO_PC5; // SERVO_OUT -> LOW
    DDRC |= IO_PC7; // SERVO_OUT -> OUTPUT
    PORTC &= ~IO_PC7; // SERVO_OUT -> LOW
    DDRD |= IO_PD6; // SERVO_OUT -> OUTPUT
    PORTD &= ~IO_PD6; //

  5. #15
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    Bei eine 10µS timer wird die ISR jeden 10µS bearbeitet ! Das sind gerade 80 takten bei RP6base (8 MHz). Wen da al die 12 Servo's gesteurt wirden, kan es knap wirden (12 * eine IF Abfrage in ISR). Die komplette ISR muss fetig sein innerhalb diese 80 Schritten. Da gibt nicht mehr fiel Zeit ubrig für al das andere zu machen. In Notfall kan man naturlich auch diese Timer nach 20µS oder 40µS aenderen. Einiges Nachteil ist das die Auflosung von Servopos grober wird. Ich programmiere die Servo's in die forhandene 100µS ISR. functioniert auch, naturlich sind dan nur ca 14 Pos moglich pro servo (von 0.8 mS bis 2.2 mS)

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.10.2007
    Ort
    Solingen
    Alter
    31
    Beiträge
    177
    hi RP6conrad,

    aber die M32 hat 16MHz dann sind das 160 Takte, hast du vllt auch ein bspl. Code für mich, wäre sehr nett, mit diesen ganzen einstellungen:

    TCCR1A = (0 << WGM10) | (1 << WGM11); // CTC-Mode
    TCCR1A |= (0 << COM1A0) | (0 << COM1A1); // ohne OCR-Pin
    TCCR1A |= (0 << CS02) | (1 << CS01) | (0 << CS00); // prescaler /8
    TIMSK = (1 << OCIE1A); // Interrupt ein
    OCR1A = 19; // 100kHz?

    komme ich nicht zurecht, ich weiß nicht mal ob die so für den M32 richtig sind, ich habe mir auch das Datenblatt angeschaut, da bin ich auf die Namen gestoßen, aber anwenden kann ich die nicht. Ich weiß noch nicht mal wofür die gut sind, wofür brauch ich die Einstellungen eigentlich.

    Sorry für die nervenden Fragen.

    DIV blenderkid

  7. #17
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    Meine Lösung für die Servos in M32 mit die forhandene 100 µS timer : 2 Servos wirden gesteurt ueber port C5 und portC7. Minpos servo = werte 8, maxpos servo = werte 22. Das ergibt dan eine puls von 0.8 bis 2.2 mS.
    Wan servo-timer 200 erreicht (=20 mS), wird er auf 0 gesetzt, und wirden beide ports hoch gesetzt. Die ports wirden zuruck auf 0 gesetzt abhangig von die eingestellte werte "servo1" und "servo2"
    In die config.h mus naturlich noch die port C5 und C7 als ausgang declariert werden !
    Code:
    volatile stopwatches_t stopwatches;
    volatile uint8_t delay_timer;
    volatile uint8_t ms_timer;
    volatile uint8_t servo_timer;
    volatile uint16_t sound_timer;
    
    
    
    /**
     * Timer 0 Compare ISR - This timer is used for various
     * timing stuff: The delay timer for blocking delays, 
     * "Stopwatches" for non-blocking delays and the timing of
     * the sound generation with timer2...
     *
     * By default, it runs at 10kHz which means this ISR is called
     * every ~100µs! This is nice for timing stuff!
     */
    ISR (TIMER0_COMP_vect)
    {
    	// Blocking delay (100µs):
    	delay_timer++;
    	servo_timer++;
    	if (servo_timer>200) {servo_timer=0;PORTC |= IO_PC5;PORTC |= IO_PC7;}
    	if (servo_timer>servo2) PORTC &= ~IO_PC5;
    	if (servo_timer>servo1) PORTC &= ~IO_PC7;
    	
    	// All 1ms based timing stuff
    	if(ms_timer++ >= 10) { // 10 * 100µs = 1ms

  8. #18
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.10.2007
    Ort
    Solingen
    Alter
    31
    Beiträge
    177
    oops, ich glaube du hast einen Teil deines Codes vergessen zu schicken

    Weißt du auch wie man den Timer schneller bekommt?

    Schon mal danke

  9. #19
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.04.2008
    Beiträge
    384
    Die code ist nicht gans komplett : da ist auch noch eine function für die pulslange von servo in die variabele servo1 / servo2 zu schreiben.
    Die timer frequenz kannst du aendern in die "controllib.c". Mit die bits CS0, CS1 und CS2 wird die prescaler eingestellt. Standard ist die auf 8 eingestellt, zahler geht hoch bis 199. Das ergibt dan 16 MegaHz/8 = 2 MegaHz. Nach 200 tics wird er auf 0 gestellt = 10 kHz. Sie konnen diesen wert verringern : OCR0 = 20 gibt schon eine 100 kHz frequenz!
    Die prescaler kan auch auf 1 gesetzt werden (CS0,CS1 und CS2 alle auf 0), dan wird bei OCR0 = 200 die frequenz 8* hoher = 80kHz.
    Code:
    // 10kHz Timer 0:
    	TCCR0 =   (0 << WGM00) 
    			| (1 << WGM01) 
    			| (0 << COM00) 
    			| (0 << COM01) 
    			| (0 << CS02)  
    			| (1 << CS01) 
    			| (0 << CS00);
    	OCR0  = 199;
    Naturlich wir die timer 0 auch für aendere functionen genutzt !! Die laufen dan alle schneller auch naturlich.

  10. #20
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.10.2007
    Ort
    Solingen
    Alter
    31
    Beiträge
    177
    könnte man dann auch diesen Timer benutzen:

    cli();

    TCCR1A = (0 << COM1A1)
    | (0 << COM1A0)
    | (0 << COM1B1)
    | (0 << COM1B0)
    | (0 << FOC1A)
    | (0 << FOC1B)
    | (0 << WGM11)
    | (0 << WGM10);
    TCCR1B = (0 << ICNC1)
    | (0 << ICES1)
    | (0 << WGM13)
    | (1 << WGM12)
    | (0 << CS12)
    | (1 << CS11)
    | (0 << CS10);
    OCR1A = 15; // 125kHz (8us)

    TIMSK |= (1 << OCIE1A);
    sei();

    oder so ähnlich?

    DIV blenderkid

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

12V Akku bauen