Página 1 de 1
[Resolvido] Dúvida sobre controle de servo

Enviado:
13 Jul 2010 09:31
por [Daniel]
Bom dia,
Colegas eu gostaria de saber uma coisa:
Qual é a melhor forma de controlar vários servos com o pic? Fazer o pwm no programa principal ou na interrupção, vou usar botões para fazer ajustes dos ângulos dos mesmos.
O clock esta bom em 4Mhz? não há necessidade de aumentar..correto?

Enviado:
13 Jul 2010 09:54
por Andre_Cruz
Daniel,
Acredito que a interupção seje a melhor opção, embora no loop principal funciona para servo motor.
A respeito da velocidade do clock 4MHz depende do tamanho do programa (tudo que ele precisa fazer) e da linguagem utilizada.
André Cruz

Enviado:
13 Jul 2010 10:11
por [Daniel]
Uhm, então ta certo obrigado André, vou fazer na interrupção mesmo, alguém tem dicas para configurar os registradores? no momento eu fiz com o TMR0.
Até o momento tive resultados com isso:
Configurei com presc. de 1:2 e TMR0 para estourar a cada 40us (intrc_osc_noclockout 4mhz / 16f628), sendo assim uma interrupção a cada de 80us, o periodo do pwm é 255 incrementos, assim tenho, aproximadamente um pwm de 20,400ms.
Consegui usar 2 chaves para aumentar e diminuir o ciclo pwm dentro do padrão suportado pelo servo.
Alguém tem uma sugestão melhor?
Mais uma pergunta, se eu usar um cristal de 8 ou 10Mhz, quanto fica o tempo de cada instrução? não consegui mais calcular isso apesar que sei que com 10mhz da 400ns e em 4mhz dá 250us. Já na config do tmr0 como fica?
Ele recebe o clock do cristal > divide por 4 > a quantos us ele dá um incremento no tmr0? to confuso ainda...

Enviado:
13 Jul 2010 10:24
por Andre_Cruz
Daniel,
Para calcular a frequência de estouro do timer0 é assim:
Ftmr0 = 1/ ((256-TMR0)*(1/(Fosc/4))*prescaler)
Ftmr0 é a frequência de estouro do timer 0 em Hz
TMR0 é o valor carregado no registrador TMR0
Fosc é a frequência do oscilador
prescaler é o fator de divisão
Exemplo:
Ftmr0 = 1/((256-221)*(1/(20MHz/4))*16)
TMR0 = 221
Fosc = 20MHz
prescaler = 16
Ftmr0 = 8928,6 Hz
A frequência de clock dividida por quatro é para achar a frequência de trabalho interna do PIC.
André Cruz

Enviado:
13 Jul 2010 12:30
por [Daniel]
Sei la, vou tentar explicar do meu jeito:
Sinais de controle para o servo:
Meus "cálculos":
(OBS: inverti os valores para posição central do servo com as da posição de -90°)
Então, eu entendo assim nesse caso ,o tmr0 estoura a cada 80us. com clock de 4mhz.
Dessa forma eu tenho um registrador de periodo de 250partesx80us= periodo de 20ms, cada incremento/decremento no ciclo equilave a uma parte dessa ou seja por exemplo com 13x80us tenho um pulso de 1040us (1ms) no periodo constante de 20000us (20ms), assim meu servo fica na posição dos -90°. afirmativo?
Agora se eu colocar um cristal de 10mhz qual a velocidade que o tmr0 recebe os incrementos de clock? e se for 8 mhz?
sendo que 4mhz:4=1us então: 10mhz:4=2,5us???? não deveria ser um tempo menor? com 8mhz:4=2us???

Enviado:
13 Jul 2010 14:27
por Andre_Cruz
Daniel,
Com a interupção acontecendo a cada 80uS, o seu duty cycle varia de 80uS em 80uS, com um registrador de controle da pra fazer o PWM sim.
Seu raciocinio esta certo.
Tempo do ciclo de maquina = 1/(Fosc/4)
Fosc = Frequência do Cristal
Cristal de 4MHz
Tempo do ciclo de maquina = 1/(4.000.000/4)
Tempo do ciclo de maquina = 1/1.000.000
Tempo do ciclo de maquina = 0,000001 ou 1uS
Cristal de 8MHz
Tempo do ciclo de maquina = 1/(8.000.000/4)
Tempo do ciclo de maquina = 1/2.000.000
Tempo do ciclo de maquina = 0,0000005 ou 500nS
Cristal de 10MHz
Tempo do ciclo de maquina = 1/(10.000.000/4)
Tempo do ciclo de maquina = 1/2.500.000
Tempo do ciclo de maquina = 0,0000004 ou 400nS
André Cruz

Enviado:
13 Jul 2010 15:30
por [Daniel]
Pois é André,
Eu fiz várias vezes esses cálculos, mas já tinha esquecido o raciocínio (fórmula) muito obrigado, dessa vez eu não esqueço mais. Vou aproveitar para fixar:
Cristal de 2Mhz
Tempo do ciclo de maquina = 1/(2.000.000/4)
Tempo do ciclo de maquina = 1/500.000
Tempo do ciclo de maquina = 0,000002 ou 2uS
Cristal de 20Mhz
Tempo do ciclo de maquina = 1/(20.000.000/4)
Tempo do ciclo de maquina = 1/5.000.000
Tempo do ciclo de maquina = 0,0000002 ou 200nS
Obrigado!
Sobre o sinal de controle consegui algo satisfatório, só falta testar na prática.
Abraço
Tópico Resolvido!

Enviado:
13 Jul 2010 15:42
por Andre_Cruz
Legal !!
Se possivel poste o código para compartilhar com o pessoal do forum.
Abraço
André Cruz

Enviado:
16 Jul 2010 14:49
por [Daniel]
Então cara o código do pwm é simples:
Eu basicamente vejo se "=" se não, faço então a comparação "<" e uso o BSF pin ou BCF pin... Mais nada.
O resto tai em cima, uma interrupção a cada 80us dividido em 250 partes, ja testei na prática também e funfa.
Abraço