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:
- Use o
Interrupt On Change
módulo - 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_us
registro. Depois de um tempo, quando a próxima interrupção for gerada, o programa subtrairá o valor salvo do _10_us
registro 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?
fonte
Respostas:
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:
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.
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!
fonte