PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo macht was er will :(



LuZ
19.05.2008, 22:59
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:


#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

rideyourstyle
20.05.2008, 06:40
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???

radbruch
20.05.2008, 11:08
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/zeigebeitrag.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

LuZ
20.05.2008, 16:16
@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 :D

@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

rideyourstyle
20.05.2008, 16:23
Also ich habe die Erfahrung gemacht, dass man fast nie zuviel Kerkos und Elkos in einer Schaltung haben kann ;-)

radbruch
20.05.2008, 19:25
Weder noch. if(count<2000) wäre richtig. Dann würde die ISR nach 20ms neu gestartet werden.

LuZ
20.05.2008, 21:04
jo das hab ich jetzt auch gemerkt. klappt alles super. Danke für eure hilfe
mfg