Vous êtes sur la page 1sur 73

BRUYERE Philippe GOMBERT Benjamin VENCE Eric Gp.

P205

2002-2003

PROJET DE 2me ANNE CONCEPTION ET RALISATION DUN MODULE P.I.D. SORTIE ANALOGIQUE

SOMMAIRE

A DESCRIPTION DU PROJET
CAHIER DES CHARGES PRINCIPE DE FONCTIONNEMENT GUIDE DUTILISATION

04

04 04 06

B CONCEPTION MATRIELLE
CHOIX DES COMPOSANTS SCHMA BLOC DTAILS TECHNIQUES Adaptateur dentre CAN Microcontrleur Afficheur et Driver Clavier CNA Adaptateur de sortie RALISATION Nomenclature Schma de cblage Procdures de tests Montage final

08

08 09 09 09 11 18 19 19 20 27 29 29 30 31 33

ESME Sudria 2003

p.1/72

C CONCEPTION LOGICIELLE
ORGANISATION DU PROGRAMME ET FORMATAGE DES DONNES CONFIGURATION DU PIC Affectation des entres/sorties Assignation des registres de configuration MISE EN PLACE DE MACROS DCLARATION DES CONSTANTES ALLOCATION DE LESPACE MMOIRE DTECTION ET TRAITEMENT DES INTERRUPTIONS INITIALISATIONS Initialisation des ports Initialisation des registres dinterruptions Initialisation des variables ROUTINES CAN Addition Soustraction Multiplication Calcul du P.I.D. Conversion de chiffres en digits Conversion des paramtres en digits Affichage (transmission srie des donnes) PROGRAMME PRINCIPAL

34

34 38 39 40 43 43 44 45 54 54 55 55 56 56 57 58 58 60 66 68 69 71

D SYNTHSE
AMLIORATIONS ENVISAGES

72

72

E SOURCES

73

ESME Sudria 2003

p.2/72

A DESCRIPTION DU PROJET

Cahier des charges


L'objectif de ce projet est de concevoir un module effectuant les fonctions de corrections numriques P.I.D. dun signal dentre analogique. Les valeurs Kd, Kp et Ki sont rglables ou rinitialisables par lutilisateur tout instant et affiches sur un cran LCD 4 chiffres. Le signal de sortie est analogique. La structure gnrale de lapplication est celle du schma ci-dessous:

+ r

e
-

MicroContrleur Capteur

CNA

MCC

Les composants utiliser sont : Microcontrleur PIC 16F876 Contrleur LCD de rfrence MM5452 Afficheur LCD 4 digits Convertisseur Numrique-Analogique 8 bits

Principe de fonctionnement
Le module de correction P.I.D. (Proportionnelle Intgrale Drive) raliser propose le rglage des valeurs Kp, Ki et Kd (paramtres du correcteur) par l'utilisateur grce un clavier (touches plus et moins pour incrmenter et dcrmenter les valeurs et touche de validation). Les rglages sont visualiss sur un afficheur LCD 4 chiffres (ou digits) contrl par un driver. Les corrections sont effectues par un microcontrleur qui prend en charge la conversion analogique-numrique du signal d'entre. Le signal numrique corrig est ensuite reconverti en signal analogique par un convertisseur numrique-analogique. Enfin le signal est amplifi a l'aide d'un amplificateur de gain avant de commander une machine courant continue (MCC).

ESME Sudria 2003

p.3/72

La rponse est rcupre en sortie de la MCC et une fois filtre elle est compare au signal d'entre afin de dterminer l'erreur pour effectuer la correction souhaite. Un correcteur alliant la combinaison des trois actions P.I.D. peut tre assimil un correcteur srie au sein dun systme. Dtails sur les 3 corrections : La premire consiste dire que plus l'erreur est grande et positive et plus il faut augmenter la tension aux bornes du moteur (pour rattraper cette erreur). La tension aux bornes du moteur est alors directement proportionnelle l'erreur. On a donc : u( t ) = K p .e( t ) Kp tant un coefficient de proportionnalit. On voit cependant apparatre des problmes. Il faut une certaine tension aux du moteur pour que celui-ci puisse se lancer. En rgime permanent, bornes l'erreur ne sera plus assez grande pour pouvoir faire avancer le moteur. Il y aura donc une erreur qui subsistera et nous n'atteindrons pas exactement la position souhaite (erreur d'ordre 0). De mme, pour qu'il puisse y avoir un mouvement, il sera ncessaire que le moteur soit aliment, et donc qu'il y ait une erreur. C'est pourquoi, on ajoute un autre lment qui va augmenter la tension aux bornes du moteur lorsque l'erreur reste constante. chaque priode, on va sommer l'erreur (intgration de l'erreur). Donc, si l'erreur reste constante, sa somme va augmenter au fil du temps. On a alors : 1 t u( t ) = K p .e( t ) + e(t )dt Ki 0 La valeur Ki est un coefficient qui va dterminer l'influence de ce paramtre intgral.

une tension au moteur, il met un certain temps ragir Lorsque l'on applique (constante de temps mcanique). Pendant ce temps lerreur continue augmenter et la tension aux bornes du moteur crot alors que cela n'est pas ncessaire. Pour diminuer ce phnomne, nous introduisons un 3me lment qui permet d'en limiter les effets (il est souvent fait rfrence pour ce terme la notion de viscosit, en augmentant ce terme c'est comme si on augmentait la viscosit de la raction, on trempe le tout dans un liquide de plus en plus visqueux). On se base sur la diffrence (la variation) de l'erreur entre 2 mesures. Il s'agit de la drive de l'erreur. On obtient au final lquation du P.I.D. : de ( t ) 1 t u( t ) = K p .e( t ) + e(t ) dt + K d Ki 0 dt Avec Kd tant le coefficient du paramtre driv.
Chacun des paramtres Kp, Ki et Kd corrige le systme en vitesse, stabilit et prcision. Par exemple avec un correcteur de type proportionnel on peut rendre le systme plus rapide mais il devient en revanche moins stable. Il faut donc trouver un compromis entre rapidit, stabilit et prcision. Do la ncessit dutiliser un correcteur labor dont la programmation sera dtaille par la suite. ESME Sudria 2003
p.4/72

Guide dutilisation

Pour sassurer du bon fonctionnement du module dasservissement, il faut suivre scrupuleusement les tapes suivantes lors de sa mise en marche. Tout dabord vrifier le cblage dalimentation. Les bornes de couleurs bleu, jaune, rouge et noire sont directement relies aux composants (PIC, CAN, driver LCD, AOP) et les alimentent. Les douilles jaune et bleue fournissent respectivement +12 et 12V pour les AOP et la douille rouge +5V pour le reste des composants. Il faut sassurer que toutes les alimentations sont bien branches, surtout au niveau du +12 et 12V (jaune et bleue) afin de ne pas crer de diffrences de potentiels trop importantes au sein du circuit gnral. Cest partir de ce moment-l que lon peut allumer lalimentation et basculer linterrupteur gnral du montage sur la position ON. Aprs avoir rgl le GBF, on le relie laide de cbles coaxiaux branchs sur les fiches BNC. On branche un oscilloscope en sortie pour visualiser le signal corrig. Le signal dentre ne peut excder +5V et 5V et il doit rester en basses frquences (50 Hz par exemple). Une fois la maquette alimente et un signal dentre inject, il faut appuyer sur le bouton Reset pour dmarrer la conversion analogique-numrique et par consquent la correction P.I.D. Les paramtres sont directement visualiss sur lafficheur LCD. Quatre digits sont utiliss, de gauche droite : Kp, Ki, Kd et la limite dintgration de lasservissement. Le clavier est compos de 3 boutons (+, -, v pour valider). Une premire pression sur v permet dactiver le mode de slection du paramtre modifier. On se dplace sur lafficheur laide des boutons + pour aller gauche, et - pour aller droite. Une fois le ESME Sudria 2003
p.5/72

choix du paramtre modifier effectu, on le valide par pression sur v. Ainsi on passe dans le mode de slection de la valeur du paramtre qui peut varier par pas de 1 entre 0 et 9. Le + et le - permettent dincrmenter ou dcrmenter la valeur que lon valide avec la touche v. Lopration de modification du ou des paramtres de corrections peut tre effectu tout instant. Lorsque lon appuie sur la touche Reset, tous les paramtres sont remis 0. On peut ainsi raliser un nouvel asservissement.

ESME Sudria 2003

p.6/72

B - Conception matrielle
Choix des composants
Le cahier des charges nous impose dutiliser certains composants. Ils ont t choisis pour leurs caractristiques techniques et les performances ncessaires la bonne excution du systme. Le microcontrleur est le cur du systme. Il doit effectuer en permanence le calcul de la correction P.I.D., mais il doit aussi grer lenvoi de donnes au driver LCD afin deffectuer un affichage cohrent des paramtres du correcteur. Le PIC doit galement prendre en compte les interruptions engendres par les modifications possibles des paramtres laide de boutons-poussoirs. Il est de plus quip dun convertisseur analogique-numrique (CAN) 10 bits en entre. En sortie du PIC nous avons choisi dutiliser un convertisseur numriqueanalogique (CAN) 8 bits de rfrence AD557. Il dlivre en sortie un signal compris entre [0V ; +2,5V]. Ce convertisseur est plac avant ladaptateur de sortie. Lutilisation de ce PIC et du CAN impose quelques contraintes. Il ne peut recevoir en entre quun signal compris entre 0 et 5 Volts. Or nous effectuons lasservissement dune machine courant continue, nous avons donc un signal compris entre 5 et +5 Volts en entre du PIC. Il faut alors utiliser deux montages dadaptation. Un en entre pour rduire lamplitude du signal de [-5V ; +5V] [0V ; +5V] et un autre en sortie pour augmenter lamplitude de [0V ; +2,5V] sortie du CAN [-5V ; +5V].

ESME Sudria 2003

p.7/72

Schma bloc

Dtails techniques
Adaptateurs dentre
Conversion [+5v ; -5v] => [+5v ; 0v] Il faut adapter le signal dentre. Nous devons diminuer lamplitude du signal de [+5v ; -5v] [+5v ; 0v]. quation raliser : Vs =

(Ve + 5)
2

Pour raliser cette opration, on utilise deux amplificateurs oprationnels (AOP) en srie. Le premier est utilis en montage amplificateur inverseur ; le second en montage soustracteur recevant sur sa borne V- (borne inverseuse) la sortie du premier AOP et sur sa borne V+ (borne non-inverseuse) le signal dentre corriger.

ESME Sudria 2003

p.8/72

Le choix des rsistances est fait de telle sorte que : R1 = R2 = R5= R6 R3 = R4 R3 = 2 R1 Une fois les calculs thoriques effectus, nous avons simul lensemble du montage dadaptation laide du logiciel Design Capture. Voici les courbes que nous obtenons aprs simulation :

Le signal dentre, une sinusode damplitude comprise entre 5 et +5 V, a t adapt pour pouvoir tre inject au PIC.

ESME Sudria 2003

p.9/72

CAN
Le principe de la conversion analogique-numrique est dattribuer une grandeur numrique correspondant un tat physique. Le CAN convertit donc une tension dite analogique en une valeur numrique. Le PIC 16F876 utilis pour le calcul de la correction P.I.D. intgre un convertisseur 10 bits. Il ne sera donc pas ncessaire dutiliser un circuit supplmentaire pour la conversion analogique-numrique.

Rsolution dun convertisseur analogique-numrique La rsolution dun CAN correspond la plus petite mesure ralisable par le CAN, autrement dit la prcision du CAN. Par exemple, si on utilise un CAN 8 bits, ce CAN ne pourra fournir que 255 valeurs diffrentes. La plus petite diffrence de tension mesurable ses bornes va tre fonction de la plage de mesure en tension utilise. Si la tension est comprise entre 0 et 5V, la mesure minimale correspond : 5/255 = 19,6mV. On dira que la rsolution dun CAN 8 bits pour une tension de plage de mesure de 5V est de 19,6mV. Dune faon gnrale, la rsolution est gale la plage de tension de la mesure divise par le nombre de bits du CAN : plage _ de _ mesure Rsolution = Nombre _ de _ bits _ du _ CAN Par consquent, pour augmenter la rsolution dun systme, on a 2 possibilits :
- soit augmenter le nombre bits du CAN utilis - soit diminuer la plage de mesure

On utilise dans ce projet un CAN 10 bits (celui contenu dans le PIC 16F876) pour convertir le signal dentre. Nanmoins un CAN 8 bits aurait suffi car on nglige les deux bits les moins significatif lors de la correction effectue par le PIC. ESME Sudria 2003
p.10/72

chantillonnage de linformation La premire tape du processus de numrisation est lchantillonnage. Cela consiste passer d'un signal temps continu (un signal lectrique en loccurrence), en une suite discrte de valeurs (valeurs mesures intervalles rguliers). Cet chantillonnage est de lordre de la dizaine de microsecondes. Une relation existe entre la frquence maximale du signal dentre et la frquence chantillonnage. En effet, pour viter le phnomne de recouvrement spectral il faut respecter le thorme de Shannon : Fe > 2.Fmax Dtail de fonctionnement du CAN contenu dans le 16F876 Le microcontrleur 16F876 intgre un module de conversion analogiquenumrique qui est associ un multiplexeur analogique multivoie des entres. Autrement dit on peut raliser des mesures sur plusieurs voies dentre analogiques (jusqu 5). Ces voies analogiques correspondent aux broches du port A. Module CAN 10 bits implique que le rsultat de la conversion est un nombre de 10 bits, c'est--dire compris entre 000H et 3FFH (11 1111 1111 en binaire ou 1023 en dcimal). Ceci correspond donc 1023 niveaux de mesure, ce qui pour 5V donne une rsolution de 4,8mV, prcision largement suffisante. Le temps de conversion de ce module est de lordre de : 40s ce qui permet en pratique de raliser jusqu 25000 mesures par seconde.

ESME Sudria 2003

p.11/72

Structure interne du CAN 10 bits des 16F876

Les registres et bits associs au module CAN Il y a 4 registres associs au module CAN du 16F876 : - ADRESH : le registre de rsultat Haut - ADRESL : le registre de rsultat Bas - ADCON0 : premier registre de contrle du module CAN - ADCON1 : seconde registre de contrle du module CAN

ESME Sudria 2003

p.12/72

Les registres ADRESH et ADRESL Le convertisseur Analogique Numrique est 10 bits et par consquent 1 octet (=8 bits) ne suffit pas pour contenir le rsultat de la mesure. Cest pour cela que 2 registres sont ncessaires et sont donc utiliss. De fait 6 bits restent inutiliss sur les 16 disponibles. Il est possible de dfinir la justification du rsultat au sein de ces 2 octets laide dun bit du registre ADCON1 : le bit ADFM. Voici la disposition des bits de rsultats dans les 2 octets en fonction de la valeur du bit ADFM :

Le registre ADCON0 : Ce premier registre de contrle contient plusieurs bits qui configurent le fonctionnement du module CAN :

- Bits ADCS1, ADCS0 : bits de slection de lhorloge utilise pour le module CAN.

- Bits CHS2, CHS1, CHS0 : les bits de slection du canal analogique mesurer. Avant toute conversion, il faut dfinir quel est le canal qui va tre utilis pour cette conversion. Ceci se fait grce ces 3 bits selon le tableau suivant :

ESME Sudria 2003

p.13/72

- Bit GO/DONE : Le bit de lancement de la conversion et tmoin de la fin de conversion. Ce bit nest actif que si le bit ADON=1, c'est--dire si le module CAN est actif. Il sert lancer la conversion : en mettant ce bit 1, on lance la conversion partir de la voie analogique slectionne par les bits CHS2, CHS1 et CHS0. Une fois que la conversion est termine, ce bit passe 0 automatiquement. Il sera donc possible dutiliser ce bit pour attendre la fin de la conversion en cours. - Bit ADON : Le bit dallumage du module CAN. Ce bit sert allumer le module CAN. Si ADON=0, le module CAN est inactif. Si le bit ADON=1, le module est oprationnel. Le registre ADCON0 : Ce second registre de contrle contient plusieurs bits qui configurent le fonctionnement du module CAN :

- Bit ADFM : Configuration du format du rsultat. Ce bit sert configurer le rsultat au sein des 2 registres ADRESL et ADRESH selon le tableau qui suit :

Les cases vertes reprsentent le rsultat sur 10 bits, X0 correspond au bit de poids faible et X9 au bit de poids fort. - Bits PCFG0 , CFG1, PCFG2 et PCFG3 : Bits de configuration des ports A (en analogique ou numrique). Les broches des ports A ( lexception de PA4) peuvent tre configures soit en analogique soit en numrique. Lorsquune broche de ce port est configure en analogique, elle devient un des canaux de mesure utilisables par le CAN. Lorsquelle est configure en numrique, elle est une broche E/S comme les autres broches des autres ports.

ESME Sudria 2003

p.14/72

La configuration de la nature des broches du port A est dcrite dans le tableau suivant :

Linterruption fin de conversion associe au module CAN Il existe galement une source dinterruption lie au module CAN : la fin de conversion. Comme toute interruption, celle-ci doit tre active pour tre oprationnelle ce qui se fait par les bits : - PEIE=1 (activation des interruptions priphriques) - ADIE=1 (activation de linterruption fin de conversion) Le bit de drapeau associ cette interruption est ADIF. Il faudra le mettre 0 avant toute activation de linterruption. Ce dernier est automatiquement mis 1 en fin de conversion si linterruption est active. Cette interruption est intressante uniquement si lon souhaite optimiser la vitesse de conversion au maximum.

ESME Sudria 2003

p.15/72

Tableau de synthse issu de la datasheet du 16F876 :

Droulement dune conversion analogique-numrique tudions comment le module CAN 10 bits ralise une conversion analogique numrique. Le schma suivant rsume la squence dune conversion analogique-numrique par le module utilis :

1. Lensemble de la conversion est lanc lorsque le bit GO/Done est mis 1 par lutilisateur. 2. Sen suit un temps de latence interne li la prsence dun condensateur interne. 3. Puis la conversion commence avec le calcul des 10 bits 4. Lorsque la conversion analogique-numrique est termine : a. le rsultat est stock dans les registres ADRESL et ADREH b. le bit GO/Done est mis 0 automatiquement tmoignant de la fin de la conversion c. le drapeau de linterruption fin de conversion est mis 1 (si cette interruption est active comme expliqu prcdemment)

ESME Sudria 2003

p.16/72

Microcontrleur
Le microcontrleur que nous utilisons est un 16F876. Il a t choisi pour ses caractristiques techniques intressantes. Il possde une mmoire RAM de 368 octets, une EEPROM de 256 octets ainsi quune FLASH de 8 kilo-octets. Cela nous assure un espace suffisant pour stocker et excuter le programme afin de traiter le signal corriger. En plus des entres/sorties programmables et des interruptions, il possde certaines ressources internes telles que : - Un convertisseur analogique-numrique 10 bits qui envoie directement les chantillons du signal traiter aux registres internes du PIC afin deffectuer la correction P.I.D. Lintgration de ce CAN simplifie le routage, vite des problmes de compatibilit et fait gagner de la place au montage. - Des timers. Nous utiliserons le timer 1 pour grer le clignotement du curseur. Le timer 1 est un compteur 16 bits. Lorsquil est coupl notre oscillateur de 4MHz avec un pr-diviseur gal 8 on obtient une interruption toutes les 0,5 secondes. La priode de clignotement sera donc dune seconde. - Des liaisons sries SCI, I2C, SPI qui ne sont pas utilises dans le cadre de ce projet. - Des sorties P.W.M. (Modulation de Largeur d'Impulsion) si lon veut effectuer une commande numrique par exemple. Pour fonctionner le PIC rclame une configuration hardware minimale compose dun oscillateur et dun circuit reset :

ESME Sudria 2003

p.17/72

Afficheur et Driver
Le driver LCD remplit une double fonction. Il commande l'affichage et d'autre part se charge de la communication avec l'extrieur. Il est pilot par le PIC qui lui transmet un signal dhorloge qui cadence lenvoi des donnes afficher.

Le driver peut afficher jusqu 32 segments diffrents, ce qui correspond dans notre cas 4 digits 7 segments ainsi que 4 points situs gauche des chiffres. Lafficheur LCD ne pose pas de problme, le routage de chaque digit se fait par paquet de 8 bits.

Clavier
Le clavier doit permettre la saisie et la modification des paramtres du correcteur PID : Kp, Ki, Kd et la limite dintgration.

ESME Sudria 2003

p.18/72

Il est constitu de trois boutons-poussoirs avec une capacit de dcouplage en parallle pour limiter le phnomne de rebonds. Les boutons sont connects au PIC sur le port B.

CNA

Les convertisseurs numrique-analogique convertissent les signaux logiques en tensions analogiques. Plusieurs types de convertisseurs sont disponibles dans chaque catgorie, ils se diffrencient par leur prcision, leur vitesse de traitement de l'information, leur prix... On devra donc faire des compromis selon ses besoins. Il existe principalement deux types de convertisseurs numrique-analogique sur le march : les convertisseurs rsistances pondres, et les convertisseurs rseau R/2R (ces derniers sont prdominants). Il existe galement des convertisseurs rseaux de condensateurs fonctionnant sur le mme principe de base que les rseaux rsistances. Principe de fonctionnement Si on fait l'opration inverse de la conversion analogique-numrique, chaque valeur numrique on fait correspondre une et une seule valeur analogique; la tension analogique de sortie varie par "bonds", et non plus continment comme dans le signal d'origine. La tension de sortie a une forme d'escalier.

ESME Sudria 2003

p.19/72

En pratique, on filtre cette tension pour lisser ces discontinuits et essayer de se rapprocher au mieux du signal d'origine :

Dfinitions Rsolution La rsolution du CNA est la variation de tension de sortie correspondant la variation d'une unit du nombre binaire en entre. La dfinition est quivalente celle du CAN. Plage de conversion Il y a ici une petite diffrence avec le CAN, la plage de conversion numrique va de 0 2(N-1), N tant le nombre de bits du convertisseur, et chaque valeur numrique correspond une unique valeur analogique de sortie. Par rapport celle du CAN, la plage de conversion s'arrte donc un LSB (bit le moins significatif) plus tt (sur l'chelle analogique du CAN, ceci correspond la dernire transition numrique). Dynamique La dynamique d'un signal est le rapport entre la tension maxi et la tension mini que pourra prendre ce signal. Mise en relation D'aprs ce qui a t dit sur la plage de conversion, la relation entre le pas de quantification (1 LSB), la plage de conversion VMAX et le nombre de bits du convertisseur sera lgrement diffrente de l'quation suivante en pratique. La figure du paragraphe suivant va clairer cette quation :

LSB =

DVMAX 2N

ESME Sudria 2003

p.20/72

Exemple : CNA 3 bits

Fonction de transfert d'un CNA 3 bits Cette figure montre la fonction de transfert d'un CNA 3 bits ayant une rsolution de 1V. On voit clairement ici ce qui a t dit pour la plage de conversion : la plage s'tend de 0 7V, et non pas 8V comme pour le CAN, car le dernier tat numrique est "7". En pratique, pour un CAN suprieur 8 bits, la diffrence avec le rsultat thorique donn par lquation prcdente est trs faible. ERREURS DE CONVERSION Erreur de gain Le fabricant de convertisseurs Analog Devices dfinit cette erreur ainsi : c'est l'cart entre la valeur thorique et la valeur relle mesure sur la dernire transition du convertisseur et exprim en LSB. Cette mesure suppose que l'ajustage du zro soit parfait.

ESME Sudria 2003

p.21/72

Illustration de lerreur de gain. Erreur d'offset De mme, le code binaire 0 ne correspond pas forcment une tension rigoureusement nulle en sortie. Cette tension est la tension de dcalage, ou d'offset.

Erreur d'offset.

ESME Sudria 2003

p.22/72

En pratique, Analog Devices dfinit cette erreur comme tant l'cart entre la valeur thorique et la valeur relle mesure sur la premire transition du convertisseur et exprim en LSB. En pratique, pour ajuster un convertisseur, on rglera d'abord l'offset, et ensuite le gain. Erreurs de linarit L'erreur de linarit est due au fait que la rsolution des convertisseurs n'est pas constante. On distingue deux formes de non-linarit : - Le non linarit intgrale La non linarit intgrale (exprime en LSB) est la diffrence maximale constate sur toute la plage de conversion entre les valeurs thoriques et les valeurs mesures. Cette mesure n'a de sens que si le zro et le gain sont correctement rgls. La fonction est reprsente dans la figure suivante.

Erreur de linarit intgrale.

ESME Sudria 2003

p.23/72

- La non linarit diffrentielle La non linarit diffrentielle concerne la diffrence de tension obtenue lors du passage au code numrique immdiatement suprieur ou infrieur. Thoriquement, cette valeur vaut 1 LSB. La non linarit diffrentielle sera la diffrence entre l'cart mesur et le LSB thorique.

Erreur de linarit diffrentielle. La valeur donne dans les spcifications des constructeurs est la plus grande valeur constate sur toute la plage de conversion. La non linarit diffrentielle est plus gnante que la non linarit intgrale, surtout dans le cas de mesures comparatives effectues sur une faible partie de la plage de conversion. En gnral, et pour des causes technologiques, le maximum de non linarit diffrentielle se trouve la moiti de la pleine chelle (passage du MSB bit le plus significatif - de 0 1), et ensuite moindre degr 1/4 et 3/4 de la pleine chelle. Il faut donc rester vigilant lors de mesures dans ces zones.

ESME Sudria 2003

p.24/72

Monotonicit Ce phnomne est le mme que le prcdent, mais pouss l'extrme : il peut arriver que la pente de la courbe de conversion change de signe. Pour une tension analogique de sortie, il nest pas possible d'attribuer un nombre binaire correspondant : plusieurs valeurs peuvent tre attribues une mme combinaison logique.

Monotonicit

Temps d'tablissement Les tages de sortie des CNA sont gnralement des amplificateurs oprationnels. On a vu que la tension de sortie varie "par bonds" quand le code binaire d'entre change. De ce fait, l'ampli de sortie va fonctionner en mode impulsionnel. La stabilisation de la tension de sortie n'est pas immdiate : elle peut tre du type premier ordre ou oscillatoire amortie (deuxime ordre et plus).

ESME Sudria 2003

p.25/72

On appelle temps d'tablissement (setting time en Anglais) le temps mis par la sortie pour atteindre un certain pourcentage de la tension finale stabilise lorsque l'entre va varier.

Temps d'tablissement Prcision du convertisseur Pour obtenir la prcision globale du convertisseur, on cumule toutes les erreurs prcdemment cites. En gnral, ces erreurs sont donnes soit en % de la pleine chelle, soit en fraction de quantum ( 1/2 LSB par exemple).

Adaptateur de sortie
Conversion [+2,5v ; 0v] => [+5v ; -5v] : Nous devons adapter le signal de sortie du CNA. Il faut augmenter lamplitude du signal de [+2,5v ; 0v] [+5v ; -5v] pour alimenter correctement la MCC. quation raliser : Vs = 4Ve - 5

ESME Sudria 2003

p.26/72

On utilise nouveau deux AOP en srie. Le premier en tant quamplificateur inverseur et le second en montage sommateur. La borne V-, du premier AOP, reoit en entre le signal de sortie du CNA, et celle du second AOP est connecte la sortie du premier. Les bornes V+ des deux AOP sont relies la masse.

Le choix des rsistances est fait de telle sorte que : R2 = 4 R1 et R3 = R4 = R5 Une fois de plus aprs avoir effectu les calculs thoriques nous avons simul lensemble et voici les rsultats obtenus :

ESME Sudria 2003

p.27/72

Nous remarquons que le signal est radapt et lamplitude du signal de sortie a bien une amplitude comprise entre 5 et +5 volts, comme le signal inject lentre du module.

Ralisation
Nomenclature
Nb Rfrence 1 PIC 16F876 1 AD557 1 MM5452 1 vi-502 1 TL084 1 1 2 1 6 2 2 470 1 5 k 10 10 k 3 20 k 1 50 k 2 15 pF 1 15 pF 1 10 nF 1 47 F 1 100 F 5 100 nF 1 1 4 1 1 15 m 15 m 15 m 1 ESME Sudria 2003 Dsignation Microcontrleur RISC 8 bits Convertisseur Numrique Analogique 8 bits Contrleur LCD Afficheur LCD 7 segments - 4 digits AOP jfet (x4 AOP) Support tulipe 28 broches Support tulipe 16 broches (7,5 mm) Support tulipe 40 broches Support tulipe 14 broches (7,5 mm) Support tulipe 8 broches (7,5 mm) Support tulipe barrette de 32 broches Rsistance Rsistance Rsistance Rsistance Rsistance Condensateur Condensateur Condensateur Condensateur Condensateur Condensateur Quartz 4MHz Interrupteur ON/OFF Bouton poussoir Led verte 3 mm Led rouge 3 mm Fil rouge (5V) Fil noir (5V) Fil vert (5V) Bornier ( IN & OUT coax. / +5v / +12v / -12v / GND )
p.28/72

Schma de cblage

ESME Sudria 2003

p.29/72

Procdures de tests
Pour tester le bon fonctionnement du CAN, on lui injecte un signal quelconque, puis on lit le rsultat de la conversion en sortie du PIC laide de 8 diodes places sur chacun des bits du bus de sortie. Le test du CNA se fait en mme temps que le test du correcteur proportionnel, quand K vaut 1. Nous injectons en entre un signal sinusodal et nous devons visualiser sur loscilloscope une sinusode similaire de mme amplitude. Nous effectuons le mme test avec cette fois-ci K gal 2. Nous devons pouvoir visualiser une sinusode ayant une amplitude 2 fois plus grande que celle injecte en entre.

Signaux dentre et de sortie pour Kp=3

ESME Sudria 2003

p.30/72

Pour tester laction intgrale du correcteur on injecte un signal carr en entre et nous devons visualiser un signal triangulaire sur loscilloscope.

Signaux dentre et de sortie pour Ki=1 Pour tester laction drive il faut injecter un signal triangulaire en entre et nous devons rcuprer en sortie un signal carr.

Signaux dentre et de sortie pour Kd=9 Pour vrifier le bon fonctionnement de lafficheur il suffit dafficher diffrentes valeurs afin dessayer toutes les possibilits daffichage. ESME Sudria 2003
p.31/72

Montage final
Maquette ralise durant toute la dure du projet.

Recto

Verso

ESME Sudria 2003

p.32/72

C PROGRAMMATION
Organisation du programme
Avant de procder llaboration du programme contenu dans le PIC, il est prfrable dtablir au pralable un algorithme qui dfinisse son principe de fonctionnement. Lorganigramme suivant dcrit sommairement lorganisation du programme. Il modlise leffet dun reset, reprsente la dtection et le traitement des interruptions, et enfin dcrit la boucle principale ralisant la correction. Lasservissement se fait en trois phases : lchantillonnage, le calcul du PID et lmission du rsultat sur le port C.

ESME Sudria 2003

p.33/72

La ralisation dun asservissement PID se rsume lapplication de la formule : u(k) = Kp e(k) + Ki [ u(k-1) + e(k) ] + Kd [ e(k) - e(k-1) ] Lorganigramme suivant illustre le traitement de la correction.

ESME Sudria 2003

p.34/72

Formatage des donnes


La tension du signal dentre du module P.I.D. ralis varie entre -5V et +5V. Il est donc ncessaire grce un adaptateur dtalonner ce signal entre 0 et 5V pour linjecter dans le CAN. chaque valeur de tension correspondra une valeur numrique. Le paragraphe suivant pour but dexpliquer le processus de formatage des donnes et les correspondances entre les valeurs analogiques et numriques. Le CAN chantillonne sur 10 bits un signal initial compris entre -5V et +5V.

e (k) : +5V
-5V

1023 0

Le rsultat de la conversion analogique-numrique est stock dans les registres ADRESH (bits de poids fort) et ADRESL (bits de poids faible). Si lon choisit de mettre le bit ADFM = 0 (bit 7 du registre ADCON1), alors on choisit deffectuer la justification gauche, cest--dire que le registre ADRESH reoit les 8 bits de poids fort de la conversion, et ADRESL rcupre les 2 bits de poids faible restants. On fait abstraction des 2 bits de poids faible (ADRESL) pour faciliter le calcul de la correction. On obtient donc une conversion sur 8 bits :

e (k) : +5V
-5V

(ADRESH) : 255 0

Pour appliquer la formule de correction, on doit recentrer le signal sur 0. On soustrait donc 127 au registre ADRESH :

e (k) : +5V
-5V => ADRESH 127 = a . e (k)

(ADRESH-127) : 128 -127 (avec a = 128/5)

Pour effectuer la correction, on travaille avec [ a . e (k) ] plutot que de travailler directement avec e (k) car les valeurs des chantillons sont comprises entre -5V et +5V, et ces valeurs sont trop petites pour avoir une rsolution suffisante. En effet, on ne peut pas travailler avec des valeurs dcimales. On utilise donc une valeur proportionnelle e (k) pour faire la correction : [ a . e (k) ] . ESME Sudria 2003
p.35/72

Correction avec [ a . e (k) ] : u(k) = Kp . e (k) + Kd . [e (k) - e (k-1) ] + Ki . [e (k) + u(k-1) ]

e (k)

a e (k) a u(k) = Kp . a e (k) + Kd . [ a e (k) - a e (k-1) ] + Ki . [ a e (k) + a u(k-1) ]

On constate quen effectuant la correction avec [ a . e (k) ] , on obtient : [ a . u(k) ] . Avec : -127 a . u(k) 128

On radapte le rsultat pour linjecter en sortie du Pic (8 bits). Pour cela, on ajoute 127 [ a . u(k) ] : 0 a . u(k) + 127 255 [ a u(k) + 127 ] : 255 0 +5V -5V

ESME Sudria 2003

p.36/72

La programmation dun microcontrleur PIC 16F876 se fait en langage MPASM . Il sagit dun langage assembleur spcifique cr par Microchip. Ce langage dispose dun jeu de 35 instructions assez peu explicites, do la ncessit de bien structurer le programme et de le commenter convenablement.

Configuration du PIC :
Cration dune en-tte regroupant les principales informations du programme :
Celle-ci est facultative, mais elle peut savrer trs utile pour la mise en uvre du PIC dans un circuit. Elle regroupe des informations essentielles : - le nom du fichier (celui ci doit tre compil puis inject dans le PIC), - la liste des fichiers inclure dans le projet pour que la compilation soit possible (dans notre cas, il sagit du fichier librairie : P16F876.inc ), - la frquence de loscillateur externe pour laquelle est conu ce programme (ici : 4 MHz), - laffectation des ports dentres-sorties pour le cblage du PIC.

;*************************************************************************************** ;* ;* Ralisation d'un asservissement PID ;* ;*************************************************************************************** ;* ;* NOM: projet.asm ;* Date: 23/05/2003 ;* Auteurs: BRUYERE Philippe - GOMBERT Benjamin - VENCE Eric ;* Groupe de projet : P205 ;* ;*************************************************************************************** ;* ;* Fichiers requis: P16F876.inc ;* ;*************************************************************************************** ;* ;* Notes: On utilise un oscillateur 4 MHz ;* Les 8 bits de sortie sont disponibles aprs correction sur le PORTC ;* L'affichage des paramtres est transmis par la sortie srie du PORTB ;* Les boutons poussoir gnrent des interruptions sur les entres ;* RB4 RB6 du PORTB ;* ;***************************************************************************************

* * * * * * * * * * * * * * * * * * *

ESME Sudria 2003

p.37/72

Dclaration du modle de PIC utilis et appel de la librairie en vigueur :


LIST p=16F876 #include <p16F876.inc> ; Dfinition du processeur ; fichier include

Directive CONFIG :
La directive CONFIG permet de configurer le compilateur pour que celui-ci reconnaisse chacun des paramtres de programmation du PIC sans quil ne soit ncessaire de les prciser chaque fois. Cette directive permet notamment de dclarer le type doscillateur utilis ainsi que les diffrents modes de protection utiliss par le PIC et sa mmoire.
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC ; _CP_OFF Pas de protection ; _DEBUG_OFF RB6 et RB7 en utilisation normale ; _WRT_ENABLE_OFF Le programme ne peut pas crire dans la flash ; _CPD_OFF Mmoire EEprom dprotge ; _LVP_OFF RB3 en utilisation normale ; _BODEN_OFF Reset tension hors service ; _PWRTE_ON Dmarrage temporis ; _WDT_OFF Watchdog hors service ; _XT_OSC Oscillateur XT

Affectations des entres-sorties :


Pour un bon fonctionnement du PIC, il est ncessaire dattribuer chacune de ses pins un statut dentre ou de sortie afin que le microcontrleur sache sil doit lire ou crie sur chaque pin. Ces affectations doivent tre faites par rapport aux fonctions quoffre chaque pin. Dans notre cas, nous avons besoin dune entre analogique que lon branche sur lentre RA0 du PORTA. Les 8 bits de sortie sont ceux du PORTC car nous rservons le PORTB au traitement des interruptions gnres par les boutonpoussoirs (le PORTB tant le seul port grer les interruptions). Les signaux de contrle du driver LCD sont disponibles sur deux pins encore libres sur le PORTB (RB0 et RB1). Les pins non utilises sont dclares comme des sorties.
;********************************************************************************* ;* ASSIGNATIONS SYSTEME * ;********************************************************************************* ; DIRECTION DES PORTS I/O ; -------------------------------------; (1=entre ; 0=sortie)

ESME Sudria 2003

p.38/72

DIRPORTA

EQU

B'00000001'

; Direction PORTA (registre TRISA) ; RA0 : entre analogique ; RA1 : N.C. ; RA2 : N.C. ; RA3 : N.C. ; RA4 : N.C. ; RA5 : N.C. ; on rcupre le rsultat de la conversion A->N ; dans les registres ADRESH (Bank0) et ADRESL (Bank1) ; Direction PORTB ; RB0 : sortie CLK srie pour le driver LCD ; RB1 : sortie DATA srie pour le driver LCD ; RB2 : N.C. ; RB3 : N.C. ; RB4 : entre BP [+] ; RB5 : entre BP [-] ; RB6 : entre BP [V] ; RB7 : N.C. ; Direction PORTC ; RC0 RC7 : 8 bits du bus de sortie

DIRPORTB

EQU

B'01110000'

DIRPORTC

EQU

B'00000000'

Assignations des registres de configuration :


Il est prfrable deffectuer ces assignations au dbut du programme, cela facilite leur modification et vite de devoir parcourir le programme pour retrouver ces registres. Ceux dfinis ci-aprs permettent dactiver et de paramtrer les diffrents modules dont dispose le PIC (dans le cadre de ce projet, nous utiliserons uniquement le module de conversion analogique-numrique et le module de dtection des interruptions). Ces valeurs seront charges lors de linitialisation par la routine INIT .

Configuration du convertisseur analogiquenumrique :


Le registre ADCON1 permet de choisir le nombre dentres analogiques ainsi que le type de justification. Nous avons besoin dune seule entre de ce type do la valeur des bits de configuration du port : PCFGx = 1110. Le convertisseur intgr dans le PIC effectue une conversion sur 10 bits. Le rsultat est stock sur 2 octets : ADRESH (octet de poids fort) et ADRESL (octet de poids faible). Le processeur ayant une architecture RISC 8 bits, il serait inutile, et assez complexe, de conserver et dexploiter ce rsultat sur 10 bits. Nous faisons donc abstraction des deux bits les moins significatifs. Il suffit de choisir une justification gauche (ADFM = 0), ainsi les 8 bits de poids forts de la conversion sont stocks dans le registre ADRESH . Il ne reste plus qu le lire. Le registre ADCON0 permet de dfinir la frquence dchantillonnage du PIC, et de choisir la pin sur laquelle sera effectue la conversion. Loscillateur utilis tant fix 4MHHz, la frquence dchantillonnage maximum que lon puisse choisir est de 500KHz (ADCSx = 01). Pour terminer la configuration du module de conversion analogiquenumrique, il reste dfinir le canal dentre. Nous choisissons la pin RAO du PORTA qui correspond au canal A/D 0 (CHSx = 000). ESME Sudria 2003
p.39/72

; REGISTRE ADCON1 (ANALOGIQUE/DIGITAL) ; ------------------------------------------------------------ADCON1VAL EQU B'00001110' ; Registre ADCON1 (configuration du port A/D) ; PCFG = 1110 => 1 entre analogique (RA0) ; ADFM = 0 => justification gauche ; bit0 : PCFG0 : Port ConFiGuration control bit0 ; bit1 : PCFG1 : Port ConFiGuration control bit1 ; bit2 : PCFG2 : Port ConFiGuration control bit2 ; bit3 : PCFG3 : Port ConFiGuration control bit3 ; bit4 : Non implment ; bit5 : Non implment ; bit6 : Non implment ; bit7 : ADFM : A/D result ForMat select

; REGISTRE ADCON0 (ANALOGIQUE/DIGITAL) ; ------------------------------------------------------------; ; ; ; ; ; ; ADCS1 | ADCS0 | Diviseur | Frquence Max du quartz -----------+----------+-------------+---------------------------------------------------------0 | 0 | Fosc/2 | 1.25 MHz 0 | 1 | Fosc/8 | 5 MHz => fe = 500 KHz 1 | 0 | Fosc/32 | 20 MHz => fe = 125 KHz 1 | 1 | Osc RC | Si > 1 MHz, uniquement en mode "sleep" CHS = B'000' => choix du canal A/D 0 (pin RA0) EQU B'01000000' ; Registre ADCON0 (configuration du port A/D) ; bit0 : ADON : A/D ON bit ; bit1 : Non implment ; bit2 : GO/DONE : A/D conversion status bit ; bit3 : CHS0 : analog Channel Select bit0 ; bit4 : CHS1 : analog Channel Select bit1 ; bit5 : CHS2 : analog Channel Select bit2 ; bit6 : ADCS0 : A/D conversion Clock Select bit0 ; bit7 : ADCS1 : A/D conversion Clock Select bit1

ADCON0VAL

Mise en service des interruptions :


Le registre INTCON permet de choisir les interruptions standards que lon souhaite traiter. Nous disposons de trois bouton-poussoirs branchs sur les pins RB4 RB6. Il faut donc activer le masque dinterruption RB4/RB7 (RBIE=1) et le masque dautorisation gnral des interruptions (GIE = 1). Le masque dautorisation gnral des priphriques (PEIE) est mis 1 pour pouvoir utiliser le TIMER1 .
; REGISTRE INTCON (contrle interruptions standard) ; -------------------------------------------------------------------INTCONVAL EQU B'11001000' ; bit0 : RBIF : flag interruption RB4/RB7 ; bit1 : INTF : flag RB0/Int ; bit2 : T0IF : flag tmr0 ; bit3 : RBIE : masque interruption RB4/RB7 ; bit4 : INTE : masque interruption RB0/Int ; bit5 : T0IE : masque interruption tmr0 ; bit6 : PEIE : masque autorisation gnrale priphriques ; bit7 : GIE : masque autorisation gnrale interruption

ESME Sudria 2003

p.40/72

Le TIMER 1 est un module de comptage 16 bits de cycles dhorloge. Il peut tre coupl sur un oscillateur externe ou bien sur le mme oscillateur que celui du PIC. Dans notre cas, le timer sera utilis pour faire clignoter lafficheur (pour mettre en relief le curseur ). Dans le registre PIE1 , le bit TMR1IE permet sil est mis 1, de traiter les interruptions engendres par le TIMER 1 .
; REGISTRE PIE1 (contrle interruptions priphriques) ; -------------------------------------------------------------------PIE1VAL EQU B'00000001' ; bit0 : TMR1IE : masque interruption dbordement tmr1 ; bit1 : TMR2IE : masque interruption TMR2 = PR2 ; bit2 : CCP1IE : masque interruption CCP1 ; bit3 : SSPIE : masque interruption port srie synchrone ; bit4 : TXIE : masque interruption transmission USART ; bit5 : RCIE : masque interruption rception USART ; bit6 : ADIE : masque interruption convertisseur A/D ; bit7 : PSPIE : Toujours 0 sur le PIC 16F876

Le registre T1CON configure le TIMER 1 . Le bit TMR1ON met en service ce timer et les bits T1CKPSx offrent le choix dun pr-diviseur. En utilisant loscillateur du PIC et un pr-diviseur gal 8, nous obtenons un compteur qui gnre une interruption tous les 524288 cycles (soit 8 x 65536 = 8 x 2^16), cest--dire une interruption toutes les 0,5s (avec un oscillateur de 4MHz). Le curseur de notre afficheur clignotera donc avec une priode dune seconde.
; REGISTRE T1CON (configuration du Timer 1) ; ---------------------------------------------------------T1CONVAL EQU B'00110001' ; bit0 : TMR1ON : TiMeR 1 ON bit ; bit1 : TMR1CS : TiMeR 1 Clock Source select bit ; bit2 : T1SYNC : Timer 1 external clock input SYNChronisation control bit ; bit3 : T1OSCEN : Timer 1 OSCillator ENable control bit ; bit4 ; T1CKPS0 : Timer 1 oscillator ClocK Prescale Select bit 0 ; bit5 : T1CKPS1 : Timer 1 oscillator ClocK Prescale Select bit 1 ; bit6 : Inutilis : lu comme 0 ; bit7 : Inutilis : lu comme 0 ; T1CKPS1 | T1CKPS0 | Valeur du pr-diviseur ; -------------+-------------+-----------------------------; 0 | 0 | 1 -> 65536 cycles (65ms 4MHz) ; 0 | 1 | 2 ; 1 | 0 | 4 ; 1 | 1 | 8 -> 524288 cycles (0.5s 4MHz)

ESME Sudria 2003

p.41/72

Mise en place de Macros :


La dfinition de macros rends le programme plus structur et plus simple comprendre. Les macros suivantes permettent de slectionner une banque particulire en positionnant les 2 bits concerns. Il est vident quil nest pas toujours ncessaire de repositionner les 2 bits. Nanmoins, lutilisation de ces macros ne ncessite quune ligne de code supplmentaire, et elle limite fortement les risques derreurs.
;********************************************************************************* ;* MACROS * ;********************************************************************************* ; Changement de banques ; -------------------------------BANK0 macro bcf bcf BANK1 endm macro bsf bcf BANK2 endm macro bcf bsf BANK3 endm macro bsf bsf endm STATUS,RP0 STATUS,RP1 STATUS,RP0 STATUS,RP1 ; passer en banque3 STATUS,RP0 STATUS,RP1 ; passer en banque2 STATUS,RP0 STATUS,RP1 ; passer en banque1 ; passer en banque0

Dclaration des constantes :


Pour faciliter la relecture dun programme, il est prfrable dutiliser des constantes dfinies au pralable dont le nom est plus vocateur quune valeur quelconque. Ici sont dclares les constantes de chaque caractre retranscrit sur sept segments.
; Dclaration des codes permettant d'afficher chaque chiffre sur 7 segments : ; ------------------------------------------------------------------------------------------------UN EQU B'00001100' ;1 DEUX EQU B'10110110' ;2 bit0 : Virgule A TROIS EQU B'10011110' ;3 bit1 : A ==== QUATRE EQU B'11001100' ;4 bit2 : B F || || B CINQ EQU B'11011010' ;5 bit3 : C || G || SIX EQU B'11111010' ;6 bit4 : D ==== SEPT EQU B'01001110' ;7 bit5 : E E || || C HUIT EQU B'11111110' ;8 bit6 : F || D || NEUF EQU B'11011110' ;9 bit7 : G ==== ZERO EQU B'01111110' ;0 TRAIT EQU B'10000000' ;-

==>

1 ==== 6 || || 2 || 7 || ==== 5 || || 3 || 4 || ====

ESME Sudria 2003

p.42/72

Allocation de lespace mmoire :


Pour traiter les donnes, il est indispensable dutiliser des variables. En effet, celles-ci permettent de stocker des valeurs et elles facilitent la comprhension du programme si leur nom est choisi judicieusement. Chaque variable doit disposer dun espace mmoire ddi. Il faut dclarer chacune delles dans une zone mmoire. Le PIC 16F876 dispose de 80 octets de mmoire RAM par banque et de 16 octets de mmoire RAM en zone commune. La mmoire en zone commune est accessible depuis nimporte quelle banque. Nous lutiliserons pour faire les sauvegardes de variables temporaires lors du traitement des interruptions et pour stocker les valeurs de chaque digit car celles-ci doivent tre accessibles tout moment.
;**************************************************************************** ; VARIABLES ZONE COMMUNE * ;**************************************************************************** ; Zone de 16 bytes ; ----------------------CBLOCK 0x70 ; Dbut de la zone (0x70 0x7F) w_temp : 1 ; Sauvegarde registre W status_temp : 1 ; Sauvegarde registre STATUS digit1 : 1 ; dfinition des 7 segments (+ virgule) du 1er digit digit2 : 1 ; dfinition des 7 segments (+ virgule) du 2nd digit digit3 : 1 ; dfinition des 7 segments (+ virgule) du 3me digit digit4 : 1 ; dfinition des 7 segments (+ virgule) du 4me digit ENDC ; Fin de la zone

Le programme sexcute principalement dans la banque 0 (hormis lors des interruptions), donc la majorit des variables est dclare dans lespace mmoire de la banque 0.
;**************************************************************************** ;* DECLARATIONS DES VARIABLES * ;**************************************************************************** ; Zone de 80 bytes ; ----------------------; Allocation de l'espace mmoire de la bank0 et dclaration des variables CBLOCK 0x20 ; Dbut de la zone (0x20 0x6F) menu : 1 ; pointeur de menu choixParam : 1 ; Variable de choix du paramtre modifier ; u(k) = Kp (k) + Ki [u(k-1)+(k)] + Kd [(k)-(k-1)] cligno : 1 ; Variable d'tat de clignotement parametre1 : 1 ; paramtre n1 : Kp parametre2 : 1 ; paramtre n2 : Ki parametre3 : 1 ; paramtre n3 : Kd parametre4 : 1 ; paramtre n4 : Limite d'intgration cmpt1 : 1 ; compteur n1 cmpt2 : 1 ; compteur n2 resultConv : 1 ; rsultat 8 bits de la conversion Analogique -> Numrique resultConv2 : 1 ; ancien rsultat 8 bits de la conversion Analogique -> Numrique result1 : 1 ; rsultat du calcul de la proportionnelle result2 : 1 ; rsultat du calcul de la drive result3 : 1 ; rsultat du calcul de l'intgrale result4 : 1 ; somme de result1 et result2

ESME Sudria 2003

p.43/72

resultPID : 1 resultPID2 : 1 sourceInt : 1 vartemp : 1 vardigit : 1 varparam : 1 var1 : 1 var2 : 1 var3 : 1 produitH : 1 produitL : 1 sommeH : 1 sommeL : 1 diffH : 1 diffL : 1 signe : 1 resultDep : 1 ENDC

; rsultat du calcul du PID ; ancien rsultat du calcul du PID ; source d'interruption ; variable temporaire ; variable de digit ; variable de paramtre ; variable n1 ; variable n2 ; variable n3 ; poids fort du rsultat 16 bits de la multiplication 8x8bits ; poids faible du rsultat 16 bits de la multiplication 8x8bits ; poids fort du rsultat de l'addition 8 bits (dpassement) ; poids faible du rsultat de l'addition 8 bits ; poids fort du rsultat de la soustraction 8 bits ; poids faible du rsultat de la soustraction 8 bits ; bits de signe ; variable de stockage du dpassement des oprations mathmatiques 8 bits ; Fin de la zone

;************************************************************************* ;* DEMARRAGE SUR RESET * ;************************************************************************* org 0x000 ; Adresse de dpart aprs reset goto INIT ; Initialiser

Dtection et traitement des interruptions :


Dtection des interruptions :
La routine interruptions contient tous les tests qui permettent daiguiller les interruptions vers la bonne sous-routine. Tout dabord elle effectue la sauvegarde des diffrents registres. w_temp est la sauvegarde du registre de travail W . Ce registre va tre utilis pour la sauvegarde des autres registres. Cest donc le premier qui doit tre sauv. Au moment de linterruption, on ne peut pas savoir comment sont configurs les bits RP0 et RP1, donc on ne sait pas vers quelle banque ils pointent. De ce fait, il est impratif de sauvegarder W dans la zone de RAM commune. status_temp doit tre sauvegard car aprs le traitement des interruptions, le programme doit reprendre son cours avec le mme statut (notamment dans la mme banque).
;************************************************************************* ;* ROUTINE INTERRUPTION * ;************************************************************************* ;sauvegarder les registres ;------------------------------org 0x004 movwf w_temp swapf STATUS,w movwf status_temp BANK0

; adresse d'interruption ; sauver registre W ; swap status avec rsultat dans w ; sauver status swapp ; passer en banque0

ESME Sudria 2003

p.44/72

Pour tester les interruptions engendres par les bouton-poussoirs, il faut avant tout vrifier que le masque dinterruption sur RB4/7 est activ. Il suffit ensuite de lire le flag dinterruption RRBIF . Par scurit et pour viter le phnomne de rebond , des boucles de test du relchement de chaque bouton sont ajoutes. Si une interruption sur RB4/7 est dtecte, la sous-routine de traitement de cette interruption INTBP est appele puis le flag dinterruption est effac.
; Test et appel des diffrentes interruptions ;----------------------------------------------------INT1 btfsc btfss goto call btfsc goto btfsc goto btfsc goto bcf goto ; Interruption RB4/RB7 ; --------------------------INTCON,RBIE ; tester si interruption RB4/7 autorise INTCON,RBIF ; oui, tester si interruption RB4/7 en cours INT2 ; non sauter INTBP ; oui, traiter interruption RB4/7 PORTB,4 ; tester si BP1 [+] appuy $-1 ; oui, attendre PORTB,5 ; tester si BP2 [-] appuy $-1 ; oui, attendre PORTB,6 ; tester si BP3 [V] appuy $-1 ; oui, attendre INTCON,RBIF ; effacer flag interruption RB4/7 RESTORE ; et fin d'interruption

Pour tester les interruptions gnres par le TIMER1 , il faut vrifier que le masque dinterruption TMR1IE soit activ (attention, ce registre se trouve dans la banque 1). Il suffit ensuite de lire le flag dinterruption TMR1IF (banque 0). Si une interruption sur le timer 1 est dtecte, la sous-routine de traitement INTTMR est appele puis le flag dinterruption est effac.
INT2 bsf btfss goto bcf btfss goto call bcf ; Interruption TMR1 ; ----------------------STATUS,RP0 ; slectionner banque1 PIE1,TMR1IE ; tester si interruption autorise RESTORE ; non sauter STATUS,RP0 ; oui, slectionner banque0 PIR1,TMR1IF ; oui, tester si interruption en cours RESTORE ; non sauter INTTMR1 ; oui, traiter interruption TMR1 PIR1,TMR1IF ; effacer flag interruption

Lors de la fin du traitement, STATUS et W sont restaurs tels quils taient avant linterruption.
RESTORE swapf movwf swapf swapf retfie ; Restaurer registres ; ----------------------status_temp,w ; swap ancien status, rsultat dans w STATUS ; restaurer status w_temp,f ; Inversion L et H de l'ancien W sans modifier Z w_temp,w ; R-inversion de L et H dans W (W restaur sans modifier status) ; return from interruption

ESME Sudria 2003

p.45/72

Traitement des interruptions sur RB4/7 :


Chaque interruption dtecte sur un bouton poussoir a un effet diffrent sur le programme en fonction du menu en cours dexcution. Le menu en cours est point par la variable menu . Un test est donc effectu sur cette variable pour accder au menu point.
;************************************************************************* ;* INTERRUPTION RB4/RB7 * ;************************************************************************* INTBP movf PORTB,w ; Chargement du PORTB movwf sourceInt ; criture dans la variable "sourceInt"

Si le menu point est le menu n1, cest--dire le menu de modification du paramtre Kp, alors le paramtre n1 est : - incrment si linterruption provient du BP1 [+] (si le paramtre dpasse 9, on boucle en le remettant 0), - dcrment si linterruption provient du BP2 [-] (si le paramtre devient infrieur 0, on boucle en le remettant 9), - valid si linterruption provient du BP3 [V] , et la variable menu est efface pour quelle pointe vers le menu n0.
TESTMENU1 decfsz menu,f ; dcrmenter le pointeur de menu goto TESTMENU2 ; menu != 0 ? ; MENU 1 : Menu de modification du paramtre n1 : Kp ; -----------------------------------------------------------------------btfss sourceInt,4 ; bit RB4=1 ? goto TESTM1 incf parametre1,f ; oui -> interruption sur le PB1 [+] -> on incrmente le paramtre 1 movf parametre1,w sublw 0x0A btfsc STATUS,Z ; tester si W = 0 clrf parametre1 ; si parametre1 = 10, on boucle le menu en remettant parametre1 = 0 goto TESTV1 TESTM1 btfss sourceInt,5 ; bit RB5=1 ? goto TESTV1 movf parametre1,w btfsc STATUS,Z ; tester si W = 0 movlw 0x0A ; si parametre1 = 0, on boucle le menu en remettant parametre1 = 10 movwf parametre1 decf parametre1,f ; oui -> interruption sur le PB2 [-] -> on dcrmente le paramtre 1 TESTV1 movlw 0x01 btfss sourceInt,6 ; bit RB6=1 ? goto TESTF1 movlw 0x00 ; oui -> interruption sur le PB3 [V] -> on passe au menu 0 clrf choixParam TESTF1 movwf menu ; passage au menu en vigueur movf parametre1,w ; conversion de parametre1 (chiffres) en digit1 (7 segments) movwf vardigit call CONVDIGIT movwf digit1 goto FINMENU

ESME Sudria 2003

p.46/72

Si le menu point est le menu n2, cest--dire le menu de modification du paramtre Ki, alors le paramtre n2 est : - incrment si linterruption provient du BP1 [+] (si le paramtre dpasse 9, on boucle en le remettant 0), - dcrment si linterruption provient du BP2 [-] (si le paramtre devient infrieur 0, on boucle en le remettant 9), - valid si linterruption provient du BP3 [V] , et la variable menu est efface pour quelle pointe vers le menu n0.
TESTMENU2 decfsz menu,f goto TESTMENU3

; dcrmenter le pointeur de menu ; menu != 0 ?

; MENU 2 : Menu de modification du paramtre n2 : Ki ; -----------------------------------------------------------------------btfss goto incf movf sublw btfsc clrf goto TESTM2 btfss goto movf btfsc movlw movwf decf TESTV2 movlw btfss goto movlw clrf TESTF2 movwf menu movf movwf call movwf goto parametre2,w vardigit CONVDIGIT digit2 FINMENU ; passage au menu en vigueur ; conversion de parametre2 (chiffres) en digit2 (7 segments) 0x02 sourceInt,6 TESTF2 0x00 choixParam ; bit RB6=1 ? ; oui -> interruption sur le PB3 [V] -> on passe au menu 0 sourceInt,5 TESTV2 parametre2,w STATUS,Z 0x0A parametre2 parametre2,f ; bit RB5=1 ? ; tester si W = 0 ; si parametre2 = 0, on boucle le menu en remettant parametre2 = 10 ; oui -> interruption sur le PB2 [-] -> on dcrmente le paramtre 2 sourceInt,4 TESTM2 parametre2,f parametre2,w 0x0A STATUS,Z parametre2 TESTV2 ; bit RB4=1 ? ; oui -> interruption sur le PB1 [+] -> on incrmente le paramtre 2 ; tester si W = 0 ; si parametre2 = 10, on boucle le menu en remettant parametre2 = 0

ESME Sudria 2003

p.47/72

Si le menu point est le menu n3, cest--dire le menu de modification du paramtre Kd, alors le paramtre n3 est : - incrment si linterruption provient du BP1 [+] (si le paramtre dpasse 9, on boucle en le remettant 0), - dcrment si linterruption provient du BP2 [-] (si le paramtre devient infrieur 0, on boucle en le remettant 9), - valid si linterruption provient du BP3 [V] , et la variable menu est efface pour quelle pointe vers le menu n0.
TESTMENU3 decfsz menu,f goto TESTMENU4

; dcrmenter le pointeur de menu ; menu != 0 ?

; MENU 3 : Menu de modification du paramtre n3 : Kd ; ------------------------------------------------------------------------btfss goto incf movf sublw btfsc clrf goto TESTM3 btfss goto movf btfsc movlw movwf decf TESTV3 movlw btfss goto movlw clrf TESTF3 movwf menu movf movwf call movwf goto parametre3,w vardigit CONVDIGIT digit3 FINMENU ; passage au menu en vigueur ; conversion de parametre3 (chiffres) en digit3 (7 segments) 0x03 sourceInt,6 TESTF3 0x00 choixParam ; bit RB6=1 ? ; oui -> interruption sur le PB3 [V] -> on passe au menu 0 sourceInt,5 TESTV3 parametre3,w STATUS,Z 0x0A parametre3 parametre3,f ; bit RB5=1 ? ; tester si W = 0 ; si parametre3 = 0, on boucle le menu en remettant parametre3 = 10 ; oui -> interruption sur le PB2 [-] -> on dcrmente le paramtre 3 sourceInt,4 TESTM3 parametre3,f parametre3,w 0x0A STATUS,Z parametre3 TESTV3 ; bit RB4=1 ? ; oui -> interruption sur le PB1 [+] -> on incrmente le paramtre 3 ; tester si W = 0 ; si parametre3 = 10, on boucle le menu en remettant parametre3 = 0

ESME Sudria 2003

p.48/72

Si le menu point est le menu n4, cest--dire le menu de modification de la limite dintgration, alors le paramtre n4 est : - incrment si linterruption provient du BP1 [+] (si le paramtre dpasse 9, on boucle en le remettant 0), - dcrment si linterruption provient du BP2 [-] (si le paramtre devient infrieur 0, on boucle en le remettant 9), - valid si linterruption provient du BP3 [V] , et la variable menu est efface pour quelle pointe vers le menu n0.
TESTMENU4 decfsz menu,f goto TESTMENU5

; dcrmenter le pointeur de menu ; menu != 0 ?

; MENU 4 : Menu de modification du paramtre n4 : Limite d'intgration ; ---------------------------------------------------------------------------------------------btfss goto incf movf sublw btfsc clrf goto TESTM4 btfss goto movf btfsc movlw movwf decf TESTV4 movlw btfss goto movlw clrf TESTF4 movwf menu movf movwf call movwf goto parametre4,w vardigit CONVDIGIT digit4 FINMENU ; passage au menu en vigueur ; conversion de parametre4 (chiffres) en digit4 (7 segments) 0x04 sourceInt,6 TESTF4 0x00 choixParam ; bit RB6=1 ? ; oui -> interruption sur le PB3 [V] -> on passe au menu 0 sourceInt,5 TESTV4 parametre4,w STATUS,Z 0x0A parametre4 parametre4,f ; bit RB5=1 ? ; tester si W = 0 ; si parametre4 = 0, on boucle le menu en remettant parametre4 = 10 ; oui -> interruption sur le PB2 [-] -> on dcrmente le paramtre 4 sourceInt,4 TESTM4 parametre4,f parametre4,w 0x0A STATUS,Z parametre4 TESTV4 ; bit RB4=1 ? ; oui -> interruption sur le PB1 [+] -> on incrmente le paramtre 4 ; tester si W = 0 ; si parametre4 = 10, on boucle le menu en remettant parametre4 = 0

ESME Sudria 2003

p.49/72

Si le menu point est le menu n5, cest--dire le menu de choix du paramtre modifier, alors choixParam est : - incrment si linterruption provient du BP1 [+] (si le paramtre dpasse 4, on boucle en le remettant 1), - dcrment si linterruption provient du BP2 [-] (si le paramtre devient infrieur 1, on boucle en le remettant 4), - stock dans la variable menu si linterruption provient du BP3 [V].
TESTMENU5 decfsz menu,f goto TESTMENU0

; dcrmenter le pointeur de menu ; menu != 0 ?

; MENU 5 : Menu de choix du paramtre modifier ; ----------------------------------------------------------------btfss sourceInt,5 ; bit RB5=1 ? goto TESTM5 incf choixParam,f ; oui -> interruption sur le PB2 [-] -> on incrmente choixParam movf choixParam,w sublw 0x05 btfss STATUS,Z ; tester si W = 0 goto TESTV5 movlw 0x01 ; si choixParam = 5, on boucle le menu en remettant choixParam = 1 movwf choixParam goto TESTV5 TESTM5 btfsc decfsz goto movlw movwf TESTV5 movlw 0x05 btfsc sourceInt,6 movf choixParam,w movwf menu goto TESTMENU0 ; MENU 0 : Menu de statique : attente d'une interruption ; -------------------------------------------------------------------------sourceInt,6 ; bit RB6=1 ? FINMENU 0x05 menu ; passage au choix du paramtre modifier (menu 5) 0x01 choixParam ; initialisation du pointeur du paramtre modifier FINMENU ; bit RB6=1 ? ; oui => interruption sur le PB3 [V] ; => on passe au menu de modification du paramtre choisi ; passage au menu en vigueur sourceInt,4 choixParam,f TESTV5 0x04 choixParam ; bit RB4=1 ? ; oui -> interruption sur le PB1 [+] -> on dcrmente choixParam ; si choixParam = 0, on boucle le menu en remettant choixParam = 4

btfss goto movlw movwf movlw movwf FINMENU CALL return

AFFICHAGE

; routine d'affichage des paramtres sur l'afficheur LCD ; rafrachissement de l'afficheur ; fin d'interruption RB0/RB4

ESME Sudria 2003

p.50/72

Si le menu point est le menu n0, cest--dire le menu statique, alors si linterruption provient du BP3 [V], la valeur 5 est stocke dans la variable menu pour quelle pointe vers le menu n5, menu de choix du paramtre modifier. choixParam est alors initialise 1.
TESTMENU0 ; MENU 0 : Menu de statique : attente d'une interruption ; -----------------------------------------------------------------------sourceInt,6 ; bit RB6=1 ? FINMENU 0x05 menu ; passage au choix du paramtre modifier (menu 5) 0x01 choixParam ; initialisation du pointeur du paramtre modifier

btfss goto movlw movwf movlw movwf

Une fois toutes les possibilits de menus testes, et une fois le menu en cours trait, le programme appelle la routine AFFICHAGE pour quelle rafrachisse les valeurs transmises lafficheur LCD.
FINMENU CALL return AFFICHAGE ; routine d'affichage des paramtres sur l'afficheur LCD ; rafrachissement de l'afficheur ; fin d'interruption RB4/RB7

Fin du traitement des interruptions sur RB4/7.

Traitement des interruptions du TIMER 1 :


Toutes les 0,5s le timer 1 gnre une interruption. A chacune de ces interruptions, la variable cligno passe alternativement de 1 2. Si choixParam est diffrent de 0 alors le menu en cours est diffrent du menu n0 (menu statique). On fait donc clignoter le curseur. Un test du paramtre point par la variable choixParam est effectu afin de dterminer lemplacement du curseur. Le digit point par choixParam reste fixe et les autres digits sont affichs puis effacs alternativement. Le curseur est alors le seul digit affich en permanence.
;************************************************************************* ;* INTERRUPTION TIMER 1 * ;************************************************************************* INTTMR1 decfsz goto movf movwf movlw movwf

cligno,f TESTPARAM0 choixParam,w varparam 0x02 cligno

; tester la valeur de "cligno" ; cligno != 1 ; cligno = 1 ; passage au choix du paramtre modifier (menu 5)

ESME Sudria 2003

p.51/72

TESTPARAM1 decfsz goto movf movwf call movwf movlw movwf movwf movwf goto TESTPARAM2 decfsz goto movf movwf call movwf movlw movwf movwf movwf goto TESTPARAM3 decfsz goto movf movwf call movwf movlw movwf movwf movwf goto

varparam,f TESTPARAM2 parametre1,w vardigit CONVDIGIT digit1 0x00 digit2 digit3 digit4 FINPARAM varparam,f TESTPARAM3 parametre2,w vardigit CONVDIGIT digit2 0x00 digit1 digit3 digit4 FINPARAM

; dcrmenter le pointeur de paramtre ; choixParam != 0 ? ; conversion de parametre1 (chiffres) en digit1 (7 segments)

; digit2 vide ; digit3 vide ; digit4 vide

; dcrmenter le pointeur de paramtre ; choixParam != 0 ? ; conversion de parametre2 (chiffres) en digit2 (7 segments)

; digit1 vide ; digit3 vide ; digit4 vide

varparam,f TESTPARAM4 parametre3,w vardigit CONVDIGIT digit3 0x00 digit1 digit2 digit4 FINPARAM

; dcrmenter le pointeur de paramtre ; choixParam != 0 ? ; conversion de parametre3 (chiffres) en digit3 (7 segments)

; digit1 vide ; digit2 vide ; digit4 vide

TESTPARAM4 decfsz varparam,f goto TESTPARAM0 movf movwf call movwf movlw movwf movwf movwf goto TESTPARAM0 parametre4,w vardigit CONVDIGIT digit4 0x00 digit1 digit2 digit3 FINPARAM

; dcrmenter le pointeur de paramtre ; choixParam != 0 ? ; conversion de parametre4 (chiffres) en digit4 (7 segments)

; digit1 vide ; digit2 vide ; digit3 vide

ESME Sudria 2003

p.52/72

Une fois toutes les possibilits de paramtres testes, et une fois le paramtre en cours trait, le programme appelle la routine CONVPARAM . Elle effectue la conversion de la valeur numrique de chaque paramtre en une valeur code sur 8 bits (7 segments + 1 virgule). Ensuite, la routine AFFICHAGE rafrachit les valeurs transmises lafficheur LCD.
call FINPARAM CALL return AFFICHAGE ; routine d'affichage des paramtres sur l'afficheur LCD ; rafrachissement de l'afficheur ; fin d'interruption TMR1 CONVPARAM

Fin du traitement des interruptions sur TMR1.

Initialisations :
Initialisation des ports :
Dans cette partie, tous les registres ncessaires la configuration des ports sont initialiss avec les valeurs qui leur ont t assignes au dbut du programme. Ainsi les entres et sorties de chaque port sont dfinies (registres TRISA , TRISB et TRISC ). Lentre analogique est configure par les registres ADCON0 et ADCON1 . Les sorties sont mises 0 pour viter les valeurs alatoires.
;************************************************************************* ;* INITIALISATIONS * ;************************************************************************* INIT ; initialisation PORTS (banques 0 et 1) ; ------------------------------------------------; slectionner la banque0 PORTA ; Sorties PORTA 0 PORTB ; Sorties PORTB 0 PORTC ; Sorties PORTC 0 ADCON0VAL ; Configuration du mode digital/analogique ADCON0 ; criture dans le registre de contrle A/D STATUS,RP0 ; slectionner banque1 ADCON1VAL ; PORTA en mode digital/analogique ADCON1 ; criture dans le registre de contrle A/D DIRPORTA ; Direction PORTA TRISA ; criture dans le registre direction DIRPORTB ; Direction PORTB TRISB ; criture dans le registre direction DIRPORTC ; Direction PORTC TRISC ; criture dans le registre direction

BANK0 clrf clrf clrf movlw movwf bsf movlw movwf movlw movwf movlw movwf movlw movwf

ESME Sudria 2003

p.53/72

Initialisation des registres dinterruptions :


Tout comme les registres de configuration des ports, les registres dinterruptions doivent tre initialiss avec les valeurs assignes prcdemment. Les registres INTCON , PIE1 et T1CON sont donc initialiss pour permettre les interruptions sur les entres RB4/7 et sur le TIMER 1 .
; initialisation des registres d'interruptions (banque 1) ; --------------------------------------------------------------------INTCONVAL ; charger valeur registre interruption INTCON ; initialiser interruptions PIE1VAL ; Initialiser registre PIE1 ; interruptions priphriques 1 STATUS,RP0 ; passer en banque 0 TMR1L ; effacer timer1, 8 lsb TMR1H ; effacer timer1, 8 msb T1CONVAL ; charger valeur registre interruption T1CON ; initialiser interruptions

movlw movwf movlw movwf bcf clrf clrf movlw movwf

Initialisation des variables :


Lors de chaque mise en marche du circuit, certaines variables doivent tre imprativement initialises car si elles sont attribues de faon alatoire, elles peuvent compromettre le bon fonctionnement du programme.
; initialisation variables ; ----------------------------clrf menu ; initialisation de menu pour quil pointe vers le menu gnral clrf choixParam ; initialisation du de la variable de choix du paramtre modifier clrf parametre1 ; initialisation du paramtre n1 : Kp clrf parametre2 ; initialisation du paramtre n2 : Ki clrf parametre3 ; initialisation du paramtre n3 : Kd clrf parametre4 ; initialisation du paramtre n4 : Limite d'intgration movlw 0x02 movwf cligno ; initialisation de la variable d'tat de clignotement clrf resultConv ; initialisation de la variable de conversion A/N clrf resultPID2 ; initialisation de la variable de calcul du PID goto START ; programme principal

Lorsque les initialisations sont termines, lexcution se poursuit dans le programme principal. Celui-ci centralise lappel des diffrentes routines, il coordonne donc les tches qui permettront dobtenir le traitement de lasservissement. Chacune de ces tches doit tre dfinie au pralable.

ESME Sudria 2003

p.54/72

Routines :
La programmation du module dasservissement PID ncessite de nombreuses oprations. La mise en uvre dun tel programme est assez complexe, il doit donc tre dcoup en plusieurs modules ayant chacun une tche diffrente accomplir. Cest le rle des routines qui permettent entre autres de structurer le programme.

Conversion analogique-numrique :
Cette routine ralise lchantillonnage sur une entre analogique. La conversion se fait en plusieurs tapes : - la valeur de lchantillon prcdent est mmorise (car elle est ncessaire au calcul du PID), - le convertisseur est activ par la mise 1 de ADON , - attente de la fin de lacquisition (le convertisseur intgr au PIC a un temps dacquisition Tacq = 19,7s), - la conversion analogique numrique dbute lors de la mise 1 de GO , - attente de la fin de la conversion (le convertisseur intgr au PIC a un temps de conversion Tad = 3,2s), - lecture de la valeur de lchantillon. Chaque chantillon est stock sur 10 bits dans la paire de registres ADRESH et ADRESL . La justification tant faite gauche, et pour des raisons de commodit, on nexploite que les 8 bits de poids fort que lon trouve dans le registre ADRESH .
;***************************************************************** ;* CONVERSION Analogique -> Numrique * ;***************************************************************** ;* entre : * ;* * ;* sortie : resultConv * ;* * ;***************************************************************** CONV movf resultConv,w movwf resultConv2 ; Chargement du rsultat de la conversion prcdente ; Stockage de l'ancien rsultat de la conversion

; 1 - lancement du convertisseur : ADON = 1 ; -------------------------------------------------------bsf ADCON0,ADON ; 2 - attendre que l'acquisition soit effectue ; ------------------------------------------------------movlw movwf LOOPACQ decfsz goto 0x07 cmpt1 cmpt1,f LOOPACQ (Tacq = 19.7s)

; nb de boucles ; initialiser compteur de boucles ; (LOOPACQ = 22s pour cmpt1=x07 et osc=4MHz) ; dcrmenter le compteur de boucles ; if = 0 -> LOOPACQ

ESME Sudria 2003

p.55/72

; 3 - dmarrer la conversion en positionnant le bit GO du registre ADCON0 ; -----------------------------------------------------------------------------------------------bsf ADCON0,GO ; 4 - attendre que la conversion soit termine ; -------------------------------------------------------movlw movwf LOOPAD decfsz goto 0x01 cmpt1 cmpt1,f LOOPAD (2Tad = 3.2s)

; nb de boucles ; initialiser compteur de boucles ; (LOOPAD = 4s pour cmpt1=x01 et osc=4MHz) ; dcrmenter le compteur de boucles ; if = 0 -> LOOPAD

; 5 - Lire le rsultat de la conversion dans ADRESH ; --------------------------------------------------------------movf ADRESH,w movwf resultConv return ; Chargement du registre ADRESH ; Stockage des 8 bits du rsultat de la conversion

Addition :
La routine ADDI ralise laddition des chiffres stocks dans les variables var1 et var2 . Laddition est effectue par linstruction addwf , mais lutilisation de cette routine permet de dtecter les dpassements en interrogeant le registre STATUS,C . Le rsultat est alors stock dans deux octets, sommeL contenant les 8 bits de poids faible et sommeH contenant les ventuels dpassements.
;***************************************************************** ;* ADDITION 8 bits * ;* avec gestion du dpassement * ;***************************************************************** ;* entres : var1 (8 bits) ] variables d'entre non * ;* var2 (8 bits) ] modifies par le programme * ;* * ;* sortie : sommeL (8 bits) * ;* sommeH (8 bits pour le dpassement de capacit) * ;* * ;***************************************************************** ;* var1 + var2 -> [sommeL ; sommeH] * ;***************************************************************** ADDI clrf movf movwf movf addwf btfsc incfsz return sommeH var1,w sommeL var2,w sommeL,f STATUS,C sommeH,f ; effacer dpassement ; charger la variable n1 dans w ; sauver dans sommeL ; charger la variable n2 dans w ; ajouter w et sommeL puis stocker dans somme ; tester si bit de dpassement = 1 ; oui, ajouter au rsultat poids fort

ESME Sudria 2003

p.56/72

Soustraction :
La routine SOUSTRAC soustrait la variable var2 la variable var1 . La soustraction est effectue par linstruction subwf , mais lutilisation de cette routine permet de grer les rsultats ngatifs qui se traduisent par des dpassements de capacit que lon dtecte en interrogeant le registre STATUS,C . Dans le cas dun rsultat ngatif, il faut calculer le complment vrai pour obtenir un rsultat exploitable. Le rsultat est stock dans loctet diffL , et le bit signe,0 reoit le bit de signe du rsultat.
;***************************************************************** ;* SOUSTRACTION 8 bits * ;***************************************************************** ;* entres : var1 (8 bits) ] variables d'entre non * ;* var2 (8 bits) ] modifies par le programme * ;* * ;* sorties : diffL (8 bits) * ;* signe,0 bit de signe du rsultat * ;* * ;***************************************************************** ;* var1 - var2 -> (signe) diffL * ;***************************************************************** SOUSTRAC bcf movf movwf movf subwf btfss goto return COMP bsf comf incf return signe,0 var1,w diffL var2,w diffL,f STATUS,C COMP ; effacer le bit de signe ; charger la variable n1 dans w ; sauver dans diffL ; charger la variable n2 dans w ; soustraire w diffL puis stocker dans diffL ; tester si bit de dpassement = 0 , le rsultat est donc ngatif ; si rsultat <0 , on cherche le complment 2

signe,0 diffL,f diffL,f

; stockage du bit de signe ngatif ; calcul du complment restreint ; calcul du complment vrai (complment 2)

Multiplication :
La routine MULTI multiplie var1 et var2 . Le rsultat ncessite donc 16 bits, donc 2 octets produitH et produitL . Pour illustrer le principe de fonctionnement, voici la ralisation dune multiplication manuelle. Nous multiplions ici 12 par 13, cest une opration de 4x4 bits avec un rsultat sur 8 bits. Ceci afin de simplifier lexplication. Le tableau suivant montre que pour programmer une multiplication, il suffit de multiplier les bits un un en effectuant un dcalage gauche lors du chargement dun nouveau bit multiplicateur.

ESME Sudria 2003

p.57/72

1 1 1 0 0 0 1

1 1 1 0 0 0 1

0 0 0 0 0 0 0

0 1 0 0 0 0 0

12 13 12 0 48 96 156

1 1 0

1 1 0

0 1 0 1

Les rsultats intermdiaires sont cumuls dans la variable produitH , au fur et mesure du traitement. Le calcul dun produit 8x8 bits comporte donc 8 tapes intermdiaires qui correspondent au traitement de chaque bit du multiplicateur.
;***************************************************************** ;* MULTIPLICATION 8 x 8 bits * ;***************************************************************** ;* entres : var1 (8 bits) ] variables d'entre non * ;* var2 (8 bits) ] modifies par le programme * ;* * ;* rsultat sur 16 bits : produitH (8 bits de poids fort) * ;* produitL (8 bits de poids faible) * ;* * ;***************************************************************** ;* var1 * var2 -> [produitH ; produitL] * ;***************************************************************** MULTI clrf clrf movlw movwf movf movwf movf LOOPMULTI rrf btfsc addwf rrf rrf decfsz goto return produitH produitL 0x08 cmpt1 var1,w vartemp var2,w vartemp,f STATUS,C produitH,f produitH,f produitL,f cmpt1,f LOOPMULTI ; effacer le rsultat poids fort ; effacer le rsultat poids faible ; pour 8 bits ; initialiser compteur de boucles ; charger le multiplicateur n1 dans w ; sauver dans vartemp ; charger le multiplicateur n2 dans w ; dcaler le multiplicateur vers la droite ; tester si bit sorti = 1 ; oui, ajouter au rsultat poids fort ; dcaler le rsultat poids fort ; dcaler le rsultat poids faible ; dcrmenter le compteur de boucles ; pas fini, bit suivant

ESME Sudria 2003

p.58/72

Calcul du PID :
La routine PID rsout lquation suivante : u(k) = Kp e(k) + Ki [ u(k-1) + e(k) ] + Kd [ e(k) - e(k-1) ] avec : e(k) : rsultat de la conversion A/D (variable resultConv ) e(k-1) : rsultat de la conversion A/D prcdente ( resultConv2 ) u(k-1) : rsultat prcdent du calcul du PID ( resultPID2 )
;***************************************************************** ;* Calcul du PID * ;***************************************************************** ;* entres : resultConv, resultConv2, resultPID2 * ;* parametre1, parametre2, parametre3, parametre4 * ;* signe * ;* * ;* sorties : resultPID * ;* signe, resultPID2, resultConv2 * ;***************************************************************** ;* u(k) = Kp (k) + Ki [u(k-1)+(k)] + Kd [(k)-(k-1)] * ;***************************************************************** PID ; resultPID = ; [ parametre1 + parametre2 + parametre3 ] * resultConv + parametre2 * resultPID2 - parametre3 * resultConv2

; -1 < parametre1, parametre2, parametre3 < 10 ; signe,1 ; signe,2 ; signe,3 ; signe,4 ; signe,5 contient le signe de resultConv centr sur 0 contient le signe de resultConv2 centr sur 0 contient le signe de resultPID centr sur 0 contient le signe de resultPID2 centr sur 0 contient le signe de result4 = signe de result1 = signe de result3 = signe de result2

La valeur des chantillons est code sur 8 bits (registre ADRESH ). Cette valeur correspond une tension comprise entre 5V et +5V. Il est donc ncessaire dtalonner les donnes avant de commencer rsoudre lquation. Ltalonnage est effectu comme nous lavons prcdemment dfini dans la partie talonnage des donnes . Cela consiste simplement recentrer les donnes sur 0, cest--dire soustraire 127 la variable dentre.
; 1) Recentrer la valeur du signal chantillonn sur 0 ; -----------------------------------------------------------------; -5V < E(k) < +5V => 0 < resultConv < 255 ; => -127 < resultConv - 127 < +128 resultConv,w ; charger resultConv dans var1 var1 D'127' ; charger '127' dans var2 var2 SOUSTRAC ; appel de la routine de soustraction diffL,w ; stockage de resultConv recentr sur 0 resultConv signe,1 ; effacer signe,1 signe,0 ; stockage du signe du rsultat de la soustraction dans signe,1 signe,1 resultDep ; effacer l'octet de traitement des dpassements

movf movwf movlw movwf call movf movwf bcf btfsc bsf clrf

ESME Sudria 2003

p.59/72

Une fois ltalonnage effectu, le calcul dbute. Celui-ci est scind en plusieurs rsultats intermdiaires afin de simplifier le traitement des dpassements. En effet, chaque rsultat intermdiaire dcoule dune multiplication dont le rsultat occupe jusqu 16 bits. Ds quil y a un dpassement, on lajoute ou on le soustrait la variable resultDep en fonction du signe du rsultat sur lequel apparat ce dpassement. Si la fin du calcul resultDep est diffrent de zro, il y a un dpassement et le signal devra tre crt pour viter des valeurs aberrantes. Le premier rsultat intermdiaire correspond ( Kp + Ki + Kd ) . e(k) Son bit de signe est stock dans le bit signe,1 .
; 2) Calculer : result1 = [ parametre1 + parametre2 + parametre3 ] * resultConv ; ----------------------------------------------------------------------------------------------------parametre1,w ; charger parametre1 dans var1 var1 parametre2,w ; charger parametre2 dans var2 var2 ADDI ; appel de la routine d'addition sommeL,w ; stocker la somme de parametre1 et parametre2 dans var2 var2 parametre3,w ; charger parametre3 dans var1 var1 ADDI ; appel de la routine d'addition sommeL,w ; stocker la somme des parametre1, 2 et 3 dans var2 var2 resultConv,w ; charger resultConv dans var1 var1 MULTI ; appel de la routine de multiplication produitH,w ; stockage de produitH dans resultDep resultDep produitL,w ; stockage de produitL dans result1 result1 ; le signe de result1 est donn par signe,1

movf movwf movf movwf call movf movwf movf movwf call movf movwf movf movwf call movf movwf movf movwf

Le second rsultat intermdiaire correspond Ki . u(k-1) Son bit de signe est stock dans le bit signe,4 . Sil prsente un dpassement, resultDep est modifi en consquence.
; 3) Calculer : result2 = parametre2 * resultPID2 ; ------------------------------------------------------------movf resultPID2,w ; charger resultPID2 dans var1 movwf var1 movf parametre2,w ; charger parametre2 dans var2 movwf var2 call MULTI ; appel de la routine de multiplication btfss produitH,0 ; resultDep est incrment si produitH =! 0 goto SKIPDEP1 ; produitH = 0 btfss signe,4 ; prohuitH > 0 incf resultDep,f ; result2 > 0 btfsc signe,4 decf resultDep,f ; result2 =< 0 SKIPDEP1 movf produitL,w ; stockage de produitL dans result2 movwf result2 ; le signe de result2 est donn par signe,4

ESME Sudria 2003

p.60/72

Le troisime rsultat intermdiaire correspond Kd . e(k-1) Son bit de signe est stock dans le bit signe,2 . Sil prsente un dpassement, resultDep est modifi en consquence.
; 4) Calculer : result3 = parametre3 * resultConv2 ; ---------------------------------------------------------------movf movwf movf movwf call incf decfsz goto goto TRAITDEP2 btfss incf btfsc decf SKIPDEP2 movf movwf parametre3,w var1 resultConv2,w var2 MULTI produitH,f produitH,f TRAITDEP2 SKIPDEP2 signe,2 resultDep,f signe,2 resultDep,f produitL,w result3 ; charger parametre3 dans var1 ; charger resultConv2 dans var2 ; appel de la routine de multiplication ; tester la valeur de produitH ; prohuitH > 0 ; produitH = 0 ; result3 > 0 ; result3 =< 0 ; stockage de produitL dans result3 ; le signe de result3 est donn par signe,2

Les calculs intermdiaires sont maintenant termins. Il reste tester si leur dpassement cumul est nul. Dans le cas contraire, il est inutile de poursuivre le calcul, car le signal doit tre crt sa valeur maximale (soit 255) si resultDep est positif, ou sa valeur minimale (soit 0) sil est ngatif.
incf decfsz goto goto TRAITDEP3 movf btfsc goto movlw goto DEPASSNEG movlw goto SKIPDEP3 resultDep,f resultDep,f TRAITDEP3 SKIPDEP3 resultDep,w STATUS,Z DEPASSNEG D'255' SUITECR4 D'0' SUITECR4

; tester la valeur de resultDep ; resultDep =! 0 ; resultDep = 0 ; charger resultDep dans w ; tester si w = 0 ; resultDep < 0 => on crte le signal sa valeur min : 0 ; resultDep > 0 => on crte le signal sa valeur max : 255 ; il y a dpassement positif => charger '255' dans w ; il y a dpassement ngatif => charger '0' dans w

S'il ny a pas de dpassement, ou si ces dpassements sannulent, le calcul de lquation se poursuit.

ESME Sudria 2003

p.61/72

Les deux premiers rsultats intermdiaires sont additionns en tenant compte de leur signe respectif. Si leurs signes sont diffrents, alors cest une soustraction quil faut raliser. On obtient un quatrime rsultat intermdiaire dont le bit de signe est stock dans le bit signe,5 .
; 5) Additionner : result4 = result1 + result2 ; ------------------------------------------------------movf movwf movf movwf bcf btfss goto btfss goto bsf goto RCPOSITIF3 btfsc goto SIGNEQU3 call movf goto SIGNDIFF3 btfss goto movf movwf movf movwf SKIPINV3 call movf btfsc bsf SUITECR3 movwf result1,w var1 result2,w var2 signe,5 signe,1 RCPOSITIF3 signe,4 SIGNDIFF3 signe,5 SIGNEQU3 signe,4 SIGNDIFF3 ADDI sommeL,w SUITECR3 signe,1 SKIPINV3 result2,w var1 result1,w var2 SOUSTRAC diffL,w signe,0 signe,5 result4 ; charger result1 dans var1 ; charger result2 dans var2 ; initialisation du bit de signe de result4 ; test sur le signe de result1 ; result1 >= 0 ; result1 < 0 ; result2 >= 0 et result1 < 0 ; result4 est ngatif ; result2 < 0 et result1 < 0 ; result1 >= 0 ; result2 < 0 et result1 >= 0 ; result2 >= 0 et result1 >= 0 ; appel de la routine d'addition

; test sur le signe de result1 ; result1 > 0 et result2 < 0 ; result1 < 0 et result2 > 0 ; permuter result1 et result2 avant de les soustraire

; appel de la routine de soustraction ; test du signe du rsultat de la soustraction ; result4 est ngatif ; le signe de result4 est donn par signe,5

Pour terminer le calcul, il reste soustraire les deux derniers rsultats intermdiaires en tenant toujours compte de leur signe. Si leurs signes sont diffrents cest une addition quil faut raliser.

ESME Sudria 2003

p.62/72

On obtient le rsultat final resultPID dont le bit de signe est stock dans le bit signe,3 .
; 6) Soustraire : resultPID = result4 - result3 ; ------------------------------------------------------movf movwf movf movwf bcf btfss goto btfss goto goto RCPOSITIF4 btfss goto SIGNDIFF4 btfsc bsf call movf goto SIGNEQU4 btfss goto movf movwf movf movwf SKIPINV4 call movf btfsc bsf SUITECR4 movwf result4,w var1 result3,w var2 signe,3 signe,5 RCPOSITIF4 signe,2 SIGNDIFF4 SIGNEQU4 signe,2 SIGNEQU4 signe,5 signe,3 ADDI sommeL,w SUITECR4 signe,5 SKIPINV4 result3,w var1 result4,w var2 SOUSTRAC diffL,w signe,0 signe,3 resultPID ; charger result4 dans var1 ; charger result3 dans var2 ; initialisation du bit de signe de resultPID ; test sur le signe de result4 ; result4 >= 0 ; result4 < 0 ; result3 >= 0 et result4 < 0 ; result3 < 0 et result4 < 0 ; result4 >= 0 ; result3 >= 0 et result4 >= 0 ; result3 < 0 et result4 >= 0 ; test sur le signe de result4 => resultPID est du signe de result4 ; resultPID est ngatif ; appel de la routine d'addition

; test du signe de result4 ; result4 > 0 et result3 > 0 ; result4 < 0 et result3 < 0 ; permuter result3 et result4 avant de les soustraire

; appel de la routine de soustraction ; test du signe du rsultat de la soustraction ; resultPID est ngatif ; le signe de resultPID est donn par signe,3

Le calcul du PID est maintenant ralis, cependant cette valeur doit tre dcentre conformment au formatage des donnes dfini prcdemment.

ESME Sudria 2003

p.63/72

En effet, resultPID doit tre compris entre 0 et 255 pour pouvoir tre inject sur le PORTC. Il suffit donc dajouter 127 resultPID . Dans le cas o la valeur de resultPID centre sur 0 est ngative, il faut soustraire resultPID 127.
; 7) Dcentrer la valeur du signal corrig pour qu'il soit compris entre 0 et 255 ; --------------------------------------------------------------------------------------------------; -127 < resultPID < +128 => 0 < resultPID + 127 < 255 ; => -5V < E(k) < +5V movf movwf bcf btfsc bsf movlw movwf movf movwf movwf btfsc goto bcf call movf goto SOUSPID bsf call movf FINPID movwf return resultConv,w resultConv2 signe,2 signe,1 signe,2 D'127' var1 resultPID,w var2 resultPID2 signe,3 SOUSPID signe,4 ADDI sommeL,w FINPID signe,4 SOUSTRAC diffL,w resultPID ; mmoriser le rsultat de la conversion centr sur 0

; mmoriser le signe du rsultat de la conversion centr sur 0 dans signe,2 ; charger '127' dans var1 ; charger resultPID dans var2 ; mmoriser le rsultat du calcul du PID centr sur 0 ; mmoriser le signe du rsultat du calcul du PID centr sur 0 dans signe,4 ; resultPID centr sur 0 est positif ; appel de la routine d'addition

; resultPID centr sur 0 est ngatif ; appel de la routine de soustraction

; stockage de resultPID compris entre 0 et 255

ESME Sudria 2003

p.64/72

Conversion de chiffres en digits :


La routine CONVDIGIT ralise la conversion de la variable vardigit en un code 8 bits. Ce code reprsente laffichage sur sept segments du chiffre contenu dans vardigit . Cette routine permet donc dobtenir la reprsentation sur sept segments (plus une virgule) dune valeur comprise entre 0 et 9. Dans le cas dune valeur errone qui ne se trouverait pas dans cet encadrement, la routine retourne le code dun digit reprsentant un trait . Ainsi, si lon visualise un trait sur lun des digits de lafficheur LCD, cela indique une erreur.
;***************************************************************** ;* CONVERSION Chiffres -> Digits * ;***************************************************************** ;* entre : vardigit * ;* * ;* sortie : w * ;***************************************************************** CONVDIGIT btfss goto movlw goto DIGITUN decfsz goto movlw goto DIGITDEUX decfsz goto movlw goto DIGITTROIS decfsz goto movlw goto DIGITQUATRE decfsz goto movlw goto DIGITCINQ decfsz goto movlw goto STATUS,Z DIGITUN ZERO FINCONV vardigit,f DIGITDEUX UN FINCONV vardigit,f DIGITTROIS DEUX FINCONV vardigit,f DIGITQUATRE TROIS FINCONV vardigit,f DIGITCINQ QUATRE FINCONV vardigit,f DIGITSIX CINQ FINCONV ; tester si W = 0

; dcrmenter le chiffre traiter ; var1 = 0 ?

; dcrmenter le chiffre traiter ; var1 = 0 ?

; dcrmenter le chiffre traiter ; var1 = 0 ?

; dcrmenter le chiffre traiter ; var1 = 0 ?

; dcrmenter le chiffre traiter ; var1 = 0 ?

ESME Sudria 2003

p.65/72

DIGITSIX decfsz goto movlw goto DIGITSEPT decfsz goto movlw goto DIGITHUIT decfsz goto movlw goto DIGITNEUF decfsz goto movlw goto

vardigit,f DIGITSEPT SIX FINCONV vardigit,f DIGITHUIT SEPT FINCONV vardigit,f DIGITNEUF HUIT FINCONV vardigit,f DIGITERROR NEUF FINCONV

; dcrmenter le chiffre traiter ; var1 = 0 ?

; dcrmenter le chiffre traiter ; var1 = 0 ?

; dcrmenter le chiffre traiter ; var1 = 0 ?

; dcrmenter le chiffre traiter ; var1 = 0 ?

DIGITERROR movlw TRAIT FINCONV return

ESME Sudria 2003

p.66/72

Conversion des paramtres en digits :


La routine CONVPARAM ralise la conversion de lensemble des quatre paramtres que lon doit visualiser sur lafficheur. Cette routine fait appel la prcdente pour ractualiser la valeur de chaque paramtre sur lcran LCD.

;***************************************************************** ;* CONVERSION des paramtres en digits * ;***************************************************************** ;* entres : parametre1, parametre2, parametre3, parametre4 * ;* * ;* sorties : digit1, digit2, digit3, digit4 * ;* * ;***************************************************************** CONVPARAM movf movwf call movwf movf movwf call movwf movf movwf call movwf movf movwf call movwf return parametre1,w vardigit CONVDIGIT digit1 parametre2,w vardigit CONVDIGIT digit2 parametre3,w vardigit CONVDIGIT digit3 parametre4,w vardigit CONVDIGIT digit4 ; conversion de parametre1 (chiffres) en digit1 (7 segments)

; conversion de parametre2 (chiffres) en digit2 (7 segments)

; conversion de parametre3 (chiffres) en digit3 (7 segments)

; conversion de parametre4 (chiffres) en digit4 (7 segments)

ESME Sudria 2003

p.67/72

Affichage des paramtres par une transmission srie :


La routine AFFICHAGE gnre deux signaux synchroniss qui permettent dtablir un transfert de donnes srie du PIC vers le contrleur LCD. Un signal Data est mis sur la pin RB1 du PORTB et le signal dhorloge correspondant est disponible sur la pin RB0 . Pour mettre jour lafficheur, le driver LCD doit recevoir un paquet de 36 bits synchronis par un signal dhorloge.

Les 36 bits envoys sont organiss de la faon suivante : - le dbut de lenvoi est signal par un bit de start (les instructions nop ninfluencent pas le programme, elles ont pour seul but de crer un retard pour permettre le temps dtablissement des signaux)
;***************************************************************** ;* AFFICHAGE (transmission srie des donnes) * ;***************************************************************** ;* entres : digit1, digit2, digit3, digit4 * ;* * ;* sortie : * ;* * ;***************************************************************** AFFICHAGE bcf nop bsf nop bcf nop bsf nop bsf PORTB,1 PORTB,0 PORTB,0 PORTB,1 PORTB,0 ; Mise 0 du signal DATA ; Mise 1 du signal CLOCK ; Mise 0 du signal CLOCK ; Mise 1 du signal DATA ; Mise 1 du signal CLOCK

- les 4 octets correspondant au code des quatre digits (variables digit1 digit4 ) sont envoys les uns aprs les autres. La transmission se fait du bit le moins significatif au bit le plus significatif.
movf call movf call movf call movf call digit4,w AFFDIGIT digit3,w AFFDIGIT digit2,w AFFDIGIT digit1,w AFFDIGIT ; charger le 1er octet envoyer ; Appel de la routine de transmission d'un mot de 8 bits ; charger le 2me octet envoyer ; Appel de la routine de transmission d'un mot de 8 bits ; charger le 3me octet envoyer ; Appel de la routine de transmission d'un mot de 8 bits ; charger le 4me octet envoyer ; Appel de la routine de transmission d'un mot de 8 bits
p.68/72

ESME Sudria 2003

- il faut transfrer un paquet de 36 bits pour que le driver puisse exploiter ce signal. Jusquici, nous avons envoy un bit de start et quatre octets, soit 33 bits. Il faut donc ajouter deux bits vides et un bit de fin pour terminer la transmission.
movlw movwf movlw movwf LOOPAFF2 rrf bcf btfsc bsf btfss bcf nop bsf B'00000100' vartemp 0x03 cmpt1 vartemp,f PORTB,0 STATUS,C PORTB,1 STATUS,C PORTB,1 PORTB,0 ; charger les bits permettants de complter la srie de 36 bits transmis ; stocker l'octet transmettre dans vartemp ; 3 boucles pour transmettre les 3 bits manquants ; initialiser compteur de boucles ; dcaler vers la droite ; Mise 0 du signal CLOCK ; tester le bit de dpassement C ; C=1 -> Mise 1 du signal DATA ; tester le bit de dpassement C ; C=0 -> Mise 0 du signal DATA ; Mise 1 du signal CLOCK ; dcrmenter le compteur de boucles ; si = 0 -> LOOPAFF2 ; Mise 0 du signal DATA ; Mise 0 du signal CLOCK

decfsz cmpt1,f goto LOOPAFF2 bcf bcf return PORTB,1 PORTB,0

Transmission srie dun octet :


La sous-routine AFFDIGIT est intgre dans la routine AFFICHAGE . Elle gnre un signal Data et un signal dhorloge synchroniss permettant de transmettre un octet.
AFFDIGIT movwf vartemp movlw movwf LOOPAFF1 rrf bcf btfsc bsf btfss bcf nop bsf 0x08 cmpt1 vartemp,f PORTB,0 STATUS,C PORTB,1 STATUS,C PORTB,1 PORTB,0

; stocker l'octet transmettre dans vartemp ; 8 boucles pour afficher un octet (1 mot de 8 bits) ; initialiser compteur de boucles ; dcaler vers la droite ; Mise 0 du signal CLOCK ; tester le bit de dpassement C ; C=1 -> Mise 1 du signal DATA ; tester le bit de dpassement C ; C=0 -> Mise 0 du signal DATA ; Mise 1 du signal CLOCK ; dcrmenter le compteur de boucles ; si = 0 -> LOOPAFF1

decfsz cmpt1,f goto LOOPAFF1 return

ESME Sudria 2003

p.69/72

Programme principal :
Le programme principal centralise les appels des diffrentes routines quil est ncessaire dexcuter pour raliser lasservissement. Lors du dmarrage, le programme commence par une phase dinitialisation de lafficheur et du convertisseur analogique-numrique : - les paramtres sont convertis et cods sur sept segments, - la valeur de chaque digit est transmise au contrleur LCD via une liaison srie, - une premire acquisition et une conversion du signal dentre analogique sont effectues (il est indispensable de donner une valeur e(k-1) avant de commencer le calcul du PID). Ensuite, une boucle infinie effectue en permanence la correction voulue et la restitue sur le PORTC. Cette correction se fait en plusieurs tapes : - acquisition et conversion analogique numrique dun chantillon, - calcul du PID, - stockage du rsultat sur le PORTC.
;********************************************************************************* ;* PROGRAMME PRINCIPAL * ;********************************************************************************* START org CALL CALL CALL 0x300 CONVPARAM AFFICHAGE CONV ; routine de conversion des paramtres (chiffres) en digits (7segments) ; routine d'affichage des paramtres sur l'afficheur LCD (initialisation) ; routine d'acquisition et de conversion du signal d'entre analogique ; (une premire acquisition est ncessaire ; avant de pouvoir calculer le PID) ; routine d'acquisition et de conversion du signal d'entre analogique ; routine de calcul du PID ; Chargement du rsultat du calcul du PID ; Ecriture sur le PORTC des 8 bits du rsultat du calcul du PID

LOOP CALL CALL movf CONV PID resultPID,w

movwf PORTC goto end LOOP

ESME Sudria 2003

p.70/72

D SYNTHSE
Au cours de cette tude les diffrentes parties qui composent un module dasservissement P.I.D. dune MCC ont t tudies. savoir : La programmation du P.I.D. Les conversions analogique-numrique et numrique-analogique. Les adaptateurs de tensions. La gestion des boutons-poussoirs. Laffichage, sur un cran LCD 4 digits, des paramtres de correction du P.I.D. par lintermdiaire dun driver LCD.

Nous pouvons qualifier ce projet de pluridisciplinaire. En effet, nous avons travaill dans diffrents domaines tels que : llectronique analogique, llectronique numrique, lautomatique et linformatique pour la programmation du P.I.D. En dehors de laspect technique, ce projet nous a permis de nous rendre compte de limportance de la gestion du temps et de la rpartition des tches au sein du groupe.

Amliorations envisages
Nous envisageons une amlioration de ce module en y ajoutant : - Un filtre en sortie du CNA pour obtenir un signal de sortie plus stable. - La gestion de la limite dintgration.

ESME Sudria 2003

p.71/72

E SOURCES
- Datasheets des composants suivants : 16F876 (PIC) TL084 (AOP) AD557 (CNA) MM5452 (driver LCD) VI502 (afficheur LCD) - Projet de premire anne : enregistreur numrique (par BRUYERE Philippe GOMBERT Benjamin VENCE Eric) - Programmation 16f876 par Bigonoff - www.abcelectronique.com - kudelsko.free.fr - fribotte.free.fr/bdtech/PidSurPic/PidSurPic1.html - perso.wanadoo.fr/yves.heilig/ElecRob/page1.htm

REMERCIEMENTS
Nous tenons remercier M. Touseau et M. At Abderrahim pour leur aide, leurs conseils, leur disponibilit et lencadrement quils nous ont accord tout au long de ce projet. Nous remercions galement Mr Deleau pour son soutien logistique.

ESME Sudria 2003

p.72/72

Vous aimerez peut-être aussi