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?