Projet du travail de réalisation : TESTEUR DE BATTERIE A LAMPES (DE 8 A 20V) Décharge de 30A à courant régulé Étudiants : M. CHARLOT Olivier M. MIKUSIAK Stephen Professeur : M. SIVERT Arnaud Promotion 2009/2010 Sommaire : Étude de la carte déchargeur Présentation du testeur de batterie Page : 3 Schéma fonctionnel Page : 4 Modèle équivalent d'une batterie Page: 5-6 But de la carte déchargeur Page : 7 Schéma de câblage réalisé sous ISIS Page : 8 Schéma de câblage réalisé sous ARES Page : 9 Étude du transistor TIP122 Page : 10 Étude du convertisseur 12V-5V (7805) Page : 11 Étude de la mesure du courant Page : 12 Étude d'un potentiomètre de consigne Page : 13 Programme du test des transistors TIP122 un par un Page : 14 Programme de la régulation du courant Simulation du programme Programme linéarisation de la régulation Simulation du programme de linéarisation Page : 15 Page : 16 Page : 17 Page : 18 Programme final de la carte déchargeur Schéma de simulation sous ISIS Page : 18-23 Page : 24 La carte micro-contrôleur La carte afficheur But de la carte micro Page : 25 Schéma de câblage réalisé sous ISIS Page : 27 Schéma de câblage réalisé sous ARES Page : 28 Liste des entrées-sorties du micro Page : 29 Configuration du logiciel CCS Page : 30-33 But de la carte afficheur Page : 34 Schéma de câblage réalisé sous ISIS Page : 34 Schéma de câblage réalisé sous ARES Page : 35 Étude du bouton poussoir BP4 Page : 35 Programme pour le bouton poussoir Page : 36 Conclusion Page : 36 Conclusion du déchargeur à lampe Page : 37 Déchargeur avec ventilateur de voiture Page : 37 PRESENTATION: De nos jours, nous utilisons de plus en plus de système autonome en énergie électrique. Par conséquent, les batteries sont de plus en plus utilisés (appareil photo, baladeur mp3, lampe de poche, téléphone portable, capteur pour alarme, réveil, PC portable, bloc de sécurité, voiture, chariot élévateur électrique, outillage sans fil…). Donc nous allons réaliser un testeur de batterie qui permettra de tester la capacité énergétique des batteries. Ce testeur sera réglable. Objectifs : Notre objectif est de connaitre la capacité énergétique d’une batterie pour savoir si elle est correcte. En effet nous avons remarqué que de nombreuse batteries avait une tension correcte et pouvait fournir de grand courant, mais que leur capacité énergétique était de 5A.H à la place de 50 A.H. Le but de notre travail est donc de réaliser un testeur de batterie qui sera totalement réglable en courant de décharge (limitation à 30 Ampères) et aussi en tension minimal car la batterie ne doit pas se décharger totalement sous peine de destruction, il faudra donc la recharger aussitôt. Notre système sera autonome car il sera alimenter directement par la batterie et ainsi il pourra être facilement transportable et sans problème d'alimentation par prise secteur. I) Présentation de l’alimentation et cahier des charges techniques - Courant constant de décharge à 30A avec réglage du courant Max . - Affichage LCD sur 4 lignes pour l'indication simultanée de tous les paramètres essentiels tels que courant, tension, temps de décharge, et bien entendu capacité énergétique. - Utilisation simple grâce à 2 potentiomètres qui permettent de régler le courant de décharge et la tension d'arrêt du système. - Utilisation d’un interrupteur pour la mise en marche du système. - Utilisation d'un interrupteur pour la mise en marche des ventilateurs du système. Remarques : Le testeur sera principalement centrer sur un courant traversant des lampes de type halogène, bien sûr on pourrait prendre des résistances mais ces dernières devrait être très encombrantes vu la puissance qu'elles devraient supporter ( 20W à 50 W). De plus, il est possible de récupérer gratuitement dans une casse auto des lampes de 20W et 50W. Par ailleurs on utilisera un µControleur qui permettra d'une part de commander des transistors afin d'alimenter les lampes en fonction de la consigne de courant que l'on désire et d'autre part de réguler le courant, afficher la tension et la capacité énergétique sur un afficheur LCD. Pour tester une batterie il suffit de la décharger (en utilisant des lampes halogène pour notre système) et de faire un calcul d'intégrale du courant en fonction du temps pour connaître sa capacité énergétique. Tout ceci sera effectué par notre µcontrôleur. Notre déchargeur est prévu pour tester des batteries au plomb de 12V, de 10Ah à 100Ah. Cependant, il sera possible de tester des batteries ayant une tension de 8V à 20V. Maintenant que le cahier des charges est posé, nous allons présenter le schéma fonctionnel de notre testeur de batterie. Page - 3 - sur - 38 - Schéma fonctionnel Pour présenter simplement un système, on utilise le schéma fonctionnel qui est représenté sur la figure suivante : Les ventilateurs ainsi que le système sont commandés par des interrupteurs totalement indépendants. Les consignes courant et tension seront réalisées par deux potentiomètres. La mesure du courant permettra de réguler et connaître le courant de décharge de la batterie. La mesure de la tension permettra la comparaison avec la tension de consigne et donc d'arrêter le système ou non. Deux ventilateurs permettront de refroidir les transistors et les lampes du système. On remarquera les différents organes du cahier des charges. Maintenant que la présentation globale a été effectuée. Nous allons voir comment vont se dérouler les travaux de réalisation. Le chargeur sera donc réalisé par 3 cartes électroniques. La carte PIC 16F877 La carte LCD (4 lignes, 32 caractères) raccordée au port RD (connecteur J2). La carte déchargeur raccordée aux ports A,B et C. Avant de voir l’étude du déchargeur, nous allons voir comment ce comporte les batteries. Page - 4 - sur - 38 - Modèle électrique équivalent des batteries Une batterie est un convertisseur électro-chimique. En fonction de sa constitution (valeur, surface des électrodes, dialectique, type d'électrode...) . Ces paramètres électriques sont bien évidement différents. Le modèle le plus simple est une FEM en série avec une résistance c'est le modèle d'un générateur de tension. Nous allons utiliser un modèle électrique très dépouillé de la batterie correspondant à une résistance RB (Ω) et une force électrochimique EB (V). Il faut savoir qu’en fonction de la capacité énergétique la valeur de RB et EB varie. Pour connaître ces variations, il est possible de trouver ces courbes très facilement sur internet pour chaque type d’accumulateur. Il faut savoir aussi que plus la batterie a une capacité énergétique importante est plus sa résistance interne RB sera faible. La force électrochimique EB est très facile à connaître car elle correspond à la tension de la batterie à vide. De même la résistance RB, peut être déterminée par l’équation suivante : U B moy − E B IB Équation 1: RB = Figure 1 : modèle statique d’une batterie RB IB EB UB UB=EB-RB IB Lorsque la batterie se décharge la tension UB diminue progressivement comme on peut l'apercevoir sur le graphique ci-dessous, de même pour la charge. Page - 5 - sur - 38 - Figure 2: A partir de la figure précédente, on peut en déduire la capacité énergétique et la chute de tension ∆U en fonction du courant de decharge par les calculs suivants : I (A) Temps de C= I.t Tension Energie fournie ∆U=rI décharge décharge (A.H) moyenne (Wh) r=6mΩ batterie Doc. calcul 2,5A 20H 50AH 12,8V 12,5*50=650Wh x x 20A 2H 40AH 12,4V 12,4*40=496Wh 0,4V 0,12V 50A 0,4H 20AH 12,2V 12,2*20=244Wh 0,6V 0,3V De plus lors de la décharge, la tension chute rapidement. Puis, lors de la l’arrêt de décharge, la tension remonte au bout d’un certain temps. Par conséquent, le modèle dynamique de la batterie sera le suivant. Figure 3: r2 r1 EB Équation 3: UB(p)= UB EB - (r2 + r1 ) . IB Page - 6 - sur - 38 - (1+Cr1p) (1+Cr1p On considère à T = 0, que la capacité est chargée donc, la tension aux bornes de Ub en fonction du temps correspond à l'équation suivante par une réponse indicielle de : Équation 2: Ub(t) = Eb – r2 Ib – r1 Ib (1 – ) τ = C. r1 La résistance r2 provoque une chute de tension brutale lors d'un courant constant. Par contre, r1 et C provoquent une diminution lente de la tension de sortie. Par conséquent, lors d'une décharge à courant constant, on détermine la résistance r2 : r2 = ∆ U brutal Ib On considère que la force électromotrice Eb est constante. Ub ( t = τ ) - Ub( t = 0) = -r1Ib( 1UB ) = -r1 Ib . 0,63 r1=∆ U lent Ib Ub ( t = τ )=0,63.∆ U lent IB t Il faut savoir que r1, r2 et C changent de valeur en fonction de la capacité énergétique. Ces paramètres changent en fonction du nombre de cycle de charge, de l'état des électrodes... En conclusion, il est difficile de connaître l'état de charge de la batterie en mesurant la tension en charge ou en décharge. Il n'est pas possible de connaître le bon fonctionnement d'une batterie en mesurant seulement la tension car la FEM peut être correcte à 12V mais la résistance interne étant importante dû à une oxydation donc il est impossible de la changer et le courant de décharge n'est pas celui voulu. Parfois, la capacité énergétique est inférieure à la moitié de la capacité prévue malgré une charge normale, à cause de la sulfatisation de la batterie. C’est pour cela qu’il faut un dechargeur pour vérifier l’etat des batteries. Page - 7 - sur - 38 - II)Étude de la carte déchargeur : But de la carte déchargeur : La carte déchargeur permet : – – – – – – De régler le courant de décharge De connaître la mesure du courant grâce à un capteur à effet-hall LEM HASS 50S. De connaître la tension de la batterie grâce à un comparateur et un filtre sallen-hey. De réguler le courant grâce à la commutation des résistances (lampes 50W, 20W, 10W, 5 W…) De convertir une tension 12V en 5V grâce à un convertisseur de type 7805. De régler la tension d'arrêt de décharge. La carte déchargeur utilise des lampes pour la consommation de courant et donc décharger une batterie, ces lampes possèdent une résistance (7.2Ω pour les 20W et 2.8Ω pour les 50W) donc le courant les traversant sera proportionnel à cette résistance et la tension de la batterie. Nous avons aussi choisit des résistances de décharge de 100Ω, 50Ω, 20Ω pour avoir une certaine finesse sur la consommation de courant. En effet, si nous utilisions que des lampes la finesse sur le courant serait de l'ordre de 1,7A avec nos lampes de 20W. Ainsi avec une résistance de 100Ω, nous avons une finesse de 120mA (I=U/R => 12/100=120mA) Page - 8 - sur - 38 - Schéma de câblage réalisé sous ISIS : Page - 9 - sur - 38 - Schéma de câblage réalisé sous ARES : Echelle 1: En bleu les piste coté cuivre , en rouge les pistes coté composants Nous pouvons constater que les transistors se trouvent sur le bord de la carte électronique car ces derniers seront fixés sur un radiateur pour ne pas atteindre leur température de destruction qui est de 80°C. Les pistes sont larges , en effet elle doivent supportées 30A. De plus, elles seront étamées Nous allons étudier maintenant le fonctionnement des transistors qui commutent lampes . Page - 10 - sur - 38 - Étude du transistor TIP122 : Le transistor TIP122 ne peut pas dépasser une température de 80°C et un ampérage de 5A donc nous allons faire des tests pour vérifier si ce transistor peut commuter des lampes de 50W. Pour cela, nous allons diminuer la résistance pour augmenter l'ampérage et relever la température du transistor à l'aide d'un capteur de température. Résistance 15,6 Ω 7,8 Ω 5,1 Ω 3,4 Ω 2,9 Ω 2,6 Ω Vce 0,97 V 1,05 V 1,14 V 1,23 V 1,30 V 1,37 V Ic 0,88 A 1,7 A 2,56 A 3,80 A 4,4 A 5A P calcul 0,85 W 1,78 W 2,91 W 4,94 W 5,72 W 6,85 W 49°C 52°C 62°C 65°C 69°C Température 42°C La résistance interne des lampes de 50W que nous utilisons est de 2,8 Ω et nos tests nous ont montrés que jusque 2,6 Ω le transistor fonctionné correctement. Nous pouvons donc conclure que les transistors TIP122 sont correctes pour notre système. Page - 11 - sur - 38 - Étude du convertisseur 12V-5V (7805) : Il s'agit d'un régulateur de tension linéaire sous forme de circuit intégré à trois broches. Il est très simple d'utilisation : il suffit de brancher une broche à la masse, une autre vers la tension d'alimentation (dans notre système la batterie) et on obtient en sortie une tension régulée de 5V. On ajoute également des condensateurs en entrée et en sortie servant de réservoir d'énergie, de filtrage et de découplage (diminution des composantes alternatives des tensions d'entrée et de sortie). Selon la puissance dissipée par le composant ,en fonction du courant consommé en sortie et de la chute de tension à ses bornes, il est quelquefois nécessaire de lui adjoindre un dissipateur. Structure utilisé dans le projet: Rôle des composants utilisés: F1: Protège le circuit intégré en cas de surintensité; D1: Anti-inversion de polarité, elle permet de protéger le régulateur , si la tension de la batterie est inversé. C50: réservoir d'énergie C51: réservoir d'énergie C52: réservoir d'énergie C53: réservoir d'énergie R54: limitation du courant dans la LED D54: Indique le bon fonctionnement du 7805 Page - 12 - sur - 38 - Étude de la mesure du courant: Les amplificateurs-opérationnels seront alimentés entre 0 et 5V car on l'utilisera sa sortie en analogique sur le micro contrôleur qui n'accepte que du 0-5V. Étude du comparateur Ce comparateur sert à amplifier et comparer la valeur de Vout à celle de Vref (capteur de courant à effet-hall LEM HASS-50). Puis la valeur mesurée sera ensuite convertie par le convertisseur analogique numérique du µcontrôleur afin d'avoir une valeur exploitable en programmation pour ensuite l'afficher sur le LCD. Nous avons ici un amplificateur soustracteur donc R33=R34 ; R35=R36 Donc Vs= Vout.R35 - Vref.R36 R33 Vs=K×(Vout-Vréf) avec K= R35 = 220k = 2,2 amplification de la différence de tension R33 100k Étude du filtre sallen-key: Le but du filtre sallen-key est d'éliminer tous les parasites susceptible de perturbé la mesure du courant . Fonction de transfert: Fréquence de coupure F.C= ½ ×π×RC = 160 Hz Page - 13 - sur - 38 - Étude d'un potentiomètre de consigne : Présentation : Appelé aussi "Résistance variable", et parfois Rhéostat. Le potentiomètre peut être considéré comme une résistance dont on peut faire varier la valeur ohmique entre deux points, par simple action mécanique sur un axe rotatif ou rectiligne. Nous allons prendre pour notre étude le potentiomètre de consigne de la tension d'arrêt, cependant le potentiomètre de consigne du courant fonctionne exactement de la même manière. En programmation il faut récupérer la valeur du potentiomètre grâce au port analogique/numérique du micro-contrôleur et ensuite afficher cette valeur sur le LCD. //***************************mesure de la consigne tension********************** set_adc_channel (3); delay_us(20); Uconsigne=read_adc(ADC_START_AND_READ); if (Uconsigne<80) {Uconsigne=80;} //limitation : ne peut pas être inférieur à 8V if (Uconsigne>140) {Uconsigne=140;} //limitation : ne peut pas être supérieur à 14V if (Mtension<=Uconsigne) {flagarret=1;} //arrêt si la tension de la batterie est inférieur à la consigne //***************************Affichage de U.consigne**************************** lcd_gotoxy(1,3); lcd_putc("UA="); affiche(10,Uconsigne); Page - 14 - sur - 38 - Programme du test des transistors TIP122 un par un : Pour voir si tous nos transistors fonctionnent bien nous avons fait un simple programme qui commande les résistances une après l'autre, un affichage sur LCD permettra aussi de connaître quelle résistance est commandée. x=5000; //nombre de ms //************************************************// //***** GESTION DU PORT B *************// //************************************************// for(alpha=0x01;alpha<=0x80;(alpha++)) //successivement pin B0,1,2,3,4,5,6,7 { lcd_gotoxy(1,1); switch (alpha) { case 0x01:printf(lcd_putc,"broche B0 a 1");break; case 0x02:printf(lcd_putc,"broche B1 a 1");break; case 0x04:printf(lcd_putc,"broche B2 a 1");break; case 0x08:printf(lcd_putc,"broche B3 a 1");break; case 0x10:printf(lcd_putc,"broche B4 a 1");break; case 0x20:printf(lcd_putc,"broche B5 a 1");break; case 0x40:printf(lcd_putc,"broche B6 a 1");break; case 0x80:printf(lcd_putc,"broche B7 a 1");break; default:printf("erreur");break; } output_B(alpha); //sortie pin=1 delay_ms(x); //délais de x ms alpha=(alpha*2)-1; } output_B(0); //port_B=0 //************************************************// //***** GESTION DU PORT C *************// //************************************************// for(alpha=0x01;alpha<=0x20;(alpha++)) //successivement pin C0,1,2,3,4,5 { lcd_gotoxy(1,1); switch (alpha) { case 0x01:printf(lcd_putc,"broche C0 a 1");break; case 0x02:printf(lcd_putc,"broche C1 a 1");break; case 0x04:printf(lcd_putc,"broche C2 a 1");break; case 0x08:printf(lcd_putc,"broche C3 a 1");break; case 0x10:printf(lcd_putc,"broche C4 a 1");break; case 0x20:printf(lcd_putc,"broche C5 a 1");break; default:printf("erreur");break; } output_C(alpha); //sortie pin=1 Page - 15 - sur - 38 - delay_ms(x); alpha=(alpha*2)-1; } output_C(0); //delais de x ms //port_C=0 Programme de la régulation du courant : La régulation du courant sera faite en bit à bit c'est à dire par incrémentation : #include "main.h" #include <LCD420d.C> #use fixed_io(b_outputs= PIN_B0, PIN_B1,PIN_B2,PIN_B3,PIN_B4, PIN_B5,PIN_B6,PIN_B7 ) #use fixed_io(C_outputs= PIN_C0, PIN_C1, PIN_C2,PIN_C3,PIN_C4,PIN_C5,PIN_C6,PIN_C7 ) #use fixed_io(E_outputs= PIN_E1, PIN_E2 ) unsigned int16 x,alpha,beta; void main() { setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); setup_adc_ports(AN0_AN1_AN2_AN3_AN4); setup_adc(ADC_CLOCK_INTERNAL); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); lcd_init(); enable_interrupts(INT_RTCC); enable_interrupts(GLOBAL); OUTPUT_B(0); OUTPUT_C(0); //resolution du timer0 6.4us //resolution du timer0 6.4us while(1) { x=10; //temps d'échantillonnage en ms for(alpha=0x00;alpha<=0xFF;alpha++) { output_B(alpha); delay_ms(x); } for(beta=0x01;beta<=0x3F;beta++) { output_C(beta); delay_ms(x); for(alpha=0x00;alpha<=0xFF;alpha++) { output_B(alpha); delay_ms(x); } } } //fin du programme Page - 16 - sur - 38 - Par simulation on obtient la courbe suivante : On voit bien que la courbe n'est pas linéaire, car l'incrémentation de alpha provoque une augmentation du nombre de résistances à commuter, donc une augmentation du courant. Mais par exemple lorsque alpha=0x0F (4 résistances sont commutées) et passe ensuite à 0x10, une seule résistance est commutée à présent, il y a donc moins de courant. Il faudra donc passer de 0x0F à non pas 0x10 mais à une valeur plus grand, c'est ce que nous allons voir dans le programme de linéarisation de la régulation en courant. Page - 17 - sur - 38 - Programme de linéarisation de la régulation du courant: La linéarité de la régulation a était faite en simulation en mode pas à pas avec le logiciel ISIS, pour nous aider à choisir de quelle à quelle valeur de alpha nous incrémentons pour ne pas obtenir une diminution de courant entre les commutations. while(1) { if (alpha==0xFF){alpha=0xFE;} if (beta==0x3F) {beta =0x3F;} alpha++; if (alpha==0x0F){alpha=0x13;} if (alpha==0x1F){alpha=0x24;} if (alpha==0x2F){alpha=0x33;} if (alpha==0x3F){alpha=0x59;} if (alpha==0x5F){alpha=0x65;} if (alpha==0x6F){alpha=0x73;} if (alpha==0x7F){alpha=0xD8;} if (alpha==0xDF){alpha=0xE4;} if (alpha==0xEF){alpha=0xF3;} if ((alpha==0xFF)&&(beta==0x00)) { alpha=0xD8; beta=0x01; } if ((alpha==0xFF)&&(beta==0x01)) { alpha=0xD9; beta=0x03; } if ((alpha==0xFF)&&(beta==0x03)) { alpha=0xED; beta=0x07; } if ((alpha==0xFF)&&(beta==0x07)) { alpha=0xF3; beta=0x17; } if ((alpha==0xFF)&&(beta==0x17)) { alpha=0xEE; beta=0x1F; } if ((alpha==0xFF)&&(beta==0x1F)) { alpha=0xEE; beta=0x3F; } output_B(alpha); output_C(beta); } Page - 18 - sur - 38 - On obtient, donc le graphique suivant par simulation, qui est linéaire à présent. Programme final de la carte déchargeur : #include "chargeur.h" //#include <LCD.C> #include <LCD420d.C> //#SEPARATE block de memoire de 2kilo #org 0x1F00, 0x1FFF void loader16F877(void) {} //for the 8k 16F876/7 /* port B,C en sortie */ #use fixed_io(b_outputs= PIN_B0, PIN_B1,PIN_B2,PIN_B3,PIN_B4, PIN_B5,PIN_B6,PIN_B7 ) #use fixed_io(C_outputs= PIN_C0, PIN_C1, PIN_C2,PIN_C3,PIN_C4,PIN_C5 ) //#use fixed_io(C_inputs= PIN_C6, PIN_C7) //liaison RS232 unsigned int16 Mcourant; // valeur du convertisseur analogique unsigned int8 Mtension; // valeur du convertisseur analogique unsigned int8 Iconsigne; unsigned int8 Uconsigne; unsigned int16 tempsregule; unsigned int8 dixiemetension; unsigned int8 MtensionDec; unsigned int8 DivT; unsigned int8 alpha,beta; //écrire sur le port B et C unsigned int8 flagarret; unsigned int8 flagD3; Page - 19 - sur - 38 - unsigned int16 counter1; unsigned int8 heure; unsigned int8 minute; unsigned int8 seconde; unsigned int16 dixiemeseconde; unsigned int32 capacite; unsigned int32 capaciteAH; unsigned int32 dixcapaciteAH; const int32 capamax=6000000; //48AH=172800AS*6= #locate alpha=0x06 // table map port B=adress 06h et portc 07h //****************************************************************************** //****************************************************************************** //***************** Interruption toutes les 1 ms ************************************** //****************************************************************************** //****************************************************************************** #int_RTCC // timer0 8bit à 1ms RTCC_isr() { set_timer0(99); //256-(1ms/(0.2us*32))=99 pour 1ms if (flagarret==1) //****Arret du systeme******* { alpha=0x00; beta=0x00; output_B(alpha); output_C(beta); } else { tempsregule++; //tempsregule + 1ms if(tempsregule>=10) // 10=10 ms Temps d'echantillonage { tempsregule=0; //remise à 0 de tempsregule dixiemeseconde=dixiemeseconde++; if (flagD3==1) { alpha=0x00; beta=0x00; output_B(alpha); output_C(beta); } else { //*******régule du courant ********************* if (Mcourant<Iconsigne) { if (alpha==0xFF){alpha=0xFE;} if (beta==0x3F) {beta =0x3F;} alpha++; if (alpha==0x0F){alpha=0x13;} if (alpha==0x1F){alpha=0x24;} Page - 20 - sur - 38 - if (alpha==0x2F){alpha=0x33;} if (alpha==0x3F){alpha=0x59;} if (alpha==0x5F){alpha=0x65;} if (alpha==0x6F){alpha=0x73;} if (alpha==0x7F){alpha=0xD8;} if (alpha==0xDF){alpha=0xE4;} if (alpha==0xEF){alpha=0xF3;} if ((alpha==0xFF)&&(beta==0x00)) { alpha=0xD8; beta=0x01; } if ((alpha==0xFF)&&(beta==0x01)) { alpha=0xD9; beta=0x03; } if ((alpha==0xFF)&&(beta==0x03)) { alpha=0xED; beta=0x07; } if ((alpha==0xFF)&&(beta==0x07)) { alpha=0xF3; beta=0x17; } if ((alpha==0xFF)&&(beta==0x17)) { alpha=0xEE; beta=0x1F; } if ((alpha==0xFF)&&(beta==0x1F)) { alpha=0xEE; beta=0x3F; } output_B(alpha); output_C(beta); } if (Mcourant>Iconsigne) { if ((alpha<=0x04)&&(beta<=0x00)) { output_B(0x00); output_C(0x00); } else { alpha--; if (alpha==0x00) {beta--;} output_B(alpha); Page - 21 - sur - 38 - output_C(beta); } } } }//fin temps regule } //fin else flag arret //*******Faire toutes les secondes (horloge digital h\m\s)************ counter1++; if ((counter1>1000)) // compteur 1ms*100O= 1s { counter1=0; if (Mcourant>=5) {seconde++;} //valeur courant 0.83 A //coef=6 if (seconde>=59) {seconde=0; minute++;} if (minute>=59) {minute=0; heure++;} capacite=capacite+Mcourant; if (capacite>=capamax) capacite=capamax; //saturation de la capacité } //fin counter1 } //fin de l'interruption //****************************************************************************** //****************************************************************************** //***************** fonction affichage ********************************************* //****************************************************************************** //****************************************************************************** void affiche(unsigned int8 divT,unsigned int16 variable) { MtensionDec=variable/divT; //division par 10 dixiemetension=(variable-MtensionDec*divT); dixiemetension=dixiemetension*10 ; dixiemetension=dixiemetension/divT; printf(lcd_putc,"%02u",MtensionDEC); lcd_putc("."); printf(lcd_putc,"%1u",dixiemetension); } void main() { setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); //resolution du timer0 6.4us setup_adc_ports(AN0_AN1_AN2_AN3_AN4); setup_adc(ADC_CLOCK_INTERNAL); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); //resolution du timer0 6.4us lcd_init(); Page - 22 - sur - 38 - enable_interrupts(INT_RTCC); enable_interrupts(GLOBAL); OUTPUT_B(0x00); OUTPUT_C(0x00); alpha=0x00; beta=0x00; flagarret=0; Iconsigne=0; //limitation pour 1 A heure=0; minute=0; seconde=0; dixiemeseconde=0; capacite=0; flagD3=1; //****************************************************************************** //****************************************************************************** //*************************** Programme Principale ******************************** //****************************************************************************** //****************************************************************************** while(1) { if (input(PIN_D3)==0) //appui sur le bouton poussoir { if (flagD3==1) {flagD3=0;} //changer l'état du flagD3 else {flagD3=1;} delay_ms(100); } //**************************mesure tension batterie **************************** set_adc_channel (0); delay_us(20); Mtension=read_adc(ADC_START_AND_READ); //**************************Affichage U batterie******************************** lcd_gotoxy(1,2); lcd_putc("U="); affiche(10, Mtension); //***************************mesure de la consigne tension********************** set_adc_channel (3); delay_us(20); Uconsigne=read_adc(ADC_START_AND_READ); if (Uconsigne<80) {Uconsigne=80;} //limitation : ne peut être inférieur a 8V if (Uconsigne>140) {Uconsigne=140;} //limitation à 14V if (Mtension<=Uconsigne) {flagarret=1;} //arrêt si la tension de la batterie est inférieur à la consigne //***************************Affichage de U.consigne**************************** lcd_gotoxy(1,3); lcd_putc("UA="); affiche(10,Uconsigne); Page - 23 - sur - 38 - //Iconsigne=0 if (flagarret==0) { //***************************Affichage de la durée ***************************** lcd_gotoxy(1,4); lcd_putc("Duree="); lcd_gotoxy(9,4); printf(lcd_putc,"%02u",heure ); printf(lcd_putc,"h"); printf(lcd_putc,"%02u" ,minute ); printf(lcd_putc,"m"); printf(lcd_putc,"%02u",seconde); printf(lcd_putc,"s"); //***************************mesure de la consigne courant********************** set_adc_channel (2); delay_us(20); Iconsigne=read_adc(ADC_START_AND_READ); if (Iconsigne>180) {Iconsigne=180;} //limitation à 30 Ampères } else { ICONSIGNE=0;} //***************************Affichage de I.consigne**************************** lcd_gotoxy(1,1); lcd_putc("I.CONSIGNE ="); affiche(6,Iconsigne); //division par 6 //***************************Mesure courant batterie**************************** set_adc_channel (1); delay_us(20); MCourant=read_adc(ADC_START_AND_READ); //***************************Affichage de I batterie**************************** lcd_gotoxy(10,2); //R=0.135 6 tour ampli de 1.8 lcd_putc("I ="); affiche(6,Mcourant); //division par 6 //***************************affichage capacité énergétique********************* lcd_gotoxy(10,3); lcd_putc("C ="); capaciteAH=capacite/21600; // 3600*divT=3600*6=21600 dixcapaciteAH=(capacite-capaciteAH*21600); dixcapaciteAH=(dixcapaciteAH*10)/21600; printf(lcd_putc,"%02Lu",capaciteAH); lcd_putc("."); printf(lcd_putc,"%1Lu",dixcapaciteAH); } //while(1) } //main Page - 24 - sur - 38 - Schéma de simulation réaliser sous ISIS: Voici le schéma de câblage qui nous a permis de simuler tous les tests que l'on avait besoin . Page - 25 - sur - 38 - III ) La carte micro contrôleur avec le PIC 16F877 : But de la carte micro contrôleur : La carte micro-contrôleur est un élément indispensable au bon fonctionnement de notre système . En effet , nous utilisons un afficheur LCD gérer grâce au port D du micro-contrôleur , La régulation de notre courant de décharge se fera grâce aux ports B et C . Notre courant et tension de consigne pour le système seront seront traités par le Port A grâce à deux potentiomètres, ce port comprend un convertisseur analogique numérique qui permet de convertir la valeur mesuré en valeur décimal compatible avec l'écran LCD. Bien évidement , nous utiliserons de la programmation en langage C grâce au logiciel CCS (lien) et ce programme sera implanté dans la carte micro a l'aide d'une liaison RS232. Page - 26 - sur - 38 - Schéma de câblage réalisé sous ISIS : Page - 27 - sur - 38 - Schéma de câblage réalisé sous ARES : Schéma ISIS du micro contrôleur 16F877 seul : Nous utiliserons l'intégralité des ports du µcontrôleur pour notre système, donc nous allons voir comment sont utilisées chacune des entrées et sorties qu'elles soient analogique ou numérique. Page - 28 - sur - 38 - Liste des entrées-sorties du micro contrôleur : PORT A: Broche A0=Mesure Tension de la batterie Broche A1=Mesure Courant de la batterie Broche A2=Mesure de la consigne de courant Broche A3=Mesure de la consigne de la tension d'arrêt du système PORT B : Les broches B0,1,2,3,4,5,6,7 sont utilisées pour commander les transistors Q1,2,3,4,5,6,7;8 PORT C: Les broches C0,1,2,3,4,5 sont utilisées pour commander les transistors Q9,10,11,12,13,14 Les broches C6 et C7 ne sont pas utilisées dans notre système car elles servent en réception et transmission de données qui ne sont pas utilisées dans notre système. PORT D: Broche D0= Entrée E de l'afficheur LCD Broche D1= Entrée RS de l'afficheur LCD Broche D2= Entrée RW de l'afficheur LCD Broche D3= Bouton poussoir (pause système) Broche D4= Entrée D4 de l'afficheur LCD Broche D5= Entrée D5 de l'afficheur LCD Broche D6= Entrée D6 de l'afficheur LCD Broche D7= Entrée D7 de l'afficheur LCD Page - 29 - sur - 38 - Pour le bon fonctionnement de notre système, le PIC a besoin d'être configurer correctement à l'aide d'un programme en langage C qui est compiler grâce au logiciel CCS . Nous allons donc voir comment créer notre projet correctement. Lancer le logiciel CCS, puis dans le logiciel faire «clique img dossier / New / Project Wizard», Enregistrer votre projet dans un dossier de votre choix. Une fois fait une fenêtre apparaitra pour la configuration du PIC veuillez configurer comme suit . Dans général choisir PIC16F877 Comme on peut le voir sur le schéma électrique du PIC, le quartz est à 20 MHz. Donc écrire cette fréquence et choisir (higt speed oscilator > 4MHz) Page - 30 - sur - 38 - Dans communication On configurera la liaison RS232 (série) en 8 bits, sans parité à 19200 bauds pour pouvoir charger le programme dans le PIC avec une simple liaison série. En effet, on peut apercevoir sur le schéma électrique du PIC le circuit MAX 232 qui permet de faire une liaison série. Cette liaison permettra de télécharger votre programme avec le programme PICdownloader.exe. Le PIC16F877 a déjà un programme interne installé par le professeur avec "PIC START plus" et "MPLAB IDE" qui permet de gérer la liaison série. Mais, pour cela il ne faut jamais écraser le programme de la liaison série interne. Donc, il faut rajouter dans votre programme la ligne suivante : #org 0x1F00, 0x1FFF void loader16F877(void) {} //for the 8k 16F876/7 Page - 31 - sur - 38 - Dans analog – on a besoin de 4 entrées analogiques. Donc, on choisira (A0, A1, A2, A3,A5) mais nous n'utiliserons pas la broche A5, la résolution se fera en 255 bits Dans interrupts: -Timer0 avec résolution de 6,4µs pour un dépassement max de 1,6ms, choisit pour la période d'échantillonage de 1ms. Page - 32 - sur - 38 - Pour l’afficheur (4 lignes, 20 caractères), il faut le programme LCD420.h mais celui-ci demande d’utiliser le port b, donc il faut modifier le programme pour qu’il fonctionne sur le port d. Ceci fait il faut maintenant taper les lignes de programme. Lorsque le programme sera terminer il faudra l'envoyer dans le micro contrôleur comme suit : - Brancher le micro contrôleur, au PC avec un câble série RS232, La carte micro sera alimenté par le 7805 de notre carte déchargeur grâce aux ports qui sont alimentés, Lancer PIC downloader avec votre fichier.hex, cliquer sur WRITE et appuyer sur la touche reset pour télécharger le programme dans la mémoire flash du PIC. Page - 33 - sur - 38 - IV) La carte afficheur LCD et bouton poussoir : Non utilisées bouton pause/reprise système But de la carte afficheur L'afficheur LCD permet de contrôler visuellement toutes les informations du système, il comporte les mesures de courant et tension de la batterie ainsi que les consignes courant et tension que nous lui imposons, la capacité énergétique de la batterie élément le plus important de ce testeur et enfin un système de « montre » pour compter le temps et ainsi voir très facilement depuis combien de temps fonctionne le système. Il sera également équipé d'un bouton poussoir qui permettra à tous moment de stopper la décharge de la batterie tous en gardant les informations sur l'afficheur LCD, la décharge reprendra lors d'un deuxième appuis sur ce même bouton poussoir, lorsque le système est en pause le temps est lui aussi en pause ce qui permet vraiment de ne compter que le temps de décharge de la batterie. Schéma de câblage de la carte afficheur réalisé sous ISIS Page - 34 - sur - 38 - Schéma de câblage de la carte afficheur réalisé sous ARES Études du bouton poussoir BP4 : La broche D3 est relié comme on peut le voir sur le schéma ci-dessus au bouton poussoir BP4. Initialement la broche D3 est relié au +5V avec la résistance R20 mais lors de l'appui sur ce bouton Page - 35 - sur - 38 - poussoir RP4 la broche D3 est relié à la masse et est donc à 0V. C'est ce passage de 1 à 0 logique que nous voulons détecter grâce au micro-contrôleur. Programme pour le bouton-poussoir BP4 : Détection de l'appui sur le bouton poussoir : while(1) { if (input(PIN_D3)==0) { if (flagD3==1) {flagD3=0;} else {flagD3=1;} delay_ms(100); } } //appui sur le bouton poussoir //changer l'état du flagD3 On utilise ensuite ce flagD3 dans l'interruption pour soit arrêter le système soit pour faire la régulation. if (flagD3==1) { alpha=0x00; beta=0x00; output_B(alpha); output_C(beta); } else { Faire la régulation... } Par ailleurs le flagD3 sera initialisé à «1» pour que le système soit d'origine en pause. Conclusion : Grâce à un simple bouton poussoir et quelques lignes de code nous arrivons à mettre le système en pause. Page - 36 - sur - 38 - Conclusion du déchargeur à lampe : – Ce déchargeur nous permet de tester la capacité énergétique de nos batteries (scooter, karting …) et de vérifier leur bon fonctionnement. – Avec le système, tous les ports du micro-contrôleur PIC16F877 sont utilisés avec les 14 résistances à commuter. – On pourrait utiliser un multiplexeur 4 entrées et 16 sorties et donc augmenter le nombre de résistance à commuter pour plus de courant. Par ailleurs utiliser un autre micro-contrôleur comme le PIC18F6520 qui possède plus de ports. Mais à la place d’utiliser des lampes, on pourrait utiliser des ventilateurs de voitures que l’on a récupérer à la casse auto. Il est plus facile de faire varier la charge électrique car elle dépend de la vitesse de rotation du moteur. Page - 37 - sur - 38 - En effet, les ventilateurs de voiture consomment des courants important ; 17A. Pour faire varier la puissance, il suffit de modifier la tension aux bornes du moteur DC du ventilateur, de ce fait il va moins vite donc consomme moins de courant. La tension est facilement modulable par l'intermédiaire d'un hacheur abaisseur et d'une PWM qui fera varier le rapport cyclique. La consigne de courant est réglable par l'intermédiaire de 2 boutons poussoirs, par ailleurs comme sur le déchargeur à lampe une consigne de tension d'arrêt serait indispensable pour ne pas endommager la batterie. Pour avoir plus de courant de décharge (supérieur à 17A), il suffit de mettre plusieurs ventilateurs. Deux ventilateurs permettront de décharger jusque 34A. Le schéma fonctionnel ressemble au déchargeur à lampe Mesure courant Batterie à décharger Ventilateur 1 Hacheur Boutons poussoir Select -incrémentation -décrémentation µ-contrôleur Ventilateur 2 Mesure tension Buzzer Affichage L’avantage du déchargeur à ventilateur, c’est donc sa simplicité pour réguler le courant. L’inconvénient c’est le bruit des ventilateurs. Mais, dans le déchargeur à lampes, il a fallu placer 2 ventilateurs pour évacuer la chaleur des lampes. Mais la réalisation du déchargeur à ventilateur sera une autre histoire. Page - 38 - sur - 38 -