Naudot guillaume TEL2 Lycée Pierre-Emile-Martin Académie Orléans-Tours 1 PRESENTATION DU TRAVAIL 3 I) ANALYSE FONCTIONNEL 4 I-1) Schéma fonctionnel de niveau 1 : I-2) Schéma fonctionnel de 1er degrés : I-3) Schéma fonctionnel de degrés 2 : I-4) Description des fonctions secondaires : II) ANALYSE STRUCTURELLE : II-1) Calcul de RA1 : II-2) Etude de la chaîne d’acquisition (théorique) : III) ANALYSE DU LOGICIEL : III-1) Description du programme : III-2) Fonctionnement du programme : III-3) Algorithme du programme : 4 4 5 7 8 8 8 11 11 11 12 IV) MISE EN ŒUVRE, TESTS ET REGLAGES 13 ANNEX : listing commenté du programme : 16 2 PRESENTATION DU TRAVAIL Le thème de cette année est une attelle de rééducation de la hanche. Utilisée en médecine, elle permet d’aider à la reconsolidation des muscles par un système de flexion et d’extension programmable. Notre carte à pour but de mesurer et limiter le courant moteur : en cas de contrainte sur l’attelle, pour la sécurité du patient comme celle de l’appareil, il faut arrêter le système et prévenir de la défaillance en cas de surintensité. Le cœur de la carte est un microcontrôleur ATMEL 90s8535 qui permet de paramétrer la valeur du seuil ainsi que l’affichage de l’intensité en temps réel. Le capteur utilisé est un CSLACD qui permet de convertir en tension des courants pouvant aller de -36A à +36A (dans notre cas nous utiliserons un plage d’environ [0 ;5A]). Nous pourrons ainsi convertir le courant moteur en une tension exploitable par le microcontrôleur et donc afficher la valeur de l’intensité. La sensibilité du capteur fourni pas le constructeur est de 32.7mVxN pour 8Vcc. Nous utilisons un capteur munit de 10 Spires et d’un Vcc de 12V. La sensibilitée devrai être de 490mV/A. dans le dossier technique de l’attelle, il nous est donné une sensibilité de 0.552V/A avec un décalage de +6V. Nos calculs seront donc effectué grâce à cette dernière valeur. La fonction désirée étant de 1V/A, nous allons utiliser un réseau d’ADI afin de supprimer le décalage puis d’amplifier pour obtenir la bonne sensibilité de 1V/A. VCAPT +12V Courbe réelle. +6V 0 VCOUR-ANA +2,5A 5A IMOT +5V Courbe souhaité. +2,5V 0 +2,5A 5A IMOT 3 I) ANALYSE FONCTIONELLE. I.1) Schéma fonctionnel de niveau 1 Affichage du Courant moteur courant moteur I-mot Mesure et affichage du courant moteur Alarme de surintensité Schéma fonctionnel présentent ensemble de la maquette. I.2) Schéma fonctionnel de 1er degré I-mot Captage et mise en forme du courant moteur FP5 Alarme de Cour-ana Traitement et memorosation FP1 LCD BUZ S2 Acquisition des consignes Informations visuelles et sonores FP2 surintensité Affichage LCD Schéma fonctionnel de degrés 1, présentent les fonctions principales de notre carte, ainsi que les différents signaux d’entrées et de sortie. 4 I.3) Schéma fonctionnel de degrés 2. Création d’une tension continue : 6V Vdecal I-mot Conversion courant tension FS 51 Vcapt Décalage FS 52 Vimg-cour Filtrage et amplification Vimg-cour-amp FS 53 Ce schéma de degrés 2 représente l’ensemble des fonctions secondaires de la fonction principal. Cette fonction étant la plus importante : le reste se déroulant dans le CAN sous la forme d’un programme Cette photo montre la carte que nous avons fabriqué, avec les différents composant qui la consiste. Sur la page suivante, un schéma montrant les fonctions secondaires de la carte et les composants utilisés. 5 +12v C10 100nF +12v 8 U3B 6 7 PT2 R1 100k R4 3,9k 5 P1 10K 4 TL082 +12v 0 8 100nF C16 -12v PT3 U3A R2 2 DECAL 100k 1 +5v R15 3 JP1 100k TL082 Capt 4 1 2 3 4 5 6 7 8 9 10 R3 100k -12v IMG_COUR he10-10 +5v 0 +5v +5v 30 32 AVCC PORTA PA0(ADC0) PA1(ADC1) PA2(ADC2) PA3(ADC3) PA4(ADC4) PA5(ADC5) PA6(ADC6) PA7(ADC7) 40 39 38 37 36 35 34 33 D7 PT6 11 PT1 S2 +5v PC0 PC1 PC2 PC3 PC4 PC5 PC6(T OSC1) PC7(T OSC2) AGND PORTC (RXD)PD0 (T XD)PD1 (INT 0)PD2 (INT 1)PD3 (OC1B)PD4 (OC1A)PD5 (ICP)PD6 PD7(OC2) 22 23 24 25 26 27 28 29 31 R7 10k XT AL1 PORTD C6 22pF P4 10K R13 D8 2 1 U1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 VSS VDD VO RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 A K R11 3 10k TL082 R9 10K 0 + 100nF C18 -12v LCD 2X16 C7 10uF 470 +12V 0 4.7K 470 D9 VccP +ALIM + BU1 buzzer 1 1N4001 ALIM + 12V CA1 IN 330nF GND ALIM 12V +5V UA1 LM7805C DA1 OUT 3 + R14 Q1 GND R12 2 0 14 15 16 17 18 19 20 21 U4A +5V XT AL2 PT4 C17 100nF C8 10uF +5V RESET / GND 13 P2 20K PT5 IMG-COUR-AMP +12v D6 1N4148 X1 4MHz +5v R10 10K 1N4148 COUR-ANA 8 9 12 (T 0)PB0 (T 1)PB1 (AIN0)PB2 (AIN1)PB3 (SS/)PB4 (MOSI)PB5 (MISO)PB6 (SCK)PB7 0 4 C5 22pF 0 +5v C1 10uF + 1 2 3 4 5 6 7 8 AREF 10 C9 1u C15 100nF + VCC S1 U2 at90s8535 PORTB R5 4,7K + D1 1N4148 P3 10K ANA_TEST C11 100nF CA2 100nF CA7 10u RA1 LEDA1 1N4001 -ALIM VccN DA2 -12V E. BRANLY 29 rue F. KENNEDY 28100 DREUX Auteur : RB-MM ATTELLE DE REEDUCATION CARTE N°2 Date : 29 /09 / 04 version: Page 1 1 of 1 6 I.4) Description des fonctions secondaires. FS5.1 : conversion courant tension Cette fonction, réalisée par le capteur à effet HALL, permet de transformer un courant en une tension exploitable pour faire des mesures. Sa fonction est Vcapt=0.552Imot +6V FS5.2 : Soustracteur Cette fonction permet de supprimer le décalage du capteur en soustrayant 6V à la tension du capteur. La tension d’entrée : Vcapt, ayant pour fonction : Vcapt=0.552I-mot+6. Cette fonction permet de donner la fonction : Vimg-cour=0.552I-mot. FS5.3 : a) amplification Cette fonction permet d’amplifier le signal Vimg-cour pour donner un signal Vimg-cour-amp=1V/A b) Filtrage Différents filtres passe bas sont implantés pour filtrer les bruits du circuit. Deux diode de protection D5 et D6 ont été implantées pour ne pas endommager le microcontrôleur : l’une (D5) relier au +5V permet de supprimer les valeurs dépassant 5V plus la tension de seuil de la diode d’environ 0.6V, ce qui limite les valeur à 5.6V. Et l’autre (D6) relier à la masse pour supprimer les valeurs négatives. En tenant compte la tension de seuil de 0.6V, les deux diodes maintiennent le circuit dans la plage de valeurs [-0.6V ; 5.6V]. 7 II) ANALYSE STRUCTURELLE : Voir plan page précédente pour repérage des composants et des fonctions. II.1) Calcul de RA1. Sur notre carte, seul la résistance d’alimentation était à calculer. RA1=U/I I=20mA : courant de seuil de la diode U=5V : tension d’alimentation RA1=250Ω II.2) Etude la chaîne d’acquisition (théorique): L’équation de la droite Vcapt en fonction de I mot est : Vcapt = 0.552 I-mot + 6 Le but ici, est de supprimer le décalage de 6V.Pour cela on créer une tension de 6V avec P1 et un suiveur, ensuite on applique cette tension à l’entrée d’un soustracteur pour qu’il annule le décalage. Vdecal en fonction P1 : Vcc P1 P1 R 4 12 10 Vdecal 10 3.9 Vdecal Pour α=0, on a Vdecal=0V. Pour α=1, on a Vdecal=120/13.9=8.633V. La tension Vdecal peut donc varier sur la plage de valeurs [0V ; 8.633V] Pour le soustracteur on a : -Vcapt sur l’entrée non-inverseuse et vdecal sur l’entrée inverseuse. -Vimg-cour en sortie -VI=Vimg-cour 8 Vcapt R3 R3 R15 Vecal R1 VI R 2 V R1 R 2 R1 R 2 Vcapt R3( R1 R 2) Vdecal R1 R 3 R 15 VI R2 V En constatant que R1=R2=R3=R15 On simplifie l’expression suivante et on obtient celle-ci : VI = Vcapt – Vdecal Avec Vdecal=6V, l’on obtient les courbes suivantes : Décalage 10 Tension (V) 8 Vcapt (V) Vdecal (V) VI (V) 6 4 2 0 0 1 2 3 intensitée (A) 4 5 Réglage de P2 : VIFA = Vimg-cour-amp V+ = VI VIFA P 2 P 2 R 9 VIFA P 2 VI P 2 [( Vdecal R1 Vcapt R3) ( R 2 R1)] P 2 R9 R 1 R 2 R 5 R 15 VIFA R2 P 2 V 9 Les courbes que nous souhaitons obtenir sont les suivantes : 10 9 8 7 6 5 4 3 2 1 0 Vcapt (V) Vdecal (V) Vimg-Cour (V) Vimg-Cour-Amp (V) 0 1 2 3 4 5 On désire obtenir VIFA = 0V lorsqu’on a Imot = 0A. Que valent VI et Vdecal ? VI doit être égal à 0 et Vdecal = Vcapt On veut pour un courant égal à 5A avoir VIFA = 5V. Calcule de αP2 : Si I-mot=5A, VI=0.552*5=2.76 V- =VI R9 P 2 R 9 20 10 VIFA 2.76 10 V VIFA Pour α = 0 VIFA = 2.76V Pour α = 1 VIFA = 8.28V Dans notre cas, pour avoir une sensibilité de 1V/A, α doit être réglé à 0.406 α=0.406 10 III) ANALYSE DU LOGICIEL III.1) Description du programme. Notre programme à pour but de relever deux valeur et de les afficher sur un afficheur LCD à 2lignes. La première est une valeur test réglable par un potentiomètre de 0 à 5V. La deuxième valeur étant le courant mesuré par le capteur et étalonné par la chaîne de mesure (expliquer pages précédentes). Cette valeur test va servir à créer une alarme pour le courant mesuré. En réglant une valeur avec le potentiomètre P3, valeur afficheur sur l’afficheur LCD en temps réel, le programme pourra ensuite la comparer avec celle du capteur, et ainsi s’en servir comme seuil d’alarme réglable. Une foie le seuil dépassé, une alarme sonore retentie. III.2) Fonctionnement du programme. Une foie la mise sous tension, l’afficheur LCD indique le message : « Capteur de courant » « Appuie sur S2 » En appuyant sur S2, l’afficheur indique « Test = *,**A » les *,** étant la valeur seuil « Appuie sur S2 » La led8, situé sur la même ligne que celle de l’afficheur pour Test, s’allume en même temps. Ceci indique que l’on peut régler la valeur seuil avec le potentiomètre P3, faisant donc varier la valeur seuil qui allumera le buzzer si le courant moteur la dépasse. En appuyant de nouveaux sur S2, l’afficheur indique : « Test = *,**A » *,** étant la valeur seuil réglé précédemment. « Imot = *,**A » *,** étant la valeur du courant mesuré par le capteur. La led9, situé sur la même ligne que Imot, s’allume en même temps, indiquant que l’on peut voir varier le courant moteur en temps réel. Il faut appuyer de nouveaux sur S2 pour retourner au réglage du seuil, celui-ci ne variant pas si ça voie est sélectionné. Si Imot dépasse la valeur Test affiché, le buzzer sonnera. 11 III.3) algorithme du programme. Début Initialisation µc Initialisation LCD Affichage d’un message à la mise sous tension Attendre appui sur S2 S2 Appuyé ? Oui Complémenter variable bascule. non Oui Imot > seuil Attendre 200 mS non S2 Appuyé ? Eteindre buzzer Allumer buzzer Oui non Variable Bascule=0 Oui non Allumer led8 Eteindre led9 Choisir la voie ADMUX=0x03 et relever sa valeur Faire calcul de Imot par rapport à ADMUX Afficher «imot=0.00A » puis mettre la valeur de imot calculé Allumer led8 Eteindre led9 Choisir la voie ADMUX=0x00 et relever sa valeur Faire calcul de seuil par rapport à ADMUX Afficher «Test=0.00A » puis mettre la valeur de seuil calculé Attendre 200 mS Attendre 200 mS 12 IV) MISE EN ŒUVRE, TESTS ET REGLAGES. Dans cette partie, nous allons mettre en pratique les calculs théoriques de la partie II. Pour cela, nous avons branché la maquette et relever les valeurs des différentes partis de la carte. Sur cette photo, nous pouvons voir les différents branchements des alims. L’alims de gauche sert à l’alimentation en +12V et 12V. L’alim de droite sert à créer un courant dans le capteur. Nous les avons brancher en parallèle de façon à additionner leurs courant max qui est de 2.5A, ce qui nous fait un courant réglable et 0A à +5A. Le multimètre en position ampèremètre, contrôle le si l’affichage de notre carte est bien égale au courant réel dans le capteur. Ici, nous pouvons voir le chéma de notre chaine de mesure et la place des point tests ainsi que des potentiomêtres. + 12v C10 100nF 8 + 5v D7 6 R10 10K 1N4148 P2 20K PT5 IMG-COUR-AMP 7 + 4 TL082 8 + 12v 8 2 R11 3 -12v C7 10uF DECAL R15 3 100k TL082 4 + 100nF C18 R9 10K 100nF C16 -12v R2 100k 1 10k TL082 0 PT3 U3A 2 PT4 P1 10K 0 U4A 1 R4 3,9k 5 C17 100nF C8 10uF PT2 R1 100k + 12v 4 PT6 COUR-ANA D6 1N4148 + 12v U3B Capt R3 100k -12v 13 PT2 = Vdecal avant isolation PT3 = Vdecal PT4 = Vimg-cours = VI PT5 = Vimg-cours-amps = VIFA PT6 = VIFA + filtrage. Nous commençons par ajuster les limites de l’alim à 0A afin de pourvoir amplifier une tension avec une equation passant par 0. Nous réglons le potentiomètre P1 affin d’avoir de créer une tension de 6V (relevé sur PT3), puis de la soustraire à celle du capteur et supprimer son décalage de 6V. Sa sensibilité est toujours de 0.552V/A mais cette foie, sans décalages. Nous mesurons cette valeur sur PT4 Nous rebranchons le capteur à la 2nd alim afin de lui fournir un courant et nous le réglons à 4A. L’afficheur de la carte étant limité à 5A, nous le mettons à 4 pour être sur de ne pas avoir un affichage qui devrait être supérieur à 5. Nous réglons ensuite P2 pour avoir la bonne sensibilité de 1V/A, donc 4V pour 4A 14 Une foie l’étalonnage de la carte effectué, nous relevons les valeurs de chaque tension de 0A à 5A tout les 0.5A. Ce qui nous donne le tableau suivant : Imot (A) Vcapt(V) Vdecal(V) VI(V) VIFA(V) 0 6.03 6.03 0 0 0.5 1 1.5 6.28 6.54 6.79 6.03 6.03 6.03 0.252 0.516 0.773 0.5 1.01 1.5 2 7.05 6.03 1.02 2 2.5 7.3 6.03 1.27 2.49 3 7.56 6.03 1.53 3 3.5 7.82 6.03 1.79 3.49 3 7.656 6 1.656 3 3.5 7.932 6 1.932 3.5 4 8.07 6.03 2.04 4.01 4.5 8.33 6.03 2.3 4.48 5 8.6 6.03 2.57 5.01 Les valeurs théoriques étant : Imot (A) Vcapt(V) Vdecal(V) VI(V) VIFA(V) 0 6 6 0 0 0.5 6.276 6 0.276 0.5 1 6.552 6 0.552 1 1.5 6.828 6 0.828 1.5 2 7.104 6 1.104 2 2.5 7.38 6 1.38 2.5 4 8.208 6 2.208 4 4.5 8.484 6 2.484 4.5 5 8.76 6 2.76 5 En pratique, nous ne somme pas loin des valeurs théoriques, ce qui veut dire que la carte fonctionne correctement et que les potentiomètres ont été bien réglés. 15 ANNEX 1 // Nom : Naudot Guillaume // Titre : carte 2 : mesure et limitation du courant moteur // Année 2005 #include <mega8535.h> // Microcontrôleur mega8535 #asm .equ __lcd_port=0x15 #endasm #include <lcd.h> #include <delay.h> #include <stdlib.h> // Entrer les différents registres. // Définition des registres d’entrée, de sortie et les port utilisé pour les variables // de comptages #define debutconv ADCSRA.6 #define finconv ADCSRA.4 #define buzzer PORTD.0 #define led8 PORTD.2 #define led9 PORTD.1 #define s2 PIND.7 float seuil; char *seuil_str="0.00"; // seuil devient un nombre fotant // seuil_str devient la chaîne de caractère 0.00 float imot; char *imot_str="0.00"; bit bascule; // bascule devient un nombre binaire : 0 ou 1 // Initialisation des différents registre d’entrés, sortie void init_ports(void) { // Entré de mesure du microcontrôleur : bit placé à 0 0 DDRA = 0x00; PORTA = 0x00; PA7 0 PA6 0 0 PA5 0 PA4 0 PA3 0 PA2 0 PA1 0 PA0 0 16 // Sortie pour l’afficheur LCD : bit placé à 1 F DDRC = 0xFF; PORTC = 0x00; PC7 1 PC6 1 F PC5 1 PC4 1 PC3 1 PC2 1 PC1 1 PC0 1 PC1 1 PC0 1 // Les sortie PD0,PD1 et PD2 sont des sortie et PD7 est une entrée (S2) 0 DDRD = 0x07; PORTD = 0x00; PC7 0 PC6 0 7 PC5 0 PC4 0 PC3 0 PC2 1 } void init_can(void) { ADCSRA=0x86; } void main(void) { init_ports(); init_can(); lcd_init(16); // Début du programme buzzer=1; bascule=0; led8=1; led9=1 // Buzzer éteind : 1 pour éteindre // Variable bascule mise à 0 // led8 alumée // led9 alumée // Initialisation de l’afficheur en 16 cases while(s2==1) // Tend que la condition entre parenthèse est vrai, créer une boucle entre les crochet suivant : tend que s2 n’est pas appuyer. { lcd_gotoxy(0,0); // Curseur du LCD sur la colonne 0, ligne 0 lcd_putsf("Capteur Courant"); // Affichage de la phrase “Capteur courant” à lcd_gotoxy(3,1); l’endroit du curseur. lcd_putsf("Appuie S2"); } while(s2==0); // ten que s2 est appuyé faire action entre crochet En l’absence de crochet, ne rien faire : Attendre 17 while(1) { // 1 sera toujours vrai, donc créer une boucle infinie if(s2==0) { bascule=!bascule; delay_ms(200); while(s2==0); } // Si s2 est appuyé, complémenté bascule et attendre 200ms puis le relâchement de s2 if(bascule==0) { led8=0; led9=1; // Si la condition est vrai, faire la suite, sinon faire else ou après les crochet. ADMUX=0x00; // Choisir la voir 0 pour relever les valeur. debutconv=1; // débuter la conversion while(finconv==0); // Attendre fin de conversion finconv=1; // Remetre finconv à 1 seuil=((float)ADCW*5/1024); // seuil devient la valeur fait dans le calcul ftoa(seuil,2,seuil_str); // transforme un nbr flottant en une chaîne de caractère : lcd_gotoxy(0,0); seuil_str et 2correspond au nbr de chiffre après la lcd_putsf("Test = 0.00 A "); virgule lcd_gotoxy(7,0); lcd_puts(seuil_str); // Afficher la valeur contenue dans seuil_str delay_ms(200); } else // Sinon { led8=1; led9=0; ADMUX=0x03; // Mesurer sur la voie 03 debutconv=1; while(finconv==0); finconv=1; imot=((float)ADCW*5/1024); // Imot devient la valeur fait par le calcul ftoa(imot,2,imot_str); lcd_gotoxy(0,1); lcd_putsf("Imot = 0.00 A "); lcd_gotoxy(7,1); lcd_puts(imot_str); delay_ms(200); } if(imot > seuil) { buzzer = 0; } // Si imot supérieur à seuil // Alumer le buzzer 18 else // Sinon { buzzer = 0; } // Eteindre buzzer delay_ms(200); } } 19