Página 1 de 1

Dúvida sobre servomotor.

MensagemEnviado: 20 Jul 2009 15:41
por diogomurrer
Olá, pessoal! Sou novo no fórum, não sei se já tem um tópico para este assunto, se já existe me desculpem por postar por aqui. Mas vamos lá.

Eu sou novo em pic, tenho um projeto e preciso do controle do servo, estou usando um servo Motorsat (creio ser um servo de antena), sei que o servo tem pulso mínimo de 1ms e máximo de 2ms, então só pra testar, fiz esse código:

Código: Selecionar todos
#include <16f84A.h>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay(clock=4000000)

main ()
{

   while (TRUE)
   {
      
      
      output_high(pin_b1); //Pulso
      delay_ms(1);         //de
      output_low(pin_b1);  //1 ms
      delay_ms(100);       //Uma pausa de 100 ms só pra eu ver o que acontece
      
      output_high(pin_b1); //Pulso
      delay_ms(1.5);         //de
      output_low(pin_b1);  //1.5 ms
      delay_ms(100);       //Uma pausa de 100 ms só pra eu ver o que acontece
      
      output_high(pin_b1); //Pulso
      delay_ms(2);         //de
      output_low(pin_b1);  //2 ms
      delay_ms(100);       //Uma pausa de 100 ms só pra eu ver o que acontece
      
      
   }

}


Então, no proteus eu fiz uma simulação, e ele só pára em 90º:

Imagem

Então, o que eu estou fazendo de errado? O código que tá errado? Tá faltando alguma coisa? Ou só no proteus que acontece isso e na realidade dá certo? ^^

Alguém pode me ajudar?
Grato!

MensagemEnviado: 20 Jul 2009 16:36
por fabim
Primo, servomotor trabalha com tempo de 20mS
ou seja uma resolução de frequencia minima de 50hz.
Sendo
1mS = 180°
1.5ms = 90°
2mS = 0°.

Mais observe, se a frequencia entre amostragens é de 20mS, como pode você dar um delay de 100mS ?

ou seja, Ttotal maximo = 20mS - Ton de controle.

Faz assim ó.


#include <16f84A.h>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay(clock=4000000)

main ()
{
short tempo
while (TRUE)
{

for(tempo=0; tempo == 100; tempo++){//0°
output_high(pin_b1); //Pulso
delay_ms(1); //de
output_low(pin_b1); //1 ms
delay_ms(10);
}

for(tempo=0; tempo == 170; tempo++){//45°
output_high(pin_b1); //Pulso
delay_ms(1); //de
delay_us(250);
output_low(pin_b1); //1 ms
delay_ms(10);
}


for(tempo=0; tempo == 100; tempo++){//90°
output_high(pin_b1); //Pulso
delay_ms(1.5); //de
output_low(pin_b1); //1.5 ms
delay_ms(10);
}

for(tempo=0; tempo == 110; tempo++){//135°
output_high(pin_b1); //Pulso
delay_ms(1); //de
delay_us(750);
output_low(pin_b1); //1 ms
delay_ms(10);
}


for(tempo=0; tempo == 100; tempo++){//180°
output_high(pin_b1); //Pulso
delay_ms(2); //de
output_low(pin_b1); //2 ms
delay_ms(10);
}


}

}

ispeguimenta, depois c diz o resultado.

Abraços

fabim

MensagemEnviado: 23 Jul 2009 10:28
por diogomurrer
fabim, eu copiei e colei esse código que me enviou, mas ele contiuou indo até 90º e ficando parado. ¬¬

MensagemEnviado: 23 Jul 2009 11:07
por fabim
Sei mais você configurou o setup dele, para minimo angulo de 0.00 e máximo de 180.00 ?
Ou deixou por default ?
-90.0 e +90.0 ?

...