Como medir a largura de pulso de um sinal IR usando um PIC de 8 bits?


14

Meu amigo e eu queremos projetar um controle remoto universal de aprendizado, como este , para fins de aprendizado. O que queremos fazer basicamente é armazenar e reproduzir pulsos infravermelhos.

Queremos detectar sinais de 36kHz, 38kHz e 40kHz. Um sinal de 40kHz terá um período de 25 .μ

Queremos usar um microcontrolador PIC de 8 bits, por enquanto selecionamos o PIC16F616, que será executado no oscilador de cristal de alta velocidade de 20MHz. Temos duas opções disponíveis:

  1. Use o Interrupt On Changemódulo
  2. Use o modo de captura do módulo CCP.

A primeira opção será a seguinte:

Suponha que um registo é definido como: unsigned char _10_us = 0;. Este registro manterá o tempo. O módulo TMR2 com registro de período está definido para criar uma interrupção a cada 10 seg. Quando ocorre uma interrupção, ele incrementa o registro e sai. Isso dará um tempo máximo de 2,55 ms. Se for necessária mais medição de tempo, registros adicionais, como podem ser definidos e incrementados, conforme necessário.μ_10_us_1_ms

Agora, toda vez que uma interrupção é gerada por qualquer tipo de alteração (alta para baixa ou baixa para alta), o programa anotará a hora atual, que é o valor do _10_usregistro. Depois de um tempo, quando a próxima interrupção for gerada, o programa subtrairá o valor salvo do _10_usregistro e, agora, o tempo gasto nesse meio tempo, com uma unidade de 10 segundos.μ

Essa opção me faz coçar a cabeça; A interrupção do TMR2 ocorrerá a cada 50 instruções. O manuseio de interrupção levará cerca de 20 instruções. Fico com 30 instruções para calcular e salvar o período em uma matriz. Esse método funcionará?

A segunda opção será a seguinte:

Configure o modo de captura do módulo CCP para que ele gere uma interrupção quando ocorrer um evento (alto-baixo) no pino CCP1. Na rotina de interrupção, ele definirá um sinalizador para que uma tarefa no programa possa calcular (se necessário) e salvar o valor de CCPR1H (provavelmente não será necessário) e CCPR1L. Em seguida, alteraremos a configuração do modo de captura para que ele acione a interrupção quando ocorrer uma borda baixa a alta. E então ele aguardará o próximo evento. Não posso estimar o desempenho desse método, pois nunca o usei.

Outra opção?

Podemos usar um IC de desmodulador de infravermelho, como a série TSOP17xx . Isso resolveria nosso problema completamente. No entanto, algumas perguntas vêm à mente.

Nosso requisito de distância de leitura não é muito; 1 metro (~ 3 pés). Se seleccionar um TSOP1738 que se destina a estar trabalhando em 38kHz, como bem este trabalho com os sinais de 36kHz e 40kHz?

A página 4 da folha de dados da série TSOP17xx mostra o gráfico "Dependency Frequency of Responsivity". Tanto quanto entendemos;

  • 40kHz, que é ~ 1,053 de 38kHz, fornecerá uma responsividade relativa de ~ 0,6.
  • 36kHz, que é ~ 0,95 de 38kHz, dará uma responsividade relativa de ~ 0,65.

O que significam esses valores? Podemos usar um TSOP1738 e ficar bem?


Por que não apenas escrever um loop de software que conta quantos loops entre pulsos?
Rocketmagnet

@Rocketmagnet Não entendi. Você poderia escrever uma resposta se tiver tempo? Além disso, lembre-se de que faremos muitas outras coisas, como RS232 e SPI, além do problema mencionado.
abdullah kahraman

Respostas:


11

0,65

Não se preocupe com o desempenho do PIC. O TSOP1738 não emitirá o sinal de 38 kHz. Essa é a frequência da portadora, removida pelo TSOP1738 para recuperar o sinal da banda base, que tem uma frequência muito mais baixa, com durações de pulso da ordem de 1 ms, para que haja tempo de sobra para medir o tempo entre as bordas com precisão.

As seguintes imagens de escopo ilustram isso:

insira a descrição da imagem aqui

Este é um código RC5. O sinal superior é o sinal modulado de 36 kHz, na parte inferior o sinal da banda de base com o código real.

insira a descrição da imagem aqui

Isso é ampliado em um pulso do sinal da banda base. Você pode ver pulsos individuais da portadora de 36 kHz.

Mais uma palavra sobre a frequência da operadora. Você pode estar usando um controle remoto do qual não conhece essa frequência. O TSOP1738 não fornece sua saída; portanto, se você quiser lê-lo, será necessário conectar um fotodiodo ou transistor de infravermelho a uma das entradas do PIC e ler o tempo entre duas mesmas arestas. Isso é viável. Períodos de período para diferentes frequências da operadora:

40 kHz: 25 µs
38 kHz: 26,3 µs
36 kHz: 27,8 µs

Um PIC16F616 de 20 MHz possui um ciclo de instrução de 200 ns (divide o relógio por 4!). Portanto, as leituras para as três frequências devem ser de 125, 131 e 139. Isso deve ser suficiente para diferenciá-las. Mas se você quiser, pode deixar passar várias arestas e ler o cronômetro somente após a 10ª interrupção, por exemplo: 1250, 1316, 1389. Não muito mais, porque você precisa manter o tempo menor que um pulso do sinal da banda base .

Sucesso!


Isso agora está relaxando, obrigado. Eu criei um "aluno de RI" baseado no TSOP1738 há muito tempo, mas isso era uma bagunça.
abdullah kahraman
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.