S
ScOe
Guest
Ahoj,
Jsem našel jeden Knihovna pro ovládání RC servo motory, ale i získat některé podivné otázky při používání ..servo motor se otáčí v pořádku, ale někdy to dostat "přilepená" mezi impulsy nebo tak něco.To se chovají, jako by si zastavil.
Zde je lib ..
Kód:
# 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 18000
# Define SERVO_TIME_DIV (SERVO_FRAME / N_SERVOS)# Define US2TIMER1 (nás) ((nám) * (uint16_t) (F_CPU / 1E6))
/ / Servo časy (to je Futaba načasování).
# Define SERVO_MIN 1000 / / ls
# Define SERVO_MAX 2000 / / ls
# Define SERVO_MID (SERVO_MIN SERVO_MAX) / 2
# Define TRUE 1
# Varování "Ne globální defs"
const statické uint8_t servoOutMask [N_SERVOS] = (
0b00000001, / / PX0
0b00000010, / / PX1
);# Endif
//------------------------------------------------ -------------------těkavé uint16_t servoTime [N_SERVOS];
neplatné servoSet (uint8_t servo, uint16_t čas / * ls * /);
neplatné servoTest (void);
neplatné ServoInit (void);//------------------------------------------------ -------------------
neplatné ServoInit (void)
(
int i;
pro (i = 0; i <N_SERVOS; i ) (
servoTime = US2TIMER1 (SERVO_MID);
)
SERVO_DDR | = _BV (PIN0);
SERVO_DDR | = _BV (PIN1);/ / Setupt první porovnat zápas
OCR1A = TCNT1 US2TIMER1 (100);
/ / Start časovač 1, č. prescaler
TCCR1B = (1 <<CS10);
/ / Povolit přerušení
TIMSK | = (1 <<OCIE1A)
//------------------------------------------------ -------------------
neplatné servoSet (uint8_t servo, uint16_t čas / * ls * /)
(
uint16_t klíšťata = US2TIMER1 (čas);
CLI ();
servoTime [servo] = klíšťata;
SEI ();
)
//------------------------------------------------ -------------------
neplatné servoTest (void)
(
uint16_t čas;
uint8_t w;
/ / Test aktualizace servo 0
pro (time = SERVO_MIN; čas <= SERVO_MAX; čas = 50) (
servoSet (0, čas);
servoSet (1, čas);
pro (w = 0, w <25; w ) (
_delay_ms (10);
)
)
)
//------------------------------------------------ -------------------
ISR (TIMER1_COMPA_vect)
(
statické uint16_t nextStart;
statické uint8_t servo;
statická krátké outputHigh = TRUE;
uint16_t currentTime = OCR1A;
uint8_t mask = servoOutMask [servo];if (outputHigh) (
SERVO_PORT | = masku;
/ / Nastavení čas konce servo puls
OCR1A = currentTime servoTime [servo];
nextStart = currentTime US2TIMER1 (SERVO_TIME_DIV);
Else ()
SERVO_PORT & = ~ masku;
pokud ( servo == N_SERVOS) (
servo = 0;
)
OCR1A = nextStart;
)
outputHigh =! outputHigh;
)
//------------------------------------------------ -------------------
# Endif
Jsem našel jeden Knihovna pro ovládání RC servo motory, ale i získat některé podivné otázky při používání ..servo motor se otáčí v pořádku, ale někdy to dostat "přilepená" mezi impulsy nebo tak něco.To se chovají, jako by si zastavil.
Zde je lib ..
Kód:
# 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 18000
# Define SERVO_TIME_DIV (SERVO_FRAME / N_SERVOS)# Define US2TIMER1 (nás) ((nám) * (uint16_t) (F_CPU / 1E6))
/ / Servo časy (to je Futaba načasování).
# Define SERVO_MIN 1000 / / ls
# Define SERVO_MAX 2000 / / ls
# Define SERVO_MID (SERVO_MIN SERVO_MAX) / 2
# Define TRUE 1
# Varování "Ne globální defs"
const statické uint8_t servoOutMask [N_SERVOS] = (
0b00000001, / / PX0
0b00000010, / / PX1
);# Endif
//------------------------------------------------ -------------------těkavé uint16_t servoTime [N_SERVOS];
neplatné servoSet (uint8_t servo, uint16_t čas / * ls * /);
neplatné servoTest (void);
neplatné ServoInit (void);//------------------------------------------------ -------------------
neplatné ServoInit (void)
(
int i;
pro (i = 0; i <N_SERVOS; i ) (
servoTime = US2TIMER1 (SERVO_MID);
)
SERVO_DDR | = _BV (PIN0);
SERVO_DDR | = _BV (PIN1);/ / Setupt první porovnat zápas
OCR1A = TCNT1 US2TIMER1 (100);
/ / Start časovač 1, č. prescaler
TCCR1B = (1 <<CS10);
/ / Povolit přerušení
TIMSK | = (1 <<OCIE1A)
//------------------------------------------------ -------------------
neplatné servoSet (uint8_t servo, uint16_t čas / * ls * /)
(
uint16_t klíšťata = US2TIMER1 (čas);
CLI ();
servoTime [servo] = klíšťata;
SEI ();
)
//------------------------------------------------ -------------------
neplatné servoTest (void)
(
uint16_t čas;
uint8_t w;
/ / Test aktualizace servo 0
pro (time = SERVO_MIN; čas <= SERVO_MAX; čas = 50) (
servoSet (0, čas);
servoSet (1, čas);
pro (w = 0, w <25; w ) (
_delay_ms (10);
)
)
)
//------------------------------------------------ -------------------
ISR (TIMER1_COMPA_vect)
(
statické uint16_t nextStart;
statické uint8_t servo;
statická krátké outputHigh = TRUE;
uint16_t currentTime = OCR1A;
uint8_t mask = servoOutMask [servo];if (outputHigh) (
SERVO_PORT | = masku;
/ / Nastavení čas konce servo puls
OCR1A = currentTime servoTime [servo];
nextStart = currentTime US2TIMER1 (SERVO_TIME_DIV);
Else ()
SERVO_PORT & = ~ masku;
pokud ( servo == N_SERVOS) (
servo = 0;
)
OCR1A = nextStart;
)
outputHigh =! outputHigh;
)
//------------------------------------------------ -------------------
# Endif