Capteur de Température – Utilisation du mode ULPWU du PIC12F683 – Transmission radio de la donnée Eln 2007 1 Présentation du projet – Cahier des charges Ce document présente un montage qui capte la température intérieure (entre +2°C et +100°C) à l'aide d'un capteur LM35DZ. La tension issue de ce capteur est numérisée régulierement par le CAN du PIC en mode 10 bits. Puis les 8 bits de poid faible du résultat de la conversion sont envoyés par laison radio en utilisant un protocole série (1 bit de start, 8 bits de données, 1 bit de stop, pas de parité) à l'aide d'un module de Telecontrolli RT6-433. L'échantillonnage régulier de la température est réalisé en utilisant le mode ULPWU (Ultra Low Power Wake-Up = Réveil en mode basse consommation) du PIC. Entre chaque mesure, le PIC est endormi (mode SLEEP). Dans ce mode, on coupe l'alimentation du module RT6-433 et du capteur de température, on obtient alors une consommation inférieur à 1uA donc on peut avoir une alimentation par piles. Le réveil du PIC est donc périodique et dépend de la capacité qui est connecté au port GP0. Dans les conditions normales d'utilisation (à 25°C), on tire 135nA (Isink) et lorsque la tension aux bornes du condensateur passe en dessous de Vil (Vil=0,58V indépendant de la tension d'alimentation), cela déclenche une interruption et réveille le PIC. Le temps entre deux mesures est donc donné par la formule suivante (Voir la note d'application AN879 de Microchip) : T en s = [(Vo – Vil).C] / (Isink + Ifuite) avec ● ● ● ● ● Vo : tension de départ en Volt à laquelle est chargé le condensateur (généralement on le chargera à son maximum donc pas très loin de la tension d'alimentation) Vil : tension de seuil bas du PIC indépendante de l'alimentation égale à 0,58V (en fait cette tension varie avec la température) C : la capacité en Farad du condensateur connecté à la broche GP0/ULPWU Isink : le courant absorbé par le PIC en mode ULPWU, cette valeur est égale à 135nA à 25°C mais varie avec la température Ifuite : le courant de fuite du condensateur (que j'ai négligé dans les calculs) Défauts qui seront corrigés dans la prochaine version : ● ● ● L'alimentation devrait être faite à l'aide d'une pile bouton CR2032 qui donne 3V mais le capteur de température ne fonctionne qu'à partir de 4V et jusqu'à 20V. On prendra donc un autre capteur de température pouvant fonctionner à partir de 2,4V. La conversion A/N prend comme référence la tension d'alimentation (qui peut fluctuer) donc on utilisera une référence de tension externe de 1,024V sur l'entrée GP1. On aura ainsi un quantum de 1mV (Vref = 1,024V et résolution de 10bit donc 1024 pas) donc une numérisation très précise de la tension du capteur (d'ailleurs supérieur à sa résolution propre de 0,5°C soit 5mV) Si on réalise une conversion complète sur 10 bits on ne se contentera plus d'envoyer les 8 bits de poids faibles. Il faudra transmettre les bits de poids forts et de poids faibles. Pour fiabiliser la liaison radio on définira une certaine trame avec des octets de synchronisation (valeur 0x55), un octet de début de trame, les deux octets de la mesure de la température, un octet de vérification (obtenu soit par addition des deux octets précédents, soit en réalisant un XOR), un octet de fin de trame. De plus on utilisera le code de Hamming pour avoir une valeur moyenne de la trame transmise égale à 0V ce qui est meilleure dans le cas d'une transmission radio. Olivier DARTOIS Page 1/6 Capteur de Température – Utilisation du mode ULPWU du PIC12F683 – Transmission radio de la donnée Eln 2007 Pour l'instant on se contente pour des tests d'alimenter notre maquette en 5V à partir d'une alimentation ou en 6V à partir de deux piles CR2032 en série. 2 Schéma structurel Avec les contraintes énoncées précédemment on obtient le schéma suivant : Emetteur PIC 12F683 avec RT6-433 +5V VDD S1 et S2 : choix du mode de fonctionnement du module RT6-433 ATTENTION : Pas de régulateur de tension sur ce montage pour faire des tests en 3V, 4,5V ou 9V K1 2 C1 C2 100nF 47uF ALIM_RT 1 BORVI2 VSS 2 IN1 J2 IN2 GND 3 GND S2 EMBASE-3PT pour LM35 J1 ANT ST 11 PIN GND S1 VCC 15 U2 U1 2 3 4 GP5/OSC1 GP0/AN0 GP4/OSC2/AN3 GP3/MCLR GP1/AN1/VREF GP2/T0CKI/INT/AN2 13 R_ULPWU 6 ALIM_RT C3 PIC12F683 R1 RT6-433 R3 7 5 4 1 ST ALIM_RT 1 2 3 C_ULPWU 220 K2 L1 BPT +5V LED R4 RES2 Le bouton poussoir K2 est là pour faire des tests mais ne sert à rien dans le cadre que l'on s'est fixé. Il sera supprimé ainsi que la résistance R4 de la version finale. Les composants utilisés pour le mode ULPWU sont R3 et C3. Ceux-ci seront montés sur des picos sur le prototype pour pouvoir les changer facilement. La résistance R3 n'est là que pour limiter l'appel de courant lors de la charge de la capacité C3. Comme une sortie d'un PIC peut délivrer 25mA, il faut se limiter ou être plus bas que ce courant Ipic = VDD/R3. Sur le prototype j'ai pris R3=330 Ohm ce qui limite le courant à 15mA dans le cas ou VDD=5V. De plus cette résistance fixe aussi le temps de charge avec Tau=R3.C3. Si on considère qu'à 3Tau la capacité est chargé à son maximum, il faudra passer comme valeur à la fonction sleep_ulpwu() du langage C une valeur en µs supérieur ou égale à 3Tau. On remarque que c'est la sortie GP2 qui alimente le module RT6-433 et le capteur de température. Les deux cumulés consomment aux alentours de 8mA donc on est bien en dessous des 25mA max. Les cavaliers S1 et S2 permettent de choisir plusieurs puissances d'émission en fonction de l'alimentation. Dans la version finale, ces cavaliers n'existeront plus et la sortie DATA sera directement reliée à l'entrée IN1 du module RT6-433. Olivier DARTOIS Page 2/6 Capteur de Température – Utilisation du mode ULPWU du PIC12F683 – Transmission radio de la donnée Eln 2007 3 Implantation, typon et nomenclature Un prototype a été réalisé à partir du schéma suivant : Implantation: Typon coté cuivre: avec plan de masse (réalisé): Le prototype réalisé est celui avec le plan de masse. Le module RT6-433 aura une meilleure portée avec une antenne (J1 sur l'implantation). Cette antenne est une antenne « quart d'onde » ce qui donne pour du 433MHz (landa=c/f donc longueur = c/4f = 3e8 / (4*433e6) = 17cm). Avec le plan de masse son rayonnement omnidirectionnel sera maximum. Le prototype réél ne correspond pas au typon ci-dessus mais a subi diverses « manipulations » pour avoir le même schéma (la preuve en photo :-): Module radio RT6-433 de Telecontrolli PIC12F683 Capteur de température LM35CZ Bouton poussoir (pour test uniquement) Résistance et capacité pour le mode ULPWU Modifications « post réalisation » :-) La nomenclature est la suivante : QTY PART-REFS --- --------Resistors --------1 R1 1 R3 1 R4 VALUE ----220 R_ULPWU 1M Capacitors ---------1 C1 1 C2 1 C3 100nF 47uF C_ULPWU Integrated Circuits ------------------1 U1 1 U2 PIC12F683 RT6-433 Miscellaneous ------------1 J1 1 J2 PIN EMBASE-3PT pour LM35 Olivier DARTOIS Page 3/6 Capteur de Température – Utilisation du mode ULPWU du PIC12F683 – Transmission radio de la donnée 1 1 1 2 K1 K2 L1 S1,S2 Eln 2007 BORVI2 BPT LED ST 4 Programme en langage C Pour la programmation des PIC, nous utilisons le compilateur C pour PIC de CCS et le boitier ICD-U. Le programme est commenté pour expliquer son fonctionnement #include <12F683.h> #device adc=10 // CAN en mode 10 bits #FUSES #FUSES #FUSES #FUSES #FUSES #FUSES #FUSES #FUSES #FUSES NOWDT INTRC_IO NOCPD NOPROTECT MCLR PUT NOBROWNOUT NOIESO NOFCMEN //No Watch Dog Timer //Internal RC Osc, no CLKOUT //No EE protection //Code not protected from reading //Master Clear pin used for I/O //Power Up Timer //Reset when brownout detected //Internal External Switch Over mode enabled //Fail-safe clock monitor enabled #use delay(internal=1M) #define #define #define #define DATA PIN_A1 ALIM_RT PIN_A2 CAPT_TEMP PIN_A4 LED PIN_A5 // Le DELAY_TRANS correspond à la vitesse de transmission souhaitée (pas d'USART dans un PIC12F) // Sachant que le module de réception est limité à 2KHz on choisit une vitesse de 1200 bauds/s // donc la durée de chaque bit est de 1/1200 soit un peu prés 833us #define DELAI_TRANS 833 void main() { int i=0, j=0; int16 valeur_T=0, sauv_T=0; int1 bit=0; setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC); setup_vref(FALSE); port_a_pullups(0b00010000); // Activation de la résistance de rappel sur GP5 disable_interrupts(GLOBAL); // Désactivation de toutes les interruptions (GIE) // Donc quand on sortira du mode SLEEP on continuera l'execution du prog // et on ne partira pas en interruption enable_interrupts(INT_RA); while (true) { output_low(ALIM_RT); output_low(DATA); output_low(CAPT_TEMP); output_low(LED); sleep_ulpwu(5000); output_float(CAPT_TEMP); // on met l'entrée en flottant pour éviter le CC lors de l'alim du RT et CAPT output_high(ALIM_RT); // on alimente le module RT-433 et le capteur de temp delay_ms(5); // on attend que tout le monde se réveille // D'aprés la doc constructeur du LM35 il faut mini 40us // Pour le module RT-433 pas de specification donc on prend 5ms setup_adc_ports(sAN3); // on numérise l'entrée du capteur de temp setup_adc(ADC_CLOCK_DIV_2); set_adc_channel(3); delay_us(10); valeur_T = read_adc(); setup_adc_ports(NO_ANALOGS); // on éteint le convertisseur A/N setup_adc(ADC_OFF); output_float(CAPT_TEMP); // on remet en flottant l'entrée du capteur de temp output_high(LED); // on allume la DEL output_high(DATA); // on met à 1 la ligne DATA pour réveiller le module rt-433 delay_us(500); for (j=0;j<10;j++) { // on va envoyer 10 fois la même trame pour fiabiliser la transmission sauv_T=valeur_T; Olivier DARTOIS Page 4/6 Capteur de Température – Utilisation du mode ULPWU du PIC12F683 – Transmission radio de la donnée Eln 2007 output_low(DATA); // on crée le bit de start delay_us(DELAI_TRANS); // on envoie les 8 bits (poids faible) du résultat de la conversion A/N du capteur de Temp, LSB en premier // les 2 bits de poids forts sont non utilisés car on montera jamais à 3V (T=300°C) // par contre la résolution sur 10bits est necessaire car la tension du capteur est faible (10mV/°C) for (i=0;i<8;i++) { bit=shift_right(&sauv_T,1,0); output_bit(DATA,bit); delay_us(DELAI_TRANS); } output_high(DATA); // on crée le bit de stop delay_us(DELAI_TRANS); } delay_ms(2); // on attend un peu entre chaque émission de données pour la synchro // c'est pas forcement necessaire mais préférable } } 5 Mesures sur le prototype Le prototype est alimenté en +5V, la résistance R_ULPWU est une 330 Ohm et C_ULPWU est un 470nF. Donc on aura un réveil périodique du PIC toutes les : T = (5-0,58).470e-9 / 135e-9 = 15,4s en négligeant Ifuite. Aprés mesure avec un multimètre on a : R_ULPWU = 327 Ohm et C_ULPWU = 482,3nF. Dans ce cas : T = (5-0,58).482,3e-9 / 135e-9 = 15,8s toujours en négligeant Ifuite. On vérifie 'T' expérimentalement en connectant une sonde sur l'alimentation du module RT6. La mesure sur l'oscillo n'est pas très précise vu la base de temps employée. On aura donc un résultat indicatif pour vérifier la théorie. Sur la capture ci contre on remarque que le PIC se réveille toutes les 16,4s. On a une base de temps très basse (5s) donc vu la résolution on doit faire une erreur de mesure importante. On constate néanmoins que l'on est relativement proche de la valeur théorique de 15,8s. On visualise maintenant l'entrée DATA IN1 du module RT6-433: La trace A correspond à la trame série envoyée par le PIC vers le module RT6 qui représente les 8 bits de poids faibles issu de la numérisation du capteur de température. La première impulsion correspond au « réveil » du module RT6 et dure 500us. Puis vient le bit de start à l'état bas qui dure 833us puis les 8 bits de données LSB en premier (ici 01110100 ce qui donne remis à l'endroit 0010 1110 soit 46 en décimal, ce qui nous permet de déduire la température dans la pièce à ce moment là (46 x 5V)/1024 = 0,225V soit comme le capteur donne 10mV/°C : 22,5°C). Ensuite le bit de stop arrive et dure 833us enfin on attend 2ms à l'état Olivier DARTOIS Page 5/6 Capteur de Température – Utilisation du mode ULPWU du PIC12F683 – Transmission radio de la donnée Eln 2007 haut avant de recommencer à envoyer la même donnée. Cette durée de 2ms est visible sur la trace B entre chaque émission. Bien sur l'echelle des temps est différente entre la trace A et la trace B. La trace 1 représente la trame complète (la donnée de température envoyée 10 fois). L'echelle des temps est différente de la trace B. On a donc bien réalisé une transmission série de la donnée de température en mode 8N1 (8 bit, pas de parité, 1 bit de stop) à la vitesse de 1200 bauds. Par curiosité, j'ai regardé l'allure de la tension aux bornes de la capacité C_ULPWU et on obtient la capture ci-aprés. L'allure est respecté mais par contre on perturbe le système donc la durée de décharge n'est pas respectée. Par contre les niveaux de tensions eux sont corrects : charge de la capacité à la tension d'alimentation (ici 5V) et basculement à Vil=0,6V : Ce n'est pas la courbe exacte car on ramène une résistance et une capacité parasite en effectuant la mesure même si la sonde est mise en x10. Lorsque le module RT6-433 et le capteur de température ne sont pas alimentés on a une consommation inférieur au micro-ampère donc la pile doit pouvoir tenir quelque mois. Olivier DARTOIS Page 6/6