Comment mesurer la largeur d'impulsion d'un signal IR en utilisant un PIC 8 bits?


14

Mon ami et moi voulons concevoir une télécommande d'apprentissage universelle, comme celle-ci , à des fins d'apprentissage. Ce que nous voulons faire, c'est essentiellement stocker et rejouer les impulsions infrarouges.

Nous voulons détecter les signaux 36 kHz, 38 kHz et 40 kHz. Un signal à 40 kHz aura une période de 25 .μ

Nous voulons utiliser un microcontrôleur PIC 8 bits, pour l'instant nous avons sélectionné PIC16F616, qui fonctionnera à 20MHz oscillateur à cristal haute vitesse. Nous avons deux options disponibles:

  1. Utilisez le Interrupt On Changemodule.
  2. Utilisez le mode de capture du module CCP.

La première option sera la suivante:

On suppose un registre est défini comme: unsigned char _10_us = 0;. Ce registre contiendra le temps. Le module TMR2 avec registre de période est réglé pour créer une interruption toutes les 10 . Lorsqu'une interruption se produit, il incrémente le registre et quitte. Cela donnera un temps maximum de 2,55 ms. Si plus de mesure du temps est nécessaire, des registres supplémentaires tels que ceux-ci peuvent être définis et incrémentés selon les besoins.μ_10_us_1_ms

_10_us_10_usμ

Cette option me fait me gratter la tête; L'interruption TMR2 se produit environ toutes les 50 instructions. La gestion des interruptions prendra environ 20 instructions. Il me reste 30 instructions pour calculer et enregistrer la période dans un tableau. Cette méthode fonctionnera-t-elle?

La deuxième option sera la suivante:

Configurez le mode de capture du module CCP afin qu'il génère une interruption lorsqu'un événement (de haut en bas) se produit sur la broche CCP1. Dans la routine d'interruption, il définira un indicateur afin qu'une tâche dans le programme puisse calculer (si nécessaire) et enregistrer la valeur de CCPR1H (ne sera probablement pas nécessaire) et CCPR1L. Ensuite, nous allons changer la configuration du mode de capture afin qu'il déclenche l'interruption lorsqu'un front bas à haut se produit. Et puis il attendra le prochain événement. Je ne peux pas estimer les performances de cette méthode car je ne l'ai jamais utilisée.

Une autre option?

Nous pouvons utiliser un IC démodulateur infrarouge tel que la série TSOP17xx . Cela résoudrait complètement notre problème. Cependant, certaines questions me viennent à l'esprit.

Notre exigence de distance de lecture n'est pas beaucoup; 1 mètre (~ 3 pieds). Si nous choisissons un TSOP1738 qui est destiné à travailler dans 38kHz, comment bien cela fonctionnera avec les signaux 36kHz et 40kHz?

La page 4 de la fiche technique de la série TSOP17xx présente le graphique "Dépendance en fréquence de la réactivité". Pour autant que nous comprenions;

  • 40 kHz, qui est ~ 1,053 de 38 kHz, donnera une sensibilité relative de ~ 0,6.
  • 36 kHz, qui est ~ 0,95 de 38 kHz, donnera une sensibilité relative de ~ 0,65.

Que signifient ces valeurs? Pouvons-nous utiliser un TSOP1738 et être bien?


Pourquoi ne pas simplement écrire une boucle logicielle qui compte le nombre de boucles entre les impulsions?
Rocketmagnet

@Rocketmagnet Je ne comprends pas. Pourriez-vous écrire une réponse si vous avez le temps? En outre, gardez à l'esprit que nous ferons beaucoup d'autres choses comme RS232 et SPI en dehors du problème mentionné.
abdullah kahraman

Réponses:


11

0,65

Ne vous inquiétez pas des performances du PIC. Le TSOP1738 ne produira pas le signal à 38 kHz. C'est la fréquence porteuse, qui est supprimée par le TSOP1738 pour récupérer le signal de bande de base, qui a une fréquence beaucoup plus basse, avec des durées d'impulsion de l'ordre de 1 ms, donc il y a beaucoup de temps pour mesurer le temps entre les bords avec précision.

Les images de portée suivantes illustrent cela:

entrez la description de l'image ici

Ceci est un code RC5. Le signal supérieur est le signal modulé à 36 kHz, le signal inférieur la bande de base avec le code réel.

entrez la description de l'image ici

Ceci est zoomé sur une impulsion du signal en bande de base. Vous pouvez voir les impulsions individuelles de la porteuse 36 kHz.

Un mot de plus sur la fréquence porteuse. Vous utilisez peut-être une télécommande dont vous ne connaissez pas la fréquence. Le TSOP1738 ne le donne pas sur sa sortie, donc si vous voulez le lire, vous devrez connecter une photodiode IR ou un transistor à l'une des entrées du PIC et lire le temps entre deux mêmes bords. C'est faisable. Temps de période pour différentes fréquences porteuses:

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

Un PIC16F616 à 20 MHz a un cycle d'instruction de 200 ns (il divise l'horloge par 4!). Les lectures pour les trois fréquences devraient donc être d'environ 125, 131 et 139. Cela devrait suffire à les différencier. Mais si vous le souhaitez, vous pouvez laisser passer un certain nombre de fronts et lire le temporisateur uniquement après la 10e interruption, par exemple: 1250, 1316, 1389. Pas trop longtemps car vous devez garder le temps plus court qu'une impulsion du signal de bande de base .

Succès!


C'est maintenant relaxant, merci. J'ai créé un "apprenant IR" basé sur TSOP1738 il y a longtemps, mais c'était un gâchis.
abdullah kahraman
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.