¿Controlar varios servos usando el microcontrolador pic18f?

0

Quiero que se controlen varios servos a través del microcontrolador pic18f4550.

Sé que para un solo servo puedo usar el siguiente código.

unsigned int angle=0,i;
void cs_delay(unsigned int);
void main()
{
   TRISB.F0=0;
   while(1) 
   {
      for(angle=0;angle<=180;angle+=45) // Loop to increase the angle by 45°
      {
         for(i=0;i<50;i++) // Loop to provide continuous train of pulse
         {
             LATB.F0=1; // Send high to control signal terninal
             cs_delay(angle); // Call delay function
             LATB.F0=0; // Send low to control signal terninal
             Delay_ms(18);
         }
      }
   }
}

void cs_delay(unsigned int count)
{
   int j=0;
   Delay_us(550); // Delay to move the servo at 0°
   for(j=0;j<count;j++) // Repeat the loop equal to as much as angle
   {
      Delay_us(6); // Delay to displace servo by 1°
   }
}

Pero no puedo entender cómo se puede usar para varios servos ...

BTW, usando MikroC v8.2 para la programación.

¿Alguna ayuda?

    
pregunta Suraj Bhawal

2 respuestas

4

No es fácil.

Verá, ha escrito allí lo que se conoce como código bloqueando . El PIC no puede hacer nada más mientras procesa la señal PWM del software porque está usando retrasos .

En su lugar, debe alejarse de todo ese concepto y, en cambio, a cosas basadas en el tiempo, no en esperar.

Por ejemplo, cuando te levantas por la mañana, permaneces despierto toda la noche mirando el reloj hasta que es hora de levantarte, o ajustas la alarma a las 7:30 y luego vas a dormir, hasta que el reloj te despierta?

La mayoría de los PIC lo hacen aún más fácil, al permitirle vincular un temporizador a un módulo de salida , que generará su forma de onda PWM únicamente en hardware. Cuantos más módulos y temporizadores de salida tenga, más servos podrá manejar con ellos.

Incluso sin usar compare output , hay maneras de usar un temporizador para activar una alarma la próxima vez que una salida deba cambiar de estado. Depende de usted encontrar la mejor manera de decidir cuándo es eso y cambiar el tiempo del temporizador en consecuencia.

    
respondido por el Majenko
0

Si desea utilizar demoras y controlar los servos, puede ver mi código, que se escribe usando mplab.

     PORTD=0b00000001;        //servo0 
     Delay10TCYx(pul0);

     PORTD=0b00000110;  //servo 1,2
     Delay10TCYx(pul1);

     PORTD=0b00001000;  //servo 3
     Delay10TCYx(pul3);

     PORTD=0b00100000;  //servo 4
     Delay10TCYx(pul4);

     PORTD=0b00000000;  //pulse down
     Delay1KTCYx(15);

Tengo 5 servos conectados a portD y los servos 1 y 2 funcionan en el mismo pulso.

Ok, aquí está cómo funciona, el ancho del ciclo de pulso completo del servo es de 20 ms, pero el servo tiene una tolerancia de + o - 2 ms.

de 20 ms, el pulso positivo es solo 2 ms y el resto 18 ms es cero. He conectado en cascada todas las señales positivas a los servos, el resto del tiempo todos los pines se ponen a cero.

Mi imagen tenía un cristal de 4MHz y el siguiente código trabajó para controlar el barrido de 90 grados del servo.

    
respondido por el Harikrishna t

Lea otras preguntas en las etiquetas