RC servo AVR - nasycení na motor ..

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

 
Kód můžete poskytnout vypadá v pořádku, s výjimkou, že běží to na hodiny více než 7.281MHz mohou přinést neočekávané výsledky.

 
Citace:

Kód můžete poskytnout vypadá v pořádku, s výjimkou, že běží to na hodiny více než 7.281MHz mohou přinést neočekávané výsledky.
 
Budete muset změnit řádek

TCCR1B = (1 <<CS10);

aby časovač běží / 8

Obecně je

TCCR1B = (1 <<CS11);a změna# Define US2TIMER1 (nás) ((nám) * (uint16_t) (F_CPU / 1E6))

na# Define US2TIMER1 (nás) ((nám) * (uint16_t) (F_CPU / 8E6))

 

Welcome to EDABoard.com

Sponsor

Back
Top