S
ScOe
Guest
Hej,
Jeg har fundet en lib til styring RC servomotorer, men jeg får nogle underlige spørgsmål, mens du bruger det ..servomotor roterer fint, men engang det få "fast" mellem impulser eller sådan noget.Det opfører sig som det får i stå.
Her er det lib ..
Kode:
# ifndef GUARD_SERVO_H
# define GUARD_SERVO_H
//------------------------------------------------ -------------------
/ / # include "globaldefs.h"
//------------------------------------------------ -------------------
# ifndef SERVO_INIT
# define SERVO_INIT# define SERVO_PORT PORTB
# define SERVO_DDR DDRB
# define N_SERVOS 2
# define SERVO_FRAME 18.000
# define SERVO_TIME_DIV (SERVO_FRAME / N_SERVOS)# define US2TIMER1 (us) ((us) * (uint16_t) (F_CPU / 1E6))
/ / Servo gange (dette er Futaba timing).
# define SERVO_MIN 1000 / / ls
# define SERVO_MAX 2000 / / ls
# define SERVO_MID (SERVO_MIN SERVO_MAX) / 2
# define TRUE 1
# advarsel "No globale defs"
const statisk uint8_t servoOutMask [N_SERVOS] = (
0b00000001, / / PX0
0b00000010, / / PX1
);# endif
//------------------------------------------------ -------------------flygtige uint16_t servoTime [N_SERVOS];
void servoSet (uint8_t servo, uint16_t tid / * ls * /);
void servoTest (void);
void ServoInit (void);//------------------------------------------------ -------------------
void ServoInit (void)
(
int i;
for (i = 0; i <N_SERVOS; i ) (
servoTime = US2TIMER1 (SERVO_MID);
)
SERVO_DDR | = _BV (PIN0);
SERVO_DDR | = _BV (PIN1);/ / Setupt en første sammenligne kamp
OCR1A = TCNT1 US2TIMER1 (100);
/ / Start timer 1 med ingen Prescaler
TCCR1B = (1 <<CS10);
/ / Aktiver afbryder
TIMSK | = (1 <<OCIE1A)
//------------------------------------------------ -------------------
void servoSet (uint8_t servo, uint16_t tid / * ls * /)
(
uint16_t flåter = US2TIMER1 (tid);
CLI ();
servoTime [servo] = flåter;
sei ();
)
//------------------------------------------------ -------------------
void servoTest (void)
(
uint16_t tid;
uint8_t w;
/ / Test opdateringen af servo-0
til (tid = SERVO_MIN; tid <= SERVO_MAX; tid = 50) (
servoSet (0, tid);
servoSet (1, tid);
for (w = 0; w <25; w ) (
_delay_ms (10);
)
)
)
//------------------------------------------------ -------------------
ISR (TIMER1_COMPA_vect)
(
statisk uint16_t nextStart;
statisk uint8_t servo;
statiske kort outputHigh = TRUE;
uint16_t currentTime = OCR1A;
uint8_t mask = servoOutMask [servo];if (outputHigh) (
SERVO_PORT | = mask;
/ / Set sluttidspunktet for servo puls
OCR1A = currentTime servoTime [servo];
nextStart = currentTime US2TIMER1 (SERVO_TIME_DIV);
) Else (
SERVO_PORT & = ~ mask;
if ( servo == N_SERVOS) (
servo = 0;
)
OCR1A = nextStart;
)
outputHigh =! outputHigh;
)
//------------------------------------------------ -------------------
# endif
Jeg har fundet en lib til styring RC servomotorer, men jeg får nogle underlige spørgsmål, mens du bruger det ..servomotor roterer fint, men engang det få "fast" mellem impulser eller sådan noget.Det opfører sig som det får i stå.
Her er det lib ..
Kode:
# ifndef GUARD_SERVO_H
# define GUARD_SERVO_H
//------------------------------------------------ -------------------
/ / # include "globaldefs.h"
//------------------------------------------------ -------------------
# ifndef SERVO_INIT
# define SERVO_INIT# define SERVO_PORT PORTB
# define SERVO_DDR DDRB
# define N_SERVOS 2
# define SERVO_FRAME 18.000
# define SERVO_TIME_DIV (SERVO_FRAME / N_SERVOS)# define US2TIMER1 (us) ((us) * (uint16_t) (F_CPU / 1E6))
/ / Servo gange (dette er Futaba timing).
# define SERVO_MIN 1000 / / ls
# define SERVO_MAX 2000 / / ls
# define SERVO_MID (SERVO_MIN SERVO_MAX) / 2
# define TRUE 1
# advarsel "No globale defs"
const statisk uint8_t servoOutMask [N_SERVOS] = (
0b00000001, / / PX0
0b00000010, / / PX1
);# endif
//------------------------------------------------ -------------------flygtige uint16_t servoTime [N_SERVOS];
void servoSet (uint8_t servo, uint16_t tid / * ls * /);
void servoTest (void);
void ServoInit (void);//------------------------------------------------ -------------------
void ServoInit (void)
(
int i;
for (i = 0; i <N_SERVOS; i ) (
servoTime = US2TIMER1 (SERVO_MID);
)
SERVO_DDR | = _BV (PIN0);
SERVO_DDR | = _BV (PIN1);/ / Setupt en første sammenligne kamp
OCR1A = TCNT1 US2TIMER1 (100);
/ / Start timer 1 med ingen Prescaler
TCCR1B = (1 <<CS10);
/ / Aktiver afbryder
TIMSK | = (1 <<OCIE1A)
//------------------------------------------------ -------------------
void servoSet (uint8_t servo, uint16_t tid / * ls * /)
(
uint16_t flåter = US2TIMER1 (tid);
CLI ();
servoTime [servo] = flåter;
sei ();
)
//------------------------------------------------ -------------------
void servoTest (void)
(
uint16_t tid;
uint8_t w;
/ / Test opdateringen af servo-0
til (tid = SERVO_MIN; tid <= SERVO_MAX; tid = 50) (
servoSet (0, tid);
servoSet (1, tid);
for (w = 0; w <25; w ) (
_delay_ms (10);
)
)
)
//------------------------------------------------ -------------------
ISR (TIMER1_COMPA_vect)
(
statisk uint16_t nextStart;
statisk uint8_t servo;
statiske kort outputHigh = TRUE;
uint16_t currentTime = OCR1A;
uint8_t mask = servoOutMask [servo];if (outputHigh) (
SERVO_PORT | = mask;
/ / Set sluttidspunktet for servo puls
OCR1A = currentTime servoTime [servo];
nextStart = currentTime US2TIMER1 (SERVO_TIME_DIV);
) Else (
SERVO_PORT & = ~ mask;
if ( servo == N_SERVOS) (
servo = 0;
)
OCR1A = nextStart;
)
outputHigh =! outputHigh;
)
//------------------------------------------------ -------------------
# endif