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?

abdullah kahraman
fonte
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!

stevenvh
fonte
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