Vous êtes sur la page 1sur 7

CAN & MLI

A- Convertisseur analogique numérique


I- Mise en situation: «Système robot aspirateur »
Pour assure la protection de la lampe ultraviolet, le
robot est équipé d’un capteur de température qui
mesure en temps réel la température de la lampe.
Dés que la température atteint un seuil fixé à 80°C, le
robot s’arrête et ne prendra service que si la
température de la lampe descente à 40°.
Pour avertir l’utilisateur le robot affiche en
permanence la température de la lampe sur un
afficheur LCD.

La détection de la température est assurée par le capteur LM35, ce capteur


fournit à sa sortie une tension proportionnelle à la température (10mV/°C).
La plage de la température détectée s’étant de 2°C à 150°C.
1- Compléter les phrases suivantes par (numérique-analogique)
-Les données issu par le capteur sont de type :…………………………………
- Le PIC qui commande le robot, est conçu pour traiter des données …………………………
2-Que doit-on faire pour que le PIC traiter les données issu du capteur ?
…………………………..……………………………………………………………………………………………

3- Le schéma de principe d’un CAN est donné par la figure suivante :

………………………… …………………………
………………………… …………………………

4- Certains microcontrôleurs possèdent un CAN (ADC) interne. Citer les broches spécifiques pour les
entrées analogiques des pics suivants :

-16F876A : ………………..……………………………………………………………………………………………

-16F877A : ………………..……………………………………………………………………………………………

Problème: Comment peut-on gérer fonctionnement du CAN interne d’un PIC ?

1
II- Convertisseur analogique numérique (CAN):
1- Module convertisseur CAN d’un PIC 16F87X
Les PIC 16F87X tel que le PIC 16F876 et le PIC 16F877 possèdent un convertisseur analogique
numérique 10 bits, ce dernier permet de convertir une tension analogique entre deux seuils de
références Vref- et Vref+ en une valeur numérique comprise entre 0 et 210 - 1 =1023

Pour exploiter ce convertisseur il est nécessaire de configurer certains registres dans le microcontrôleur,
dans la suite de ce cours, on s’intéressera uniquement au registre ADCON1 pour sélectionner et activer
les entrées analogiques.

2- Registre ADCON1
ADCON1 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0

Les bits PCFG3 … PCFG0 : bits de contrôle de la configuration des ports :Ces bits permettent de
choisir le partage entre entrées analogiques et digitales sur les ports A et E .Ils permettent
également de choisir pour Vref+ entre Vdd et RA3 et pour Vref- entre Vss et RA2 selon le tableau
suivant :
:
PIC 16F876
PIC 16F877
4 bits PCFG Tensions
PORTE PORTA De références

PCFG0 PCFG0 PCFG0 PCFG0 AN7/RE2 AN6/RE1 AN5/RE0 AN4/RA5 AN3/RA3 AN2/RA2 AN1/RA1 AN0/RA0 Vref+ Vref-

0 0 0 0 A A A A A A A A VDD VSS
0 0 0 1 A A A A Vref+ A A A RA3 VSS
0 0 1 0 D D D A A A A A VDD VSS
0 0 1 1 D D D A Vref+ A A A RA3 VSS
0 1 0 0 D D D D A D A A VDD VSS
0 1 0 1 D D D D Vref+ D A A RA3 VSS
0 1 1 X D D D D D D D D VDD VSS
1 0 0 0 A A A A Vref+ Vref- A A RA3 RA2
1 0 0 1 D D A A A A A A VDD VSS
1 0 1 0 D D A A Vref+ A A A RA3 VSS
1 0 1 1 D D A A Vref+ Vref- A A RA3 RA2
1 1 0 0 D D D A Vref+ Vref- A A RA3 RA2
1 1 0 1 D D D D Vref+ Vref- A A RA3 RA2
1 1 1 0 D D D D D D D A VDD VSS
1 1 1 1 D D D D Vref+ Vref- D A RA3 RA2

*A: analogique *D: numérique * VDD=VCC= 5V * VSS=GND= 0V


Notes:
- On s’intéressera uniquement au cas où VREF- =VSS=0V et VREF+=VDD = 5V.
-Au reset ADCON1 = 00000000 : cela signifie que les 5 bits de port A et les 3 bits de Port E sont
configurés en entrées analogiques.
Pour récupérer les 5 bits du port A et les trois bits du port E en tant que I/O numériques (digitales) il faut
écrire la valeur ’0 6’ dans ADCON1.

2
Bits « 6 : 5 : 4 » : non utilisés  lire 0.
Le bit ADFM
Bit 7 : ADFM
Le convertisseur C.A.N fournit un nombre binaire naturel de 10 bits (B9 B8 B7 B6 B5 B4 B3 B2 B1 B0)
Deux registres (2 X 8 bits) sont nécessaire pour stocker le résultat de la conversion. Ce sont les registres :
 ADRESH
 ADRESL
Deux formats sont disponibles suivant la valeur du bit ADFM :
ADFM =1 :le résultat de la conversion est justifié à droite :ADRESH ne contient que les 2 MSB du
résultat . Les 6 MSB de ce registre sont lus comme des « 0 »

ADRESH ADRESL
0 0 0 0 0 0 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0

10 bits du résultat

ADFM =0 :le résultat de la conversion est justifié à gauche :ADRESL ne contient que les 2 LSB du
résultat . Les 6 LSB de ce registre sont lus comme des « 0 »

ADRESH ADRESL
B9 B8 B7 B6 B5 B4 B3 B2 B1 B0 0 0 0 0 0 0

10 bits du résultat

Exemple: Donner la configuration de ADCON1 avec AN0/RA0 entrée analogique et une justification à droite.
ADCON1
ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0
1 0 0 0 0 0 0 0

1- fonctions prédéfinies par mikropascal pro pour gérer un CAN (ADC) :


ADC_Init() ; // Initialise le module convertisseur et le configurer avec les réglages suivants:
Vref-=0 ;Vref+ = 5V , Utilisation de l’horloge interne pour la conversion.
N : word // déclaration d’une variable de type word
N := ADC_Get_Sample(1) // lecture de la valeur lue par le convertisseur sur le canal 1
N := ADC_Read (2) // lecture après initialisation et démarrage de la conversion sur le canal 2
☺Activité N°1 :
Convertir une tension comprise entre 0 et 5V fournit par un potentiomètre branché sur RA3, et afficher le
résultat sous forme binaires avec des LEDs. (Justification à droite)

SORTIE NUMERIQUE
9 8 7 6 5 4 3 2 1 0
ENTREE
Ue Canal 3 A.D.C N 2 2 2 2 2 2 2 2 2 2
ANALOGIQUE
?
?

?
?
?
?
?
?
?
?

RV1
Ue N U1
40%

9 21
1k OSC1/CLKIN RB0/INT
10 22
OSC2/CLKOUT RB1
23
5V 1023 2
3
RA0/AN0
RA1/AN1
RB2
RB3/PGM
RB4
24
25
4 26
RA2/AN2/VREF-/CVREF RB5
5 27
RA3/AN3/VREF+ RB6/PGC
6 28
RA4/T0CKI/C1OUT RB7/PGD
7
RA5/AN4/SS/C2OUT
11
RC0/T1OSO/T1CKI

N= …………
1 12
MCLR/Vpp/THV RC1/T1OSI/CCP2
13
RC2/CCP1
14
RC3/SCK/SCL
15
RC4/SDI/SDA
+88.8 16
Volts
RC5/SDO
RC6/TX/CK
RC7/RX/DT
17
18 C.A.N.
PIC16F876A 3
1°) Configurer les entrées /sorties :
TRISA TRISB TRISC
1 .. … … … .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
2°) Configurer le registre ADCON 1
ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0
… 0 0 0 … … … ...

3°) Compléter puis saisir le programme ci-contre puis simuler et vérifie le fonctionnement :
program activite_1_convertisseur;
var N : word; // déclaration d'une variable N de type mot sur 16bits car le résultat de conversion est sur 10 bits
begin
ADCON1:=%................ ; // Configuration des entrées du portA comme entrées analogiques y compris RA3
// Et justification des 10 bits à droite
TRISA := $.........; // PORTA Entrées
TRISB := ……….; // PORTB Sorties
TRISC := 0; // PORTC Sorties
while true do
begin
N := ADC_Read(…….); // lecture de la valeur lue par le convertisseur sur le canal 3
PORTB:=ADRESL; PORTC:=ADRESH;
end;
end.
N.B. Autre solution : PORTB := N; // Les 8 bits de plus faibles poids sont aux PORTB
PORTC := N shr(8); // Afficher les 2 bits de fort poids sur RC0 et RC1
☺Activité N°2 :On désire lire et afficher la température de la lampe ultraviolet du robot en utilisant un
microcontrôleur de type PIC 16F876A, un afficheur LCD et un capteur de température LM35 et ce
conformément à la figure suivante :

1-Le capteur LM35 fournit à sa sortie une tension (V) proportionnelle à la température (T) avec un
coefficient de proportionnalité (10mV/°C), exprimer T (°C) en fonction de V (mV):
…………………………………………………………………………………………………………………..
2-Le CAN converti toute tension (V) de (0V à 5V) en un nombre (N) sur 10 bits de (0 à 1023), exprimer (V
en mV) en fonction de N puis (T en °C) en fonction de N.
……………………………………………………………………………………………………………………………
………………………………………………………………………………………………………………………….

4
1-Compléter et commenter le programme suivant :
Program conversion; Lcd_cmd(_LCD_CURSOR_OFF);
var Lcd_out(1,1’T=’);
valeur_conversion : word ; //2 octets car le resultat de Adcon1:= %................... {justification des 10 bits a droite et RA0
conversion de la tension sur 10 bits entrée analogique et VREF- =VSS et VREF+=VDD}
Variable_calcul : real ; {4 octets pour le calcul pour ne Adc_init(); // initialisation du module CAN
pas avoir un dépassement de taille lors de la multiplication} While true do
Temperature : byte ; {1 octet car la température est Begin
comprise entre 2 et 150} Valeur_conversion:=adc_read(…);{convertir la tensionV au
Valeur_affichage : string[3] ;{chaine de 3 caractères RA0 en un nombre N de 10bits puis lire N sur 16bits}
pour afficher la température} Variable_calcul:=(Variable_conversion*500)/1023; //………
LCD_RS : sbit at portc.0 ; Temperature := Variable_calcul;
LCD_EN : ………………………. ; //Transformation en octet de la partie entière.
LCD_D4 : ……………………….; Bytetostr(Temperature,valeur_affichage);
LCD_D5 : ……………………… ; //Conversion de la température en texte.

LCD_D6 : ……………………… ; Lcd_out(1,3, valeur_affichage); {Affichage de la valeur de la


température}
LCD_D7: ……………………….;
LCD_RS_Direction : sbit at TRISC.0 ; Lcd_chr(1,6,%11011111);//Affichage du symbole degré :°.
LCD_EN_Direction : ………………… ; Lcd_out(1,7,’C’); // …………………
LCD_D4_Direction : ………………… ;
Delay_ms(500); //…………………..
LCD_D5_Direction : ………………….;
End;
LCD_D6_Direction : ………………….. ;
End.
LCD_D7_Direction : ………………….. ;
Begin
Lcd_init(); {Initialiser le module LCD en respectant les
connexions déclarées}

2-Saisir, compiler puis simuler le programme ci-dessus.


3-Vérifier l fonctionnement sur valise d’expérimentation ZITOPIC.

B- Modulation de Largeur d’impulsion : MLI (PWM=P):


I- Mise en situation
Le déplacement du robot aspirateur est assuré par l’entrainement électrique à vitesse variable de deux
moteurs à courant continu. La variation du sens de rotation et la vitesse de rotation de chaque roue permet
le déplacement dans touts les directions et ce conformément à la figure suivante :

Note: Pour des raisons de simplification, on s’intéresse à la variation de vitesse d’un seul moteur dont le
schéma de principe est donné par la figure suivante :

5
Identifier puis donner le rôle des éléments
suivants :
DC Motor 1- Q : …………………………………………..
D
…………………………………………..
Microcontrôleur 2- R: …………………………………………..
Q
R …………………………………………..
3- D : …………………………………………..
…………………………………………..

La variation de vitesse d’un moteur à courant continu consiste à alimenter ce moteur de façon discontinue
avec un hacheur et faire ainsi varier la tension moyenne à ses bornes. C’est la technique MLI

La Modulation de Largeur d’Impulsion MLI (en


anglais Pulse Width Modulation PWM) est une
technique qui consiste à générer un signal à
période constante mais à rapport cyclique
variable.

Rapport cyclique (Duty cycle) :

Cette technique est largement utilisée pour


faire varier la vitesse des moteurs à courant
continu ou pour faire varier la luminosité d’une
lampe ou d’une diode LED.

Problème : Comment peut-on gérer les sorties PWM d’un microcontrôleur?


II- Génération des signaux MLI (PWM):
1- Sorties PWM
Afin de faciliter l’utilisation de la technique de modulation de largeur d’impulsion, plusieurs microcontrôleurs
possèdent des sorties capables de générer des signaux MLI généralement appelées sorties PWM.
Les microcontrôleurs 16F876A et 16F877A possèdent deux sorties PWM notées CCP1 et CCP2 (Capture
Compare Pwm), indiquer le numéro des broches CCPx pour :
-16F876A : …………………………………………..
-16F877A : …………………………………………..

2- Procédure mikropascal pro pour gérer les signaux (PWM) :


PWMx_Init(1000) // Initialise le module PWM de la sortie CCPx à la fréquence 1000Hz:
PWMx_start() // Démarrage du module PWM et sortie du signal sur la broche CCPx
N
PWMx_Set_duty(N) // Change le rapport cyclique  du signal sortant sur la broche CCPx avec α 
255
N variant de 0 à 255
PWMx_stop // Arrêter le module PWM de la sortie CCPx

6
☺Activité N°1 (MLI):
Ecrire un programme qui permet de commander un moteur à courant continu avec 4 vitesses
Sortie sur RC2 fréquence de MLI (1000Hz) M1(+)
VALUE=24

Rapport

0
0
0
0
Entrées N
cyclique
PORTB =0 =0 N=0
PORTB =1  = 0,25 N = 64 9
U1
21
OSC1/CLKIN RB0/INT
10 22

 =0,5
OSC2/CLKOUT RB1
PORTB =3 N =…. 2
RA0/AN0
RB2
RB3/PGM
23
24
M1
3 25
RA1/AN1 RB4 D1
 =0,75
4 26
PORTB =7 N =…. 5
RA2/AN2/VREF-/CVREF
RA3/AN3/VREF+
RB5
RB6/PGC
27 1N4148
6 28
RA4/T0CKI/C1OUT RB7/PGD

 =1
7
PORTB =15 N =… RA5/AN4/SS/C2OUT
RC0/T1OSO/T1CKI
11
1
MCLR/Vpp/THV RC1/T1OSI/CCP2
12 S
R1 Q1
13 S
RC2/CCP1 2N2222
14
RC3/SCK/SCL 2k2
15
RC4/SDI/SDA
16
RC5/SDO
17
RC6/TX/CK
18
RC7/RX/DT

program activite_1_MLI; PIC16F876A

begin ACTIVITE N°1_MLI

TRISB:=$FF;

PWM1_Init(……………..);

PWM1_Start;

while true do

begin

if PORTB=0 then PWM1_Set_duty(…………);

if PORTB=1 then PWM1_Set_duty(…………);

if PORTB= 3 then PWM1_Set_duty(………….);

if PORTB= 7 then PWM1_Set_duty(………….);

if PORTB= 15 then PWM1_Set_duty(255);

end;

end.

☺Activité N°2 (conversion et MLI):Ventilateur sur un concentrat eur USB :


Réaliser l’activité n°7 pages 104-105 du manuel d’activités : Variateur de vitesse