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

Thema: Servo macht was er will :(

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    31.08.2005
    Beiträge
    41

    Servo macht was er will :(

    Anzeige

    Powerstation Test
    Hallo Leute,
    ich habe einen standart-servo von conrad an einen mega8 (8mhz) angeschlossen. Zur ansteuerung benutze ich den code aus RN-Wissen.
    Ich will erreichen, dass jedes mal, wenn ich den taster drücke die position geändert wird. wenn der servo an der einen seite angekommen ist wird die position jedes mal in die andere richtung geändert. allerdings funktioniert das programm nicht:

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <inttypes.h>
    #include <util/delay.h>
    
    #define SERVOPIN 7
    #define SERVOPORT PORTD
    #define DDRSERVO DDRD
    #define BUTTON !(PIND & (1 << PD2 ))
    
    
    volatile unsigned char servopos;
    
    void servo_init()
    {
    	TIMSK|=(1<<OCIE2);
    	TCCR2 |= (1<<WGM21) | (1<<CS20);	//Prescale=1, CTC mode
    	OCR2 = 80;			//alle 10µS ein IRQ bei 8mhz
    	DDRSERVO|=(1<<SERVOPIN);
        sei();
    }
    
    ISR(TIMER2_COMP_vect)
    {
        static int count = 1;
    	if(count>servopos)SERVOPORT&=~(1<<SERVOPIN);
    	else SERVOPORT|=(1<<SERVOPIN);
    	if(count<2000+servopos){count++;}
    	else{count=0;}
    }
    
    int main(void)
    {
        DDRD &= ~(1<<PD2); //Taster
        DDRC |= (1<<PC5);  //LED
        PORTC &= ~(1<<PC5);//einschalten
        servo_init();
        int r = 5;
        servopos = 150;    //servo in mittelposition
        while(1)
        {
            if(BUTTON)
            {
                servopos = servopos + r;
                if( servopos > 200 )
                {
                    servopos = 200;
                    r = -1;
                }
                if( servopos < 100 )
                {
                    servopos = 100;
                    r = 1;
                }
                _delay_ms(50) //taster entprellen
            }
        }
        return 0;
    }
    ich weiß nicht, woran es liegt
    komischer weise flackert die LED zwischen drinn, darum vermute ich, dass irgendwie ein reset durchgeführt wird...

    danke schon mal für eure hilfe

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.03.2005
    Ort
    gerne in den Bergen
    Alter
    40
    Beiträge
    429
    Wie sieht denn die Spannungsversorgung der Schaltung aus? Hast du ein 100n Kerko am AVR? Wird das Servo von der gleichen Spannung versorgt wie der AVR???
    ...wer nicht findet hat nicht gesucht...

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

    Vermutlich sind die Stromspitzen beim Starten des Servos für die Resets verantwortlich. Ein Servo an einem Mega8 mit der Ansteuerung aus dem RN-Wissen ist auch hier das Thema:
    https://www.roboternetz.de/phpBB2/ze...ag.php?t=40164

    if(count<2000+servopos){count++;} scheint mir allerdings nicht richtig. So entsteht zwischen den Impulsen eine 20ms-Pause. Der Impuls soll aber alle 20ms wiederholt werden, d.h. alle 20ms ein Impulsanfang.

    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!

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    31.08.2005
    Beiträge
    41
    @rideyourstyle: da ist ein 100n Kerko am AVR. Wenn ich das Servo mit einer externen spannung versoge klappt es um einiges besser und die LED flackert nicht mehr

    @radbruch: das if(count<2000+servopos)count++; steht so im RN-Wissen. ich war da auch schon etwas skeptisch. es müsste dann doch eigentlich minus servopos heißen, also if(count<2000-servopos) oder?!

    mfg luz

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.03.2005
    Ort
    gerne in den Bergen
    Alter
    40
    Beiträge
    429
    Also ich habe die Erfahrung gemacht, dass man fast nie zuviel Kerkos und Elkos in einer Schaltung haben kann
    ...wer nicht findet hat nicht gesucht...

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Weder noch. if(count<2000) wäre richtig. Dann würde die ISR nach 20ms neu gestartet werden.
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    31.08.2005
    Beiträge
    41
    jo das hab ich jetzt auch gemerkt. klappt alles super. Danke für eure hilfe
    mfg

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad