Leitura de um sinal pulsante ou PWM

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Re: Leitura de um sinal pulsante ou PWM

Mensagempor erik.flores » 17 Mai 2014 18:06

cfreund escreveu:Veja se entendi bem:

Você precisa identificar três situações de um pino.

1. Nivel Alto
2. Nivel Baixo.
3. Pulsando a 2 Hz com duty cycle de 50%.

É isso?


Aham, é isso Cfreund.
erik.flores
Bit
 
Mensagens: 14
Registrado em: 15 Mai 2014 10:32

Re: Leitura de um sinal pulsante ou PWM

Mensagempor cfreund » 17 Mai 2014 18:27

Configure o timer1 para gerar interrupção a cada 200ms.

Código: Selecionar todos
volatile uint8_t pulsando;

timer1_isr() {
    static uint8_t evt_cnt = 0;
    static uint8_t last, f = 0;

    if (SINAL && last != SINAL) ++f;    // incrementa f quando identificar uma mudança de 0 para 1 no pino SINAL.
    last = SINAL;

    if (++evt_cnt >= 5) {    // 1 segundo
        evt_cnt = 0;
        if (f >= 2) pulsando = 1;
        f = 0;
    }
}
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Leitura de um sinal pulsante ou PWM

Mensagempor erik.flores » 17 Mai 2014 18:43

cfreund escreveu:Configure o timer1 para gerar interrupção a cada 200ms.

Código: Selecionar todos
volatile uint8_t pulsando;

timer1_isr() {
    static uint8_t evt_cnt = 0;
    static uint8_t last, f = 0;

    if (SINAL && last != SINAL) ++f;    // incrementa f quando identificar uma mudança de 0 para 1 no pino SINAL.
    last = SINAL;

    if (++evt_cnt >= 5) {    // 1 segundo
        evt_cnt = 0;
        if (f >= 2) pulsando = 1;
        f = 0;
    }
}


Obrigado Cfreund

mas o que seria esse tipo de variavel uint8_t?
Pois está dando erro ao compilar ele no meu CCS.
erik.flores
Bit
 
Mensagens: 14
Registrado em: 15 Mai 2014 10:32

Re: Leitura de um sinal pulsante ou PWM

Mensagempor cfreund » 17 Mai 2014 18:46

'unsigned char'. Mas pode ser 'char'.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Leitura de um sinal pulsante ou PWM

Mensagempor erik.flores » 17 Mai 2014 18:58

cfreund escreveu:'unsigned char'. Mas pode ser 'char'.


Beleza, vou tentar aqui, logo postarei se deu certo..
erik.flores
Bit
 
Mensagens: 14
Registrado em: 15 Mai 2014 10:32

Re: Leitura de um sinal pulsante ou PWM

Mensagempor erik.flores » 18 Mai 2014 01:04

cfreund não to conseguindo fazer funcionar :cry:

voce colocou todo essa comparação dentro do timer?

Já coloquei no void main, já coloquei no timer e nada :|

Você poderia me dar uma luz?
Código: Selecionar todos

#define SINAL PIN_D0
#define LED PIN_C0
#define BUZZER PIN_C1
#define PULSO PIN_C2

static int conta=0;
static int contador;
volatile char pulsando;

#INT_TIMER1
void  TIMER1_isr(void)
{
      static char last, f = 0;
   
      set_timer1(3036 + get_timer1());     //8 MHz
      conta++;
     

      if (SINAL && last != SINAL)
      {
            ++f;    // incrementa f quando identificar uma mudança de 0 para 1 no pino SINAL.
            last = SINAL;

            if (conta >= 5)
            {    // 1 segundo
               conta = 0;
            }
            if (f >= 2)
            {
               pulsando = 1;
               f = 0;
            }
    }
}

void main()
{
      int16 AD_A0,AD_A1,AD_A2;
      int1 chamando = 0;

      setup_adc_ports(sAN0|sAN1|sAN2);                //ativei 3 portas analogicas A0,A1,A2
      setup_adc(ADC_CLOCK_INTERNAL);
      setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);      //262 ms overflow

      enable_interrupts(INT_TIMER1);
      enable_interrupts(GLOBAL);
   
while(TRUE)
   {
            set_adc_channel(0); 
            delay_ms(10);
            AD_A0=read_adc();
     
            set_adc_channel(1);
            delay_ms(10);
            AD_A1=read_adc();   
           
            set_adc_channel(2);
            delay_ms(10);
            AD_A2=read_adc();

/////////////////////////////////////////////////contador
           if (conta == 4)                    // Se estourou 4 vezes = 1 segundo
            {
               seg++;
               conta = 0;
            }
 
                             
      ///////////////////////////////////////////////GERADOR DE PULSO
     
            if((conta % 2) == 0)
            {
               output_high(PULSO);
            } 
            else
            {
               output_low(PULSO);
            }

      ///////////////////////////////////////////////LEITURA DO SINAL

      if(pulsando == 1)
      {
         chamando = 1;
        //LIGA MEU SISTEMA
      }

     
      if(SINAL == TRUE)                           //parar chamada
      {
         chamando = 0;
         output_low(LED);
         output_low(BUZZER);
      }

     If(SINAL == FALSE)
     {
         // PROBLEMA NO SISTEMA
      }

      if(chamando == 1)                            //pulso
      {
         if((conta % 2) == 0)
         {
            output_high(LED);
            output_high(BUZZER);
         }
         else
         {
            output_low(LED);
            output_low(BUZZER);
         }
      }
     
   }     //while
}        //void main
erik.flores
Bit
 
Mensagens: 14
Registrado em: 15 Mai 2014 10:32

Re: Leitura de um sinal pulsante ou PWM

Mensagempor cfreund » 18 Mai 2014 04:59

Não conheço CCS, então não posso te ajudar além disso.

cpp code
static int contador;

volatile int seg = 0;
volatile char pulsando;

#INT_TIMER1
void TIMER1_isr(void)
{
static char last, f = 0, conta = 0;

set_timer1(3036 + get_timer1()); //8 MHz
conta++;


if (SINAL && last != SINAL)
{
++f; // incrementa f quando identificar uma mudança de 0 para 1 no pino SINAL.
}

last = SINAL;

switch (++conta)
{
case 1:
output_high(PULSO); // Nivel alto durante 200 mS
break;

case 2:
output_low(PULSO); // baixo durante 800 mS
break;

case 5: // 1 segundo
conta = 0;
++seg;

if (f >= 2)
{
pulsando = 1;
}

f = 0;

break;
}
}


Altere:
Código: Selecionar todos
      ///////////////////////////////////////////////LEITURA DO SINAL

      if(pulsando == 1)
      {
         pulsando = 0;
         chamando = 1;
        //LIGA MEU SISTEMA
      }


Apague esta parte do código:
Código: Selecionar todos
/////////////////////////////////////////////////contador
           if (conta == 4)                    // Se estourou 4 vezes = 1 segundo
            {
               seg++;
               conta = 0;
            }
 
                             
      ///////////////////////////////////////////////GERADOR DE PULSO
     
            if((conta % 2) == 0)
            {
               output_high(PULSO);
            } 
            else
            {
               output_low(PULSO);
            }


Essa lógica só irá funcionar se Ton e Toff > 200mS. Ou seja, o tempo entre interrupções deve ser menor que o tempo entre alternâncias do SINAL.

Se o menor pulso (alto ou baixo) tiver durção de 10mS, o timer1 deverá gerar interrupção a cada 9 mS ou menos.
Cláudio F
Avatar do usuário
cfreund
Word
 
Mensagens: 672
Registrado em: 14 Out 2006 14:02
Localização: São Paulo

Re: Leitura de um sinal pulsante ou PWM

Mensagempor ze2 » 19 Mai 2014 10:40

que tal habilitar uma interrupção de mudança de estado do pino? o sinal existe se passar por ela + de 3x p.ex. há de zerar um flag qualquer caso não passe por ela + de 2 seg p.ex. não consigo exemplificar no momento. sorry.
ze2
Byte
 
Mensagens: 193
Registrado em: 09 Fev 2009 13:37

Re: Leitura de um sinal pulsante ou PWM

Mensagempor erik.flores » 27 Mai 2014 10:55

Já consegui amigos

Fiz uma comparação manual mesmo.
No caso coloquei uma variavel com uma valor = 10 e uma variavel para contagem de vezes que o programa passa no programa inteiro, exemplo se passa 100 vezes por segundo, quando ele for igual a 10 ele faz comparação das outras situações.
Então fiz uma condição com uma variável para contar a cada situação.
como 5V, 0V e pulsante.

segue o código em C que eu fiz:
onde p_limite é o 10 que eu disse, que seria a hora de ele fazer a comparação, quando se passasse 10 vezes no programa.
Código: Selecionar todos
WHILE(TRUE)
{
            p_conta = p_conta + 1;
            if(input(BOTAO)
            {
               p_qtd_h = p_qtd_h + 1;
               
            }
            else
            {
               p_qtd_l = p_qtd_l +1;
            }
           
            if(p_conta == p_limite)
            {
               if(p_qtd_h == p_limite)
               {
                  // CONDIÇÃO NORMAL (5V)
                  p_confirma = 0;
               }
               else
               if(p_qtd_l == p_limite)
               {
                  //CONDIÇÃO ERRO (0V)
                  p_confirma = 0;
               }
               else
               {
                  p_confirma = p_confirma + 1;
                  if((p_confirma == 2) && (ultima_chamada == 1))
                  {
                    // CONDIÇÃO CHAMADA (PULSANTE)
                    p_confirma = 0;
                    ultima_chamada = 0;
                  }
                 
               }
               p_conta = 0;
               p_qtd_h = 0;
               p_qtd_l = 0;
               
            }
}
erik.flores
Bit
 
Mensagens: 14
Registrado em: 15 Mai 2014 10:32

Re: Leitura de um sinal pulsante ou PWM

Mensagempor styg » 27 Mai 2014 14:09

Amigo, só agora vi seu post, se quer fazer de um jeito simples e rapido, voce pode fazer assim:

Código: Selecionar todos
if(sinal) {
   delay(xxms) // delay suficiente para que o sinal já tenha trocado de estado (já que voce conhece a frequencia e a mesma é fixa)
   if(!sinal)
      rotina_que_trata();
   }
Lucas
Avatar do usuário
styg
Word
 
Mensagens: 799
Registrado em: 16 Out 2006 08:24
Localização: Floripa abaixo de zero.

Anterior

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x