Come misurare l'ampiezza dell'impulso di un segnale IR utilizzando un PIC a 8 bit?


14

Io e il mio amico vogliamo progettare un telecomando di apprendimento universale, come questo , a scopo di apprendimento. Ciò che vogliamo fare sostanzialmente è archiviare e riprodurre impulsi a infrarossi.

Vogliamo rilevare segnali a 36kHz, 38kHz e 40kHz. Un segnale a 40 kHz avrà un periodo di 25 s.μ

Vogliamo utilizzare un microcontrollore PIC a 8 bit, per ora abbiamo selezionato PIC16F616, che funzionerà a oscillatore a cristallo ad alta velocità da 20 MHz. Abbiamo due opzioni disponibili:

  1. Usa il Interrupt On Changemodulo.
  2. Utilizzare la modalità di acquisizione del modulo CCP.

La prima opzione sarà la seguente:

Si supponga un registro è impostato come: unsigned char _10_us = 0;. Questo registro conterrà il tempo. Il modulo TMR2 con registro periodico è impostato per creare un interrupt ogni 10 sec. Quando si verifica un interruzione, aumenterà il registro e uscirà . Ciò darà un tempo massimo di 2,55 msec. Se è necessaria una maggiore misurazione del tempo, è possibile definire e incrementare registri aggiuntivi come necessario.μ_10_us_1_ms

Ora, ogni volta che viene generato un interrupt da qualsiasi tipo di cambiamento (da alto a basso o da basso ad alto), il programma noterà l'ora corrente, ovvero il valore del _10_usregistro. Dopo un po ', quando viene generato l'interruzione successiva, il programma sottrarrà il valore salvato dal _10_usregistro e quindi sarà il tempo impiegato nel frattempo, con un'unità di 10 secondi.μ

Questa opzione mi fa grattare la testa; L'interruzione TMR2 si verificherà ogni 50 istruzioni circa. La gestione dell'interruzione richiederà circa 20 istruzioni. Mi rimangono 30 istruzioni per calcolare e salvare il periodo in un array. Questo metodo funzionerà?

La seconda opzione sarà la seguente:

Impostare la modalità di acquisizione del modulo CCP in modo che generi un interrupt quando si verifica un evento (da alto a basso) sul pin CCP1. Nella routine di interrupt, imposterà un flag in modo che un'attività nel programma possa calcolare (se necessario) e salvare il valore di CCPR1H (probabilmente non sarà necessario) e CCPR1L. Quindi cambieremo la configurazione della modalità di acquisizione in modo da attivare l'interruzione quando si verifica un fronte da basso a alto. E poi aspetterà il prossimo evento. Non riesco a stimare le prestazioni di questo metodo poiché non l'ho mai usato.

Un'altra opzione?

Possiamo usare un IC demodulatore a infrarossi come la serie TSOP17xx . Ciò risolverebbe completamente il nostro problema. Tuttavia vengono in mente alcune domande.

Il nostro requisito di distanza di lettura non è molto; 1 metro (~ 3 piedi). Se selezioniamo un TSOP1738 che dovrebbe funzionare a 38kHz, quanto funzionerà bene con i segnali a 36kHz e 40kHz?

La pagina 4 della scheda tecnica della serie TSOP17xx mostra il grafico "Dipendenza dalla frequenza della reattività". Per quanto abbiamo capito;

  • 40kHz, che è ~ 1.053 di 38kHz, darà una reattività relativa di ~ 0.6.
  • 36kHz, che è ~ 0,95 di 38kHz, darà una reattività relativa di ~ 0,65.

Cosa significano questi valori? Possiamo usare un TSOP1738 e stare bene?


Perché non scrivere semplicemente un loop software che conta quanti loop tra gli impulsi?
Rocketmagnet,

@Rocketmagnet Non capisco. Potresti scrivere una risposta se hai tempo? Inoltre, tieni presente che faremo molte altre cose come RS232 e SPI oltre al problema menzionato.
Abdullah Kahraman,

Risposte:


11

Sì, TSOP1738 lo farà a questa breve distanza. La reattività relativa di 0,65 significa che a 36 kHz il tuo LED IR deve essere0.65= 0,8 volte più vicino per vedere la stessa potenza del segnale, a causa della legge del quadrato inverso . Quindi, se TSOP1738 rileva un certo livello per 38 kHz a 1 m, dovrai tenere il trasmettitore a 80 cm per ottenere la stessa potenza del segnale a 36 kHz. A proposito, con un telecomando con batterie nuove ho misurato una ricezione perfetta a più di 15 m di distanza, quindi nessun problema.

Non preoccuparti delle prestazioni del PIC. TSOP1738 non emetterà il segnale a 38 kHz. Questa è la frequenza portante, che viene rimossa dal TSOP1738 per recuperare il segnale in banda base, che ha una frequenza molto più bassa, con durate dell'impulso dell'ordine di 1 ms, quindi c'è un sacco di tempo per misurare accuratamente il tempo tra i bordi.

Le seguenti immagini dell'ambito illustrano questo:

inserisci qui la descrizione dell'immagine

Questo è un codice RC5. Il segnale superiore è il segnale modulato a 36 kHz, in basso il segnale in banda base con il codice attuale.

inserisci qui la descrizione dell'immagine

Viene ingrandito su un impulso del segnale in banda base. Puoi vedere i singoli impulsi del portatore a 36 kHz.

Ancora una parola sulla frequenza portante. È possibile che tu stia utilizzando un telecomando di cui non conosci questa frequenza. Il TSOP1738 non lo fornisce sulla sua uscita, quindi se vuoi leggerlo dovrai collegare un fotodiodo IR o un transistor a uno degli ingressi del PIC e leggere il tempo tra due stessi fronti. È fattibile. Periodi di periodo per diverse frequenze portanti:

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

Un PIC16F616 a 20 MHz ha un ciclo di istruzioni di 200 ns (divide l'orologio per 4!). Quindi le letture per le tre frequenze dovrebbero essere circa 125, 131 e 139. Ciò dovrebbe essere sufficiente per distinguerle. Ma se vuoi puoi lasciare passare un certo numero di fronti e leggere il timer solo dopo il decimo interrupt, ad esempio: 1250, 1316, 1389. Non troppo a lungo perché devi mantenere il tempo più breve di un impulso del segnale in banda base .

Successo!


Ora è rilassante, grazie. Ho creato uno "studente IR" basato su TSOP1738 molto tempo fa, ma era un casino.
Abdullah Kahraman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.