1 Présentation du projet – Cahier des charges

publicité
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
Téléchargement