Ich habe meine Ansteuerung per PWM gebaut weil dann muß im rest des programms nicht so auf passen und Cycle zählen.
Ich habe den Code zusammen Kopiert das geben ich zu aber er funktioniert.
Code:
void init_servos(void)
{
/* Use Timers 1 generate the pulses for 2 R/C servos; each
* timer can do up to 2 servos. */
/*
* configure OC1A for mode 0: normal, top=0xffff prescale=8 (f~=30):
*
* WGM33=0, WGM23=0, WGM13=0, WGM03=0, CS32=0, CS31=1, CS30=0
*/
SETBIT(DDRD,PD5); //auf ausgang
SETBIT(DDRD,PD4);
TCCR1A &= ~(BV(WGM11) | BV(WGM10) | BV(COM1A1) | BV(COM1B1));
TCCR1A |= BV(COM1A0) | BV(COM1B0);
TCCR1B &= ~(BV(WGM13) | BV(WGM12) | BV(CS12) | BV(CS10));
TCCR1B |= BV(CS11);
TCNT1 = 0;
TIMSK |= BV(TOIE1);
/* set all Servos to their center positions */
SERVO1 = SERVO_MID;
SERVO2 = SERVO_MID;
}
Init Timer als PWM mit Mega16 bei 16 Megaherz
Code:
void servo1(BYTE s1)
{
if(s1== 0)
{
SERVO1 = 1300;
SendMCData(52,0);
}
if(s1== 1)
{
SERVO1 =2250;
SendMCData(52,1);
}
if(s1== 2)
{
SERVO1 = 3000;
SendMCData(52,2);
}
if(s1== 3)
{
SERVO1 = 3750;
SendMCData(52,3);
}
if(s1== 4)
{
SERVO1 = 4700;
SendMCData(52,4);
}
}
void servo2(BYTE s1)
{
if(s1== 0)
{
SERVO2 = 1300;
SendMCData(53,0);
}
if(s1== 1)
{
SERVO2 =2250;
SendMCData(53,1);
}
if(s1== 2)
{
SERVO2 = 3000;
SendMCData(53,2);
}
if(s1== 3)
{
SERVO2 = 3750;
SendMCData(53,3);
}
if(s1== 4)
{
SERVO2 = 4700;
SendMCData(53,4);
}
}
Setzen der Werte für das servo
Code:
// PWM Timmer
SIGNAL(SIG_OVERFLOW1)
{
TCNT1 = 0;
/* configure to set outputs on compare match so we can turn on the
* pulse in the next statement */
TCCR1A |= BV(COM1A1)|BV(COM1A0)|BV(COM1B1)|BV(COM1B0);
/* force compare match to set outputs */
TCCR1A |= BV(FOC1A)|BV(FOC1B);
/* configure to clear outputs on compare match so that the output
* compare function ends the pulse */
TCCR1A &= ~(BV(COM1A0)|BV(COM1B0));
}
Code:
#define SETBIT(ADDRESS,BIT)(ADDRESS |=(1<<BIT))
#define CLEARBIT(ADDRESS,BIT)(ADDRESS &= ~(1<<BIT));
#define SERVO_MIN 1300
#define SERVO_MID 3000
#define SERVO_MAX 4700
#define SERVO1 OCR1A
#define SERVO2 OCR1B
Das sind ein teil der define's von mir ich finde das mach den Code
lesbarer. Bitte alle "echten" c programmierer/in mich jetzt nicht er schlagen
Ich programmier normaler weise c++ unter windows mit VC++
Wenn der Timer überläuft hole ich mir die Neuen werte.
Noch mal zur klar stellung das ist nicht alle mein code sondern er ist aus verschieden quelle zusammen kopiert.
Es sei alle gedank die Teile des Quellcodes ver offentlichen.
Ich betreibe mit diesem Code Zwei Modelbau Motortreiber.
Mfg
Lesezeichen