Hallo!!
Hier nun mein überarbeiteter Vorschlag-Code für eine Ansteuerung von 5 Servos:
Code:
#include <avr/io.h> /* Servoansteuerung AVR --- 8.4.2008 Pr0gm4n*/
//Defines:
#define SERVOMAX 180 //Anzahl der Schritte, die möglich sein sollen.
//alle defines hier kann man irgendwo in seinem Programm machen,
//doch sie sind nötig um Servos mit der Funktion task_Servos anzusteuern
//z.B. #define SERVOREGISTER DDRA
//#define SERVOREGISTER1
//#define SERVOREGISTER2
//#define SERVOREGISTER3
//#define SERVOREGISTER4
//#define SERVOREGISTER5
//z.B. #define SERVOPORT PORTA
//#define SERVOPORT1
//#define SERVOPORT2
//#define SERVOPORT3
//#define SERVOPORT4
//#define SERVOPORT5
//z.B. #define SERVOBIT 0
//#define SERVOBIT1
//#define SERVOBIT2
//#define SERVOBIT3
//#define SERVOBIT4
//#define SERVOBIT5
//Prototypen:
void task_Servos(uint Servo1, uint Servo2, uint Servo3, uint Servo4, uint Servo5);
void task_Grad(uint Servo1, uint Servo2, uint Servo3, uint Servo4, uint Servo5, uint Grad);
/*********************************************************************************************/
/****************** Prototypen ende, jetzt: Funktionen *************************************/
/*********************************************************************************************/
//Funktionen:
void task_Servos(uint Servo1, uint Servo2, uint Servo3, uint Servo4, uint Servo5)
{
SERVOREGISTER |=(1<<SERVOBIT1);
SERVOREGISTER |=(1<<SERVOBIT2);
SERVOREGISTER |=(1<<SERVOBIT3);
SERVOREGISTER |=(1<<SERVOBIT4);
SERVOREGISTER |=(1<<SERVOBIT5);
SERVOPORT1 |= (1<<SERVOBIT1);
SERVOPORT2 |= (1<<SERVOBIT2);
SERVOPORT3 |= (1<<SERVOBIT3);
SERVOPORT4 |= (1<<SERVOBIT4);
SERVOPORT5 |= (1<<SERVOBIT5);
<Delay> //hier genau 1 ms Sekunde Delay für ersten Anschlag
for(int i=0;i<(SERVOMAX+1);i++)
{
task_Grad(uint Servo1, uint Servo2, uint Servo3, uint Servo4, uint Servo5, i);
<Delay> //hier genau 1/180 ms Sekunde Delay und auch zwischen allen anderen
//auch sehr leicht auf mehr als 180 Schritte ausweitbar durch höhere Zahlen für Grad und und Servo1-5
}//for-Schleife schliessen (nur zur besseren Übersicht)
}
void task_Grad(uint Servo1, uint Servo2, uint Servo3, uint Servo4, uint Servo5, uint Grad)
{
if(Grad >(SERVOMAX-1)) Grad = SERVOMAX; //Grad und die Servowerte auf das Maximum beschränken
if(Grad <1) Grad=1; //Wenn man dies nicht macht kann es passieren, dass es
if(Servo1 >(SERVOMAX-1)) Servo1 = SERVOMAX; //keinen übereinstimmenden Wert für ServoX und Grad gibt
if(Servo1 <1) Servo1 = 1;
if(Servo2 >(SERVOMAX-1)) Servo2 = SERVOMAX;
if(Servo2 <1) Servo2 = 1;
if(Servo3 >(SERVOMAX-1)) Servo3 = SERVOMAX;
if(Servo3 <1) Servo3 = 1;
if(Servo4 >(SERVOMAX-1)) Servo4 = 180;
if(Servo4 <1) Servo4 = 1;
if(Servo5 >(SERVOMAX-1)) Servo5 = SERVOMAX;
if(Servo5 <1) Servo5 = 1;
if(Servo1==Grad)SERVOPORT1 &= ~(1<<SERVOBIT1); //Servo 1 Signal beenden
if(Servo2==Grad)SERVOPORT2 &= ~(1<<SERVOBIT2); //Servo 2 Signal beenden
if(Servo3==Grad)SERVOPORT3 &= ~(1<<SERVOBIT3); //Servo 3 Signal beenden
if(Servo4==Grad)SERVOPORT4 &= ~(1<<SERVOBIT4); //Servo 4 Signal beenden
if(Servo5==Grad)SERVOPORT5 &= ~(1<<SERVOBIT5); //Servo 5 Signal beenden
}
Im Moment versuche ich, der Funktion task_Servos noch einen Parameter servos_count hinzuzufügen. Dabei soll festgelegt werden, wie viele Servos angesteuert werden sollen.
bisherige Ideen:
Code:
if(servos_count=1) task_1_Servo(Parameter);
if((servos_count>1)&&(servos_count<6)) task_5_Servos(Parameter);
if((servos_count>5)&&(servos_count<11)) task_10_Servos(Parameter);
if(servos_count>10)task_max_Servos(Parameter);
Ich bin mir nicht sicher, ob es stört, dass man für Servo7-10 keinen Wert hat, andernfalls muss man sie als 0 definieren und dann mit den richtigen Werten überschreiben
eine weitere Möglichkeit wäre es, die Servo-Stellungen in einem Array zu übergeben und dann die Elemente von 0-(servos_count-1) abzufragen
diese Möglichkeit halte ich für sinnvoller
MfG Pr0gm4n
EDIT: An meinen Code muss noch ein Delay von 18ms angefügt werden, da man Servos nur alle 20 ms neu mit Signalen versorgt und maximale 2ms Signal nötig sind, um einen Servo auf Anschlag zu stellen
Lesezeichen