Página 1 de 1
Ler Frequencia no Pic

Enviado:
18 Jun 2007 03:40
por geraldomelo
Pessoal , peguei um projeto aqui , onde o pessoal vai usar um transmissor e o receptor de aeromodelo para controlar a posição dos motores ( servos , mas são motores bem mais fortes adaptados) ,e é ai que eu entro , tenho que fazer a controladora que recebe o sinal do receptor , e posiciona o motor ( com redução) e realimentação de um potenciometro de 5K .
Bom ,ai que vem , como eu faço para ler o sinal que vem do receptor ? esse sianl consiste em um trem de pulsos de 50 hz e oque varia é o seu duty variando entre 900 us e 2100 us .. Então eu tenho que ler apenas a parte alta do pulso , e saber qual a duração dessa parte alta (ativa) entre 900us e 2100 .... Como eu faço isso hein pessoal ...
obs : vou usar o pic12F675 , de preferencia com o oscilador interno , não gostaria de usar cristal ... não tenho muito espaço
Abraços
Geraldo .

Enviado:
18 Jun 2007 08:27
por guest2003
Se precisar de precisão não vai dar pra ir de interno não... (2%)
Deixa o timer 0 contando e faz polling na porta... ou liga numa Int... ai pega o valor do timer...
Se for apenas 1 motor, liga na Int... seta pra int na borda de subida... subiu, pega o valor do timer... sera pra borda de descida... e assim vai...
Existem diversas formas de fazer, mas depende muito da disponibilidade do seu micro, ou seja, se ele vai estar fazendo muitas outras coisas, qual a precisao da medida vc quer, etc etc etc...
Pode escolher um micro que tem Gate no timer 0... (este pino habilita a contagem de tempo do timer... ai ja sai a leitura direto)
[]'s

Enviado:
18 Jun 2007 16:19
por geraldomelo
Ola Guest , é apenas 1 motor sim .. A precisão de 2% acho que é toleravel , mas para melhorar , posso colocar um cristal , mas precisava achar cristal de 20mhz , mas bem pequenos , pois não tenho muito espaço .. O pic não vai fazer muita coisa não , ele vai ler essa borda alta , e vai ler também a posição do eixxo do potenciometro ( AD) , e ai ele posiciona o motor na posição correspondente ao tamanho do pulso lido ( pulso esse que tem uma frequencia de 50 hz) ... basicamente é isso .. 1000 us , a posição é a do inicio do potenciometro (AD= 0 ou perto disso) , assim vai , até a leitura for 2000us .. ai posiciona o motor e potenciometro para o final do curso (AD=1024 ou perto disso )
é basicamente isso que o micro vai fazer ... na verdade nao é muito complicado não ..é que aqui na minha cabeça ainda tá meio "nublado" heheheh
Vou acionar o motor com dois fets , e o pic como já disse , é o 12f675 ...
qqr luz já me ajuda ...
abraços
Geraldo

Enviado:
18 Jun 2007 16:43
por fabim
neste caso quanto maior a frequencia do cristal maior a margem de erro,
Ja fiz algo parecido mas fis assim.
usando o TIMER1.
uso a interrupção na borda de subida do GP2 ou na pior das ipoteses qualquer pino utilizando o onpio reset.
quando acontecer a interrupção.
zera timer1
e fica observando se ainda é hum. quando zero le o timer1 e pronto.. com 4 mhz.. da pra contar 16ms com uma precisão boa.
fabim

Enviado:
18 Jun 2007 18:14
por geraldomelo
Fabim , não entendi muito bem isso :
" com 4 mhz.. da pra contar 16ms com uma precisão boa."
quando o meu sinal sobe , ele dura de 900us até 2100us , é isso que eu tenho que contar , não é ms ..
"qqr outro pino usando onpio" tbm não entendi ... vou lá para o datasheet do pic ... heheh
abraços
Geraldo

Enviado:
18 Jun 2007 20:07
por Orcino
Geraldo no PICBASIC tem uma função PULSIN que faz exatamente o que vc quer, dê uma olhada.
Orcino

Enviado:
19 Jun 2007 07:59
por fabim
o timer 1 conta até 65535 sem zerar.
O clock do cristal é de 4MHZ
1 / 4 000 000 = t1/f * 65535 = 0,01638375 S.
O on pio, é uma interrupção que os 12F tem.. Ele tem para todos os pinos, basicamente funciona como o RB4..7 16F628.
Ele memoriza o ultimo estado.
Mais pode usar tambem a interrupção na borda de subida do GP2.
abraços fabim

Enviado:
19 Jun 2007 08:01
por eliandrostz
Geraldo, use a interrupção por mudança de estado, que acontece em ambas as bordas, tanto na de subida quanto na de descida. Então quando acontecer a borda de subida, na rotina de interrupção vc liga o timer1 para iniciar a contagem, que contara um pulso a cada 250ns se vc utilizar cristal de 4Mhz, quando acontecer a borda de descida na interrupção vc lê o timer1 e zera para proxima borda de subida. teoricamente o timer vai variar de 3600 pulsos para 900us a 8400pulsos para 2100us. Bom 3600 será sua referencia de zero, sempre subtraia esse valor do valor lido pelo timer1 na interrupção. exemplo:
100% = 8400-3600 = 4800 // 4800/4.6875 = 1024(duty da saida)
50% = 6000-3600 = 2400 // 2400/4.6875 = 512
0% = 3600-3600 = 0 // 0/4.6875 = 0
Eliandro

Enviado:
22 Jun 2007 04:25
por geraldomelo
Pessoal , vou ver se entendi ...
Fabim , acho que agora entende , vc quis dizer que com o clock interno de 4MHZ , ai vai para 1mhz (Fosc/4) . então o timer1 é incrementado a cada 1us , e se o timer1 conta até 65535 então fica 0,000001s x 65535 = 0,065535s ..
isso que eu não estou entendendo , de onde vem o 0,01638375 S. ?
Agora , Eliandro , também não entendi de onde vem esse divisor de 4.6875 ??.. outra coisa , o timer no caso do Osc a 4mhz , vai incrementar em 1us , e acho que não a 250ns , pois o timer incrementa na taxa de Fosc/4 ... acabei de ver no datasheet
por favor , me corrijam se eu estiver errado , estou ficando doido já ... hehehe ..
abraços
Geraldo .

Enviado:
22 Jun 2007 07:37
por eliandrostz
Desculpe Geraldo, vc tem razão, tanto eu quanto o fabim cometemos o mesmo erro, não dividimos a Fosc por quatro, mas a idéia continua a mesma, só divida todos o valores que passei por 4. Esse divisor que vc perguntou se obtém dividindo o range (máx - min) por 1024. Agora vai ficar assim:
min = 900 pulsos para 900 us
max = 2100 pulsos para 2100 us
divisor = (2100-900)/1024 = 1.1718