Autor Tópico: PWM - Mikroc  (Lida 6614 vezes)

Description:

0 Membros e 1 Visitante estão vendo este tópico.

Offline CADAVEZ

  • Novato
  • *
  • Posts: 4
  • Sexo: Masculino
  • GUIA-CNC
PWM - Mikroc
« Online: 21 de Abril de 2011, 18:07 »
Boa tarde pessoal,

estou tentando controlar alguns servos utilizando a biblioteca de PWM do Mikroc, contudo, não estou conseguindo fazer com o servo saia da posição -90 para qualquer outra determinada, ele fica sempre travado em -90.

Você poderiam ajudar? Não sei se foi algum erro no Proteus ou no Mikroc, mas já tentei alterar de várias formas o Duty na função Pwm_Change_Duty e não tenho nada diferente dos -90.

Consegui quebrar um galho enviando um pulo pelas portas B, mas acho que isso não é o ideal né? O melhor seria conseguir controlar utilizando as funções de PWM mesmo. Criei um código o mais simples possível, só para tentar mesmo dominar a biblioteca de PWM.

Componentes: PIC18F452 20Mhz e Servo Futaba S3003.

void main() {

  Pwm_Init(5000);
  Pwm_Start();

  while (1) {

  Pwm_Change_Duty(173);
 
  }
}


[img]"C:\Users\WindowsMAC\Desktop\test\Capturar.jpg"[img]

Obrigado pela ajuda!!

Offline Blackmore

  • CNCMASTER
  • ******
  • Posts: 1568
  • Sexo: Masculino
  • Profissão: Projetista Mecânico/Automação
Re:PWM - Mikroc
« Resposta #1 Online: 21 de Abril de 2011, 20:49 »
servo futaba .. imagino que sejam aqueles servos utilizados em aeromodelismo.
é muito simples controlar eles ... basta que:

1 - a freq do pwm seja 50Hz
2 - o pulso seja de 1 a 2 ms, isso determina a posição dele;

não necessariamente é necessário um pwm, basta que vc consiga fazer um pino alternar seu estado dentro do descrito acima, fazer isso com interrupção não é difícil e com um pic simples vc pode controlar vários servos ...

Offline CADAVEZ

  • Novato
  • *
  • Posts: 4
  • Sexo: Masculino
  • GUIA-CNC
Re:PWM - Mikroc
« Resposta #2 Online: 21 de Abril de 2011, 21:23 »
Obrigado pela resposta. Isso mesmo, um servo Futaba de modelismo.

Eu consegui controlar eles através do envio de um sinal alto e delay de acordo com o que você falou, pareceu funcionar corretamente. Você sabe se existe algum problema em fazer esse tipo de controle?

Fiquei na dúvida como controlaria a velocidade do servo desta forma? No caso eu não usei nada da biblioteca PWM, fiz só o controle do envio de pulsos, como colocaria na freq de 50 Hz?

portb.f0=1;
delay_us(1500);
portb.f0=0;


Fui fazendo o código acima de acordo com a minha necessidade (alterando o delay), mas não fiz nada para a frequência.


Obrigado.

Offline Blackmore

  • CNCMASTER
  • ******
  • Posts: 1568
  • Sexo: Masculino
  • Profissão: Projetista Mecânico/Automação
Re:PWM - Mikroc
« Resposta #3 Online: 22 de Abril de 2011, 01:36 »
tem uns dois anos que não faço nada com servos. .. mas é simples.
é lógico que utilizar um pwm é mais simples ... mas não é necessário, pois o servo move-se de acordo com a largura do sinal que recebe ... se não me engano vc pode variar de 1 a 2 ms ...
procure sobre interrupção ... é algo muito importante em programação de microcontroladores, e no seu caso, procure interrupção de timer (timer0, timer1 ...)
Para dar uma luz ... é assim ... a frequencia em que os servos padrão futaba trabalham é de 50Hz, e os pulsos de 1 a 2 ms (confirme não estou certo disto), vc precisa fazer o que? subtrair esses 1 ou 2 ms dos 20ms da frequencia de acionamento.
para converter a frequencia em segundos basta vc dividir 1 pela frequencia em Hertz... exemplo ... quanto é em segundos 50Hz ... seg = 1 / 50 .. é igual a 0,02s ou 20ms ... se fosse 100Hz ... seg = 1 / 100 .. é igual a 0,01s ou 10ms ...
agora para vc acionar facil ... dos 20ms-1ms ... vc mantém durante 19ms o pino em valor baixo e 1ms em valor algo ... ou mantem 18ms o pino em valor baixo e 2 em valor alto ... viu que a soma do valor alto e baixo dah 20ms? pois eh ... a frequencia está em 50Hz ... e os pulsos variando de 1 a 2 ms ... facinho neh?
pronto .. leia .. releia ... entenda ... esta é uma forma muito simples para vc entender como é que aciona o servo ... ok?
abrax!

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:PWM - Mikroc
« Resposta #4 Online: 22 de Abril de 2011, 06:03 »
Se usar a função PWM do PIC não precisa programar toda essa temporização.

Offline CADAVEZ

  • Novato
  • *
  • Posts: 4
  • Sexo: Masculino
  • GUIA-CNC
Re:PWM - Mikroc
« Resposta #5 Online: 22 de Abril de 2011, 10:53 »
Obrigado pelas rápidas respostas!!!

Blackmore,
entendi o que você falou vou alterar agora a frequência, realmente não tinha contemplado essa parte!!!!


Minilathe,
até tentei usar a parte de PWM, mas estou com aquele problema que não consigo alterar a posição do servo, ele trava em -90 independente do valor da função PWM_Change_Set.


Obrigado pessoal, o fóruma está me dando um bom aprendizado!!

Abraços.

Offline FB

  • "... Potência não é nada sem controle!"
  • Novato
  • *
  • Posts: 15
  • Sexo: Masculino
Re:PWM - Mikroc
« Resposta #6 Online: 16 de Maio de 2011, 20:29 »
Tive o mesmo problema com servo de modelismo e pwm no mikroC.
Observe que a frequencia que inicia o módulo é 5000 ou seja 5Khz. Esse é o problema. Se usar um cristal de baixo valor tipo 32khz, consegue valores interessantes ao controle de servos. Apesar do desempenho do microcontrolador dominuir para outras coisas.
A calculadora online abaixo lhe ajudará com os registradores:
http://209.85.12.237/30003/69/0/p1040425/pwm.html
Ao contrário da medida acima, o comentário do Blackmore é outra solução possível para o caso. Implemente por software usando interrupções pelo timer.
Outra calculadora online que gera códigos para o mikroC:
http://eng-serve.com/pic/pic_timer.html
Os códigos são para pic18, mas basta uma pequena olhada no datasheet para saber como fica o nome dos registradores para pic 16 e 12. O compilador sublinha em vermelho os que estiverem incorretos.
Ex:
  PIC18:
  INTCON.TMR0IE = 1;   // Habilita interrupção por estouro do timer0
  INTCON.TMR0IF = 0;   // limpa a flag de interrupção pelo timer0

  PIC16:
  INTCON.T0IE = 1;       // Habilita interrupção por estouro do timer0
  INTCON.T0IF = 0;       // limpa a flag de interrupção pelo timer0

Abç.

 

/** * */