Ir ao conteúdo

Posts recomendados

Postado

Olá, pessoal.

Eu preciso que o pic12F675 execute em um pino a frequência de 500Hz constantemente para ser aplicada a um  diodo infra vermelho e ser captado por outro pino do mesmo pic?

O objetivo é fazer um secador automático de mão com apenas 01 pic. O que seria preciso é que um dos pinos pudesse trabalhar independente das outras instruções, ou seja, neste caso oscilar permanentemente.

Obrigado,

Postado

Porque o pic12f675?

Você poderia uma interrupção por timer do pic,para gerar pwm por software,ou utilizar outro pic com pwm interno.

No caso de interrupção por timer ele iria parar tarefa atual,pular para interrupção,depois de termina a rotina na interrupçã,voltava a tarefa.

A solução ideal para que você apresentou seria um pic com pwm,se querer utilizar ainda este pic12f675 procure por interrupção do timer(para mim seria bem simples,mais não sei qual seu nivel de conhecimento nesta area).

Postado

Olá, O PWM pelo que estudei - não sei se compreendi direito - mas durante a execução do PWM em um pino, neste mesmo momento não consigo ler outro pino que está conectado no foto-transistor.

O que eu preciso é um sistema com 01 pic apenas que transmita e leia um sinal, o objetivo é um detector de proximidade com infravermelho.

 

Abaixo retirei do manual do Picbasic. Parece que não acontece em ciclo separado, ou seja, ele não acontece no mesmo tempo que a leitura em outro pino. É preciso que quando estiver gerando um sinal em um pino , ao mesmo tempo um outro pino esteja lendo, que é o mesmo que um secador de mãos faz, o sinal de IV é refletido pelas mãos e aciona a ventilação.

 

PWM

Produz um trem de pulsos em modulação por largura de pulso em Pino. Cada ciclo de
PWM consiste de 256 passos. O Duty cycle p/ cada ciclo PWM
vai de 0 (0%) a 255 (100%). Este ciclo PWM é repetido Ciclo
vezes. Pino pode ser uma constante, 0 - 15, ou uma variável que contenha
um número 0 - 15 (ex. B0) ou um nome de pino (ex. PORTA.0).
O tempo do Ciclo do PWM é dependente da freqüência do oscilador. Se um
oscilador de 4Mhz é usado, cada Ciclo duraria cerca de 5ms. Se um
oscilador de 20Mhz é usado, cada Ciclo teria cerca de 1ms de comprimento.
Definir um valor OSC não tem nenhum efeito em PWM. O tempo de Ciclo
sempre muda c/ a velocidade atual do oscilador.
Pino é fixado como saída logo antes da geração dos pulsos e reverte p/ entrada após parar a geração.

A saída PWM num pino se parece tanto
com sujeira, e não uma linda série de ondas quadradas. Algum tipo de
filtro é necessário p/ tornar o sinal em algo útil. Um circuito RC
pode ser usado como um simples conversor D/A:

Postado

@Jair Massagem Koetz ,

 

Faz muito tempo que não uso um Pic... sei que nos Avrs eu consigo fazer com que o hardware gere uma onda quadrada de determinadas frequências, sem precisar de nada, sem nenhuma interrupção envolvida.

 

Não tem nada com o PWM, e sim com o módulo CTC.

 

Quem sabe tenha algo semelhante nos Pics  ...

 

Paulo

Postado

1 - Use o TIMER0 para gerar uma interrupção a cada 2ms (isso dá 500Hz).

A fórmula para gerar o período é:

T = Tck . Prescaler . (256 - TMR0).

TMR0 = 256 - [T / (Tck . Prescaler)], onde:

T = 2ms

Tck = Foscilador / 4

Prescaler é um fator de divisão. Pode ser desde zero até 256, em fatores de 2.

Ex.:

Seja um cristal de 4MHz, então, escolhendo-se o fator de divisão do prescaler em 8, tem-se:

TMR0 = 256 - [2ms / (1us . 8))] = 256 - [2.000 / 8] = 6

Atualizando o valor de TMR0 em 6, a cada interrupção, você chega a 500 interrupções por segundo, ou de 2ms em 2ms.

Mas se você "deixar rolar o TIMER0", sem atualizar a cada interrupção, o seu período vai valer, no exemplo:

T = Tck . Prescaler . (256 - TMR0) = 1us . 8 . (256 - T0) = 2,048ms, ou 488,3Hz.

Nesta condição nem precisa atualizar o valor do TIMER0. Vão ser necessárias menos tarefas a serem executadas dentro da interrupção.

2 - Use o CAD com 8 bits, para conhecer o valor a ser medido da energia infravermelha (IV). Aí será necessário um circuito que forneça zero volts sem IV e 5V (caso a fonte de alimentação seja de 5V) com IV máximo. Esta deve ser uma função LINEAR.

3 - Quanto mais IV, maior será o valor do CAD e quanto menos IV, menor será o valor do CAD. 

4 - Para conhecer o valor correto de Ton, você deve comparar um valor desejado de IV com o valor medido de IV. (Vdesejado - Vmedido, ou Vd - Vm). O valor desejado Vd é o valor de IV (ou de calor), que você deseja e o valor medido Vm é o que o CAD mediu.

Repare que quanto mais próximo de zero for essa diferença, menor vai ser o erro entre Vd e Vm, ou mais o valor medido se aproxima do valor desejado, o que queremos.

 

 

1 - Estabeleça um valor de calor (Vd)

2 - A cada interrupção desligue a saída. Este instante corresponde ao início de Toff.

3 - Dentro da interrupção, calcule Vm com o CAD.

4 - Ache a diferença entre Vd e Vm.

5 - Se a diferença for POSITIVA, significa que Vd é maior que Vm, ou que o calor desejado é maior que o medido. Então aumente Ton.

Se a diferença for NEGATIVA, significa que Vd é menor que Vm, ou que o calor desejado é menor que o medido. Então diminua Ton.

6 - Diminuir Ton é aumentar Toff e vice-versa. Use o TIMER1 para gerar o Toff. Quando a interrupção do TIMER1 ocorrer, simplesmente ligue a carga.

Então você usa o TIMER0 para gerar o período T do PWM e para desligar a carga.

Você usa o TIMER1 para ligar a carga, ou iniciar o período Ton.

O ciclo se repete entre os dois TIMERs.

MOR_AL

  • Membro VIP
Postado

focando apenas nisto...

 

4 horas atrás, Jair Massagem Koetz disse:

O que seria preciso é que um dos pinos pudesse trabalhar independente das outras instruções, ou seja, neste caso oscilar permanentemente.

 

o ideal realmente é um mc que tenha canal pwm. Este oscila sozinho independente do sw. Mas se insistes neste mc que não tem tal recurso, uma alternativa que vislumbro agora é usar seu comparador pra fazer um oscilador

 

12f675-comparator-modes.png

 

Imagine o circuito da esquerda-em baixo como um oscilador de relaxação...

1541.JPG

Pronto...Taí seu sinal produzido em 2º plano pelo mc e sem usar a "cabeça" dele.

 

 

 

 

 

 

Agora, se não fores medir distância, apenas sentir presença, sugiro o uso de um circuito como o tsop38xxx. Simplérrimo, ele apenas "sente a presença" de uma luz IR de 38Khz e tem todos os filtros "anti bichos-papões" da eletronica pra você nãp perder muito tempo. P.ex., seu mc envia pulsos de 38khz e espera sua reflelxão (pino OUT do tsop). bem simples.  Apenas hás de considerar os aspectos construtivos do teu sistema.

Postado

Colega tenta isso.

 

#include <12F675.h>
#device ADC=8

#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOMCLR                   //Master Clear pin used for I/O

 

#use delay(internal=4000000)

 

 

int1 flag20RTCC = 1;       //indica se já completaram 20 RTCC
int1 flagPULSO_ALTO = 0;  //indica se o pulso esta em nível alto
int contRTCC = 0;         //contador de RTCC


#INT_TIMER0
void  TIMER0_isr(void) 
{
  contRTCC++;
  
   if(contRTCC==7)
   {
     set_TIMER0(102);
   }

   
   if(contRTCC==8) 
   {
      flag20RTCC=1;
      contRTCC=0;
   }
}

#INT_TIMER2
void  TIMER2_isr(void) 
{
    if(flag20RTCC==1)       // DISPARO DO PULSO NIVEL ALTO PWM
   {
      flag20RTCC=0;
      output_high(PIN_A4); //ESC
      flagPULSO_ALTO=1;
   }   
   
   
   if(flagPULSO_ALTO==1)      // CONTROLE DO PULSO NIVEL BAIXO PWM
   {
               
      if(contRTCC==4)
      {   
         flagPULSO_ALTO=0;
         output_low(PIN_A4);  
      }
      
   }
}

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_bit);
   setup_timer_2(T2_DIV_BY_16,4,1);
   setup_comparator(NC_NC);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(INT_TIMER2);
   enable_interrupts(GLOBAL);

   while(TRUE)
   {
      //TODO: User Code
   }

}

Postado
8 horas atrás, Jair Massagem Koetz disse:

Olá, O PWM pelo que estudei - não sei se compreendi direito - mas durante a execução do PWM em um pino, neste mesmo momento não consigo ler outro pino que está conectado no foto-transistor.

Provavelmente este pwm que você estudou é gerado via software,se você tiver um microcontrolador com pwm embutido,você basta configurar a frequência e a porcentagem que queria deixar ativo,e ele executa paralelamente a sua aplicação.

O que @MOR pode se suficiente para sua aplicação,a interrupção alguns microssegundos,dependendo do clock e da quantidade de instrução que executar,mais dificilmente passaria de 10us,considerado que você que gerar um saida de 500hz(2ms),isto torna um valor de 0.5%,que para maioria das aplicações poderia se desprezado.

Ou você alguma outra forma de gerar sinal como@Isadora Ferraz falou.

Mais a forma mais eficiente seria outro micro com pwm interno,e possivelmente com mais processamento,é sempre bom exagerar no começo,ai depois vai aprimorado,reduzido codigo e custo.

 

 

Postado

Olá pessoal, testei um pouco mais e verifiquei que o PDM não gera sozinho, ou precisa configurar nos fuziveis alguma coisa, alguém já fez isso?

@ DEVICE PIC16F628A,WDT_OFF,PWRT_ON,MCLR_OFF,BOD_OFF,CPD_OFF,PROTECT_OFF,

 

A linguagem que uso é o picbasic. Se eu colocar a instrução PWM PORTB.3,127,100 o pic fica ocupado 100 ciclos e não consegue ler outra porta durante esse processamento.

 

Como eu faria para que o PWM oscilasse sem interferir no ciclo do programa, ou seja, independente ?

Abraço,

Postado

Olá pessoal,  funcionou!! Com a instrução em picbasic HPWM 1,127,1000 , este vai para RB3 pino 9 automaticamente e oscila "sozinho", ou seja, está fora do ciclo principal. No Proteus consegui simular perfeitamente, estou testando no protoboard, logo trago os resultados.

  • Curtir 1
Visitante
Este tópico está impedido de receber novas respostas.

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!