 
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.
!"#$%!& '(
 
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 :
)*(!&
)+(!&($,
)(-%
+
)($,
)($,(.%
)(/(,($, *


/
0!%.
1*. .##
.&&



+ 
"2%3+
),#
+
,
,
$, 
),#
),#

. *

%3+
$-4%
$-4%
&
&
&
&

#
%

5
,
&&627892%3+
$,!,6'2'9.:+:*.;.
5
-0$&3-*
%
%4

4
/
0
%+
%&
1*.
$-4%
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.
!"#$%!& '(
 
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 :-):
La nomenclature est la suivante :
QTY PART-REFS VALUE
--- --------- -----
Resistors
---------
1 R1 220
1 R3 R_ULPWU
1 R4 1M
Capacitors
----------
1 C1 100nF
1 C2 47uF
1 C3 C_ULPWU
Integrated Circuits
-------------------
1 U1 PIC12F683
1 U2 RT6-433
Miscellaneous
-------------
1 J1 PIN
1 J2 EMBASE-3PT pour LM35
!"#$%!& '(
-
%3+
2


-*<
%2
22

0
=
>?

-92
@A
AB63?
 
1 K1 BORVI2
1 K2 BPT
1 L1 LED
2 S1,S2 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 NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOCPD //No EE protection
#FUSES NOPROTECT //Code not protected from reading
#FUSES MCLR //Master Clear pin used for I/O
#FUSES PUT //Power Up Timer
#FUSES NOBROWNOUT //Reset when brownout detected
#FUSES NOIESO //Internal External Switch Over mode enabled
#FUSES NOFCMEN //Fail-safe clock monitor enabled
#use delay(internal=1M)
#define DATA PIN_A1
#define ALIM_RT PIN_A2
#define CAPT_TEMP PIN_A4
#define 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;
!"#$%!& '+(
 
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 (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
!"#$%!& '*(
1 / 6 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !