Hallo
Da die Servos blockierend angesteuert werden solltest du nur eine servotrim-Funktion verwenden. Dort erzeugst du dann nacheinander die jeweiligen Impulse und den gemeinsamen 20ms-Zyklus (mehrfach weil die Servos etwas Zeit benötigen um die neue Position anzufahren). Nur die Servoansteuerung getestet:
GrußCode:#include "RP6RobotBaseLib.h" // #define servopins adc // Ausgabe der Impulse an ADC0/1 uint16_t servopos = 20; uint16_t servopos2 = 20; void servotrim(void) { uint8_t i; for(i=0;i<5;i++) // Impuls mehrfach senden -> Servostellzeit { #ifdef servopins // ADC0/1-Version DDRA |= (1<<ADC0) | (1<<ADC1); PORTA |= 1; // Servo1 an ADC0 sleep(servopos); PORTA |= 2; // Servo2 an ADC1 sleep(servopos2); PORTA &= ~3; // Impulse fertig, start der Pause für 20ms-Zyklus sleep(200-servopos-servopos2); #else setLEDs(0b001000); // Servo1 an LED4 sleep(servopos); setLEDs(0b010000); // Servo2 an LED5? sleep(servopos2); setLEDs(0); // Impulse fertig, start der Pause für 20ms-Zyklus sleep(200-servopos-servopos2); #endif } //mSleep(50); // hier würde ich nicht noch zusätzlich warten } void servoposi(void) { if(servopos==8) { while(servopos != 20) { servopos++; servotrim(); mSleep(50); } } else if(servopos==20) { while(servopos != 8) { servopos--; servotrim(); mSleep(50); } } } //***********************SERVO2*******************************************************+ /* void servotrim2(void) { setLEDs(1); sleep(servopos2); setLEDs(0); sleep(200-servopos2); mSleep(50); } */ void servoposi2(void) { if(servopos==8) { while(servopos2 != 20) { servopos2++; servotrim(); mSleep(50); } } else if(servopos2==20) { while(servopos2 != 8) { servopos2--; servotrim(); mSleep(50); } } } int main (void) { initRobotBase(); powerON(); while (true) { task_RP6System(); servoposi(); servoposi2(); } return 0; }
mic







Zitieren

Lesezeichen