¿Cómo controlar varios servomotores usando dos temporizadores?

0

¿Cómo puedo controlar varios servomotores utilizando 2 temporizadores en un ATmega16? He buscado "servo bit banging" pero ninguna publicación coherente lo explica completamente. Encontré un código pero no lo entiendo completamente.

    #include<avr/io.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include "util.h"
    #include "std_typed.h"

    volatile u8 X, lowCount, highCount, arrCount = 0;
    u8 array[180]={0};

void main( void)
{
    DDRD = 0xff;
    PORTD = 0b11111111;
    //DDRA = 0xff;
    // Set no prescaler for both t- and t2
    TCCR0 = (0<<CS02) |(0<<CS01) | (1<<CS00) ;
    TCCR2 = (0<<CS22) |(0<<CS21) | (1<<CS20) ;

    // for the first time only let the interrupts start
    TCNT0 = 0xd4;
    TCNT2 = 0xf4;

    SET_BIT(TIMSK, TOIE0);
    SET_BIT(TIMSK, TOIE2);

    // Enable Global Interrrupt
    sei();

    while(1)
    {

    }
}

ISR( TIMER2_OVF_vect)
{
    TCNT2 = 0xd4;

    if(highCount<45)
    {
        X = 0xff;
        highCount++;
    }
    else if( arrCount<180)
    {
        X = array[arrCount];
        arrCount++;
    }
    else if(lowCount< 1591)
    {
        X = 0;
        lowCount++;
    }
    else
    {
        X, lowCount, highCount, arrCount = 0;
    }
    //PORTA ^=0b10000000;

}

ISR( TIMER0_OVF_vect)
{
    TCNT0 = 0xd4;
    PORTD = X;
    //PORTA ^=0b00000001;
}

Cualquier enlace o explicación sería genial.

    
pregunta Aelgawad

1 respuesta

1

El alto tiempo utilizado para comandar un servomotor de tipo pasatiempo es de 500 a 1.500. El periodo es de 20mS.

Digamos que tiene 3 servos conectados a salidas digitales que llamaré S1, S2, S3. Desea que el servo a tiempo sea 0.8ms 1.2ms, 1.0mS.

El código tendrá que hacer lo siguiente: 0) Al comienzo de cada período de 20 ms: 1) Active la señal S1 alta y espere 0,8 ms. (Utilizando un temporizador, o reposo, retardo etc.) 2) 0.8ms ha transcurrido, niega S1 y afirma S2. Espera 1.2mS. 3) Negar S2, afirmar S3 - Espere 1 ms. 4) Negar S3. Espera el resto de los 20mS. (17mS)

Si hay otros ISR que operan en la máquina, entonces las esperas podrían no ser precisas y se producirán algunos temblores.

Una mejor manera de implementar esto es en un ISR donde, al ingresar, se realiza la afirmación / negación de la señal, y el temporizador está configurado para generar el siguiente ISR después del tiempo deseado.

La mejor forma (cero jitter), si tiene el soporte de hardware es utilizar comparaciones de salida. Asumiendo que los OC tienen un alto o menor modo de comparación, entonces:

1) Programe los 3 OC comparando los valores con la duración deseada de cada PWM. 2) Configura el temporizador para envolver cada 20 ms. 3) Habilite los OC e inicie el temporizador.
4) Cuando TCNT es < el valor de comparación de OC la salida de cada PWM será alta, y automáticamente bajará cuando TCNT == la comparación de OC.

    
respondido por el brainfog

Lea otras preguntas en las etiquetas