RC servo AVR - mætning på motor ..

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

 
Den kode, du giver ser fint bortset fra at køre den på et ur mere end 7.281MHz kan give uforudsigelige resultater.

 
Citat:

Den kode, du giver ser fint bortset fra at køre den på et ur mere end 7.281MHz kan give uforudsigelige resultater.
 
du bliver nødt til at ændre linjen

TCCR1B = (1 <<CS10);

at gøre timeren kører på / 8

generelt er det

TCCR1B = (1 <<CS11);og forandring# define US2TIMER1 (us) ((us) * (uint16_t) (F_CPU / 1E6))

til# define US2TIMER1 (us) ((us) * (uint16_t) (F_CPU / 8e6))

 

Welcome to EDABoard.com

Sponsor

Back
Top