Ir ao conteúdo
  • Cadastre-se

PIC PIC 12f675 reagindo a 20Khz


Posts recomendados

Colegas, como seria um trecho do código c em que um PIC 12F675, ao perceber um sinal de onda quadrada de 20.000 Hz no seu pino 7 faz 1 led piscar (1Hz) só 1 vez no pino 6. Para o led piscar novamente teria que parar o sinal de 20Khz e tornar a ocorrer. A percepção do sinal tem que ser imediata, tipo, logo nos primeiros 100 ms.

 

Alguém sabe ?

Link para o comentário
Compartilhar em outros sites

@eletron1791 ,

 

Infelizmente não sei programar em C.

 

Mas se eu soubesse, faria algo deste tipo :

 

Primeiro, programe uma base de tempo com resolução suficiente para voce comparar o período de uma onda quadrada de 20 Khz. Depois, usaria o comparador  ( pino 6 ) para gerar uma interrupção quando a tensão fosse menor do que 2,5 volts ( use um divisor resistivo a partir dos 5V e alimente o pino 7 com ele ) , assim temos uma interrupção na descida da onda quadrada .

 

Após 2 interrupções consecutivas, calcule o tempo decorrido entre elas. Se for igual a 20 Khz ( com uma tolerância de acordo com o seu projeto ) , acione um flag e use um contador na sua base de tempo para poder acionar a saída do Led, deixando aceso por 500 milissegundos, e apagado nos próximos 500, e assim por diante. 

 

Quando passar um certo tempo sem ter as interrupções geradas, ou o tempo entre elas não corresponder ao período de uma onda quadrada de 20 Khz, desligue o flag, e apague o led.

 

Um bom exercício escolar, sem dúvida !

 

Paulo

  

Link para o comentário
Compartilhar em outros sites

Ah se eu soubesse fazer isso. Economizaria componentes. Tive que recorrer a um LM 567. É uma pena pois tô sofrendo com pouco espaço na plaquinha que vou fazer. E o LM 567 depende de capacitores, e tal. E é bem raro encontrar este C.I. na versão SMD. Mas, como eu disse, não sei programar. valeu Paulo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@eletron1791 ,

 

O LM567 tem um problema grande : ele tem largura de banda  variável conforme a amplitude do sinal, ou seja, se o sinal for de 19 Khz com alto nível ele pode achar que é 20 Khz ....

 

E também tem outro problema que pode te complicar, o tempo para deteção é função também da amplitude do sinal : quanto menor o nível, maior o tempo.

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

PAULO, realmente sofri aqui com o LM 567 exatamente com os problemas que você citou. Abandonei ele e usei um LM 331 e fiz um conversor frequência tensão. Frequência de 30 Khz. Tá funcionando bem. O PIC detecta um aumento de tensão no seu pino 7 e acende um led no pino 3. Mas meu problema continua sendo a falta de espaço, e este LM 331 também não encontra fácil na versão SMD.

 

IF, procurei no google, até encontrei códigos de frequencímetros, porém muito complexos para eu colar aqui e fazer funcionar.

 

Portanto, quem puder ajudar, ainda preciso de um trecho de um código que faça o PIC 12F675 manter o pino 3 em nível alto enquanto estiver entrando no pino 7 onda quadrada acima de 30 Khz (não precisa ser exato 30 Khz, basta ser qualquer valor igual ou maior).

 

 

OPS, são pinos pino 5 e 2. Recebe a frequência no pino 5 e mantém pino 2 em nível alto enquanto a frequência estiver presente

na linguagem c (ccs)

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
6 horas atrás, eletron1791 disse:

manter o pino 3 em nível alto enquanto estiver entrando no pino 7 onda quadrada acima de 30 Khz (não precisa ser exato 30 Khz, basta ser qualquer valor igual ou maior).

O que te impede de usar um simples filtro passa alta neste caso? Um lm358 pode dar conta...

https://www.newtoncbraga.com.br/index.php/artigos/54-dicas/824-10-filtros-passa-altas-art107.html

Para acender o led,um simples retificador...

 

Ah sim, como te disse provavelmente o google não vai te dar o código exato pro seu problema de bandeja. Interpretações e adaptações são necessárias.

Pena que não vou de ccs, se não poderia te vender/personalizar o código 🤑😪💸😁

6 horas atrás, eletron1791 disse:

ainda preciso de um trecho de um código

Dica pra quem for te ajudar

-deixe o timer1 rodar bobo com entrada no pino e prescaler 1:1

-crie uma interrupt de 10mS com timer0

-nela capture o valor do timer1 numa variável global freq. Se em 1 segundo ela vale 30000, em 0.1 vale 3000 e em 0.01 ... 300

-zere o timer1

-no loop do main

#define led GPIO0
if (freq>=300) led=1;else led=0;

Quero comissão 😉

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

10 horas atrás, eletron1791 disse:

Portanto, quem puder ajudar, ainda preciso de um trecho de um código que faça o PIC 12F675 manter o pino 3 em nível alto enquanto estiver entrando no pino 7 onda quadrada acima de 30 Khz (não precisa ser exato 30 Khz, basta ser qualquer valor igual ou maior).

 

Oras, se agora basta qualquer valor maior ou igual facilitou demais todo o processo !

 

Como disse a @.if , o processo dela é bem simples, e funcional.

 

Pode depositar a comissão dela pela ideia kkkkkk !

 

Paulo

  • Amei 1
Link para o comentário
Compartilhar em outros sites

Alguém pode ajudar corrigindo este código para que o PIC ao perceber frequência igual ou maior que 30 Khz no pino 5 (A2), o led no pino 3 (A4) acenda e fique aceso enquanto a condição for verdadeira ?

 

 

#include <12F675.h>
#device ADC=10
#use delay(internal=4MHz)
 
#include <main.h>
 
#define LED1 pin_A4
#define Entrada pin_A2
unsigned int TEMPO=0;
 
#INT_TIMER1
void estouro_timer1(){
   set_timer1(3000); // ajusta o estouro do TIMER1 para 500ms
   TEMPO++;
}
 
void controle_led1(){       
   if(input(Entrada));
   output_high(LED1);
   if(input(Entrada)) TEMPO=0; // reseta a contagem quando necessário
}
 
void main()
{
   set_timer1(0);
   enable_interrupts(GLOBAL);
   enable_interrupts(INT_TIMER1);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); //524 ms overflow
 
   while(TRUE)
   {
      controle_led1();
   }
}

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

@eletron1791 ,

 

Não entendo nada dessa linguagem, mas dá para perceber que você inicializou apenas o Timer1 como Timer mesmo .... falta um monte de código, você tem de inicializar de alguma maneira a contagem das transições, seja de subida ou seja de descida, usando interrupção também em algum pino, e acrescentar todo o código da contagem e de zerar a contagem quando o Timer1 estoura ....

 

Paulo

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!