Corrigé TD N°5
Corrigé TD N°5
Corrigé TD N°5
Exercice 1 :
1. Pour générer correctement le signal PWM sur CCP1 ou CCP2, préciser dans le bon ordre les
étapes qui doivent être exécutées.
2. Est-il possible d’utiliser le Timer 1 pour configurer la PWM sur CCP1 et Timer 3 sur CCP2.
Seul le Timer 2 est associé au module PWM sur CCP1 ou CCP2.
3. Le microcontrôleur dispose d’un registre appelé IPR2. Est-ce qu’il peut remplacer PR2 et
remplir la même fonction.
Le module PWM est associé au registre PR2, CCPxCON,CCPRxL mais pas IPR2 qui n’a
aucun rapport avec le module PWM.
FPWM 2,44 kHz 9,77 kHz 39,06 kHz 156,25 kHz 312,50 kHz 416,67 kHz
Exercice 2 :
On donne :
• Fosc=20Mhz
• FPWM=2Khz
• Rapport cyclique (duty cycle)= 40% →= 0,4
• Module à utiliser :RB3/CCP2
1
TPWM=[(PR2)+1]*4*Tosc*Nps
TPWM Fo𝑠𝑐
PR2 = ( )−1=( )−1
4 ∗ Tosc ∗ Nps 4 ∗ FPWM ∗ Nps
20. 106
PR2 = ( ) − 1 = 2499 > 255
4 ∗ 2000 ∗ 1
On prend Nps=4
On prend Nps=16
𝑁𝑝𝑠 = 16
Par conséquent : {
𝑃𝑅2 = 155
2
5. Développer un programme en langage C permettant de générer le signal PWM.
while(1);
{
}
}
Exercice 3:
Le signal de la figure suivante représente la valeur moyenne d’un signal PWM qu’on désire générer.
Figure-1
• La durée des paliers est fixée par le timer2 (en utilisant le postscaler)
• L’amplitude des paliers est fixée par le module PWM
TPWM Fo𝑠𝑐
PR2 = ( )−1=( )−1
4 ∗ Tosc ∗ Nps 4 ∗ FPWM ∗ Nps
22. 106
PR2 = ( ) − 1 = 686.5 > 255
4 ∗ 8000 ∗ 1
On prend Nps=4
3
Par conséquent : Nps = 4 et PR2=171
Si on désigne par Y la variable formée par le registre CCPR1L et les bits DC1B0 et DC1B1 :
2. Déterminer Y pour avoir le palier d’amplitude 0.5V.
Pour avoir le palier d’amplitude 0,5V c’est l’équivalent de générer un signal PWM de rapport
0.5
cyclique 𝛼 = 5 = 0,1
Le signal à générer est un signal périodique de période 12ms. Chaque palier correspond à un
𝑃𝑎𝑙𝑖𝑒𝑟
signa de rapport cyclique 𝛼 = 𝑃𝐸 ; 𝑃𝐸 = 5𝑉.
𝜏 𝛼 ∗ 𝑇𝑃𝑊𝑀 𝛼 ∗ Fosc
𝑌= = =
Tosc ∗ Nps Tosc ∗ Nps 𝐹𝑃𝑊𝑀 ∗ Nps
On définit les valeurs de Y pour chaque palier dans le tableau suivant : (Y est la valeur
entière)
4. Déterminer T2CON.
5. Donner le programme en langage C permettant de générer un signal PWM ayant pour valeur
moyenne 2V.
Un signal de valeur moyenne 2V correspond à un signal PWM de rapport cyclique 0,4 ce qui
correspond à une valeur de Y = 275.
4
𝐶𝐶𝑃𝑅1𝐿 = 0100 0100
Par conséquent {
𝐷𝐶1𝐵1 = 1; 𝐷𝐶1𝐵0 = 1
#include<xc.h>
#include <pic18f4520.h>
main()
{
PR2=171;
CCPR1L=0b0100 0100;
CCP1CONbits.DC1B0=1;
CCP1CONbits.DC1B1=1;
TRISC2=0;
T2CON=0b0000 0101; // Nps = 4 ; TMR2ON = 1
CCP1CONbits.CCP1M2=1;
CCP1CONbits.CCP1M3=1;
while(1);
{
}
}
Pour que le rapport cyclique soit mis à jour tous les Te = 1ms, il faut configurer le postscaler
(postdiviseur) du Timer2 de telle sorte qu’une interruption du Timer 2 aura lieu tous les 1 ms.
Etant donné la période Te = 8.TPWM , on choisit le postscaler = 8.
5
Par conséquent :T2CON = 0b0011 1101 ; on maintient la valeur de Nps=4. T2CKPS=01
2. En exploitant les valeurs de Y calculées dans la première partie, donner le tableau qu’il faut
utiliser pour la mise à jour du rapport cyclique.
Pour configurer le timer2 en mode interruption, il faut configurer les bits suivants :
- RCONbits IPEN = 0;
- INTCONbits.GIE = 1;
- INTCONbits.PEIE = 1;
- PIR1bits.TMR2IF = 0;
- PIE1bits.TMR2IE = 1;
- T2CONbits.T2CKPS = 1;
- T2CONbits.T2OUTPS = 8;
- T2CONbits.TMR2ON = 1;
#include<xc.h>
unsigned int temp,i=0;
void __interrupt() Timer2(void);
6
CCPR1L=TAB_Y[i]>>2;
DC1B0=TAB_Y[i];
DC1B1=TAB_Y[i]>>1;
//ou bien on peut procéder par masquage de la façon suivante :
// temp=(TAB_Y[i] & 0x0003);
//CCP1CON=temp<<4;
}
i++;
PIR1bits.TMR2IF=0;
}
main()
{
PR2=171;
CCP1CON=0;
TRISC2=0;
CCP1CONbits.CCP1M2=1;
CCP1CONbits.CCP1M3=1;
RCONbits IPEN=0;
INTCONbits.GIE=1;
INTCONbits.PEIE =1;
PIR1bits.TMR2IF=0;
PIE1bits.TMR2IE=1;
T2CONbits.T2CKPS=1;
T2CONbits.T2OUTPS=8;
T2CONbits.TMR2ON=1;
while(1);
{
}
3. En prenant Vref+ = 5V, Vref- = 0V. Calculer le pas de quantification dans les cas suivants :
a) n= 8 bits
b) n=10 bits
𝑉𝑟𝑒𝑓+ −𝑉𝑟𝑒𝑓−
Le pas de quantification est défini par :𝑞 = 2𝑛 −1
7
5 5
a) 𝑞 = = = 19,6𝑚𝑉
28 −1 255
5 5
b) 𝑞 = 210 −1 = 1023 = 4,8𝑚𝑉
4. Pour Vref+ = 2,56V ; donner la valeur de la tension d’entrée Vin, qui correspond aux valeurs
numériques suivantes :
a) D7..D0 = 10111010
b) D7..D0 = 11111111
𝑉𝑟𝑒𝑓+ − 𝑉𝑟𝑒𝑓−
𝑉𝑖𝑛 = .𝑁
2𝑛
2,56−0
Pour N = 10111010 = 186 𝑉𝑖𝑛 = . 186 = 1,86𝑉
28
2,56−0
Pour N = 1111 1111 = 255 𝑉𝑖𝑛 = . 255 = 2,55𝑉
28
5. Dans quels registres est chargé le résultat de conversion. Comment peut-t-on savoir la
disponibilité de la valeur numérique.
Le résultat de conversion est chargé dans les registres ADRESH et ADRESL. Le résultat est
considéré disponible quand le bit GO revient à zéro ou bien quand le bit ADIF passe à 1.
6. Dans un ADC, que se passe-t-il, si on commence une nouvelle conversion avant de lire la
donnée précédente ?
𝑉𝑟𝑒𝑓+ − 𝑉𝑟𝑒𝑓−
𝑞= ⇒ 𝑉𝑟𝑒𝑓+ − 𝑉𝑟𝑒𝑓− = 𝑞 ∗ (2𝑛 − 1) 𝑜𝑟 𝑉𝑟𝑒𝑓− = 0𝑉
2𝑛 − 1
Exercice 5 :
1. Pour un quartz de 12Mhz ; laquelle des valeurs suivantes qui correspond à la fréquence de
l’ADC.
a) Fosc/2
b) Fosc/4
c) Fosc/8
d) Fosc/16
e) Fosc/32
8
TAD = 16Tosc → FAD = Fosc/16
7. Quelle est la valeur à charger dans le registre ADCON2, si on veut Fosc/4, Tacq = 4TAD et le
résultat de conversion est justifié à gauche ?
Exercice 6 :
On veut mesurer la température d’une serre agricole en vue d’une régulation de la température durant
l’hiver. La serre est équipée :
- d’un capteur de température qui fournit une tension analogique comprise entre 0 et
5V correspondant à une variation de 0°C à 50°C.
- d’un commutateur Marche permet la mise en service du système de chauffage.
9
- D’un potentiomètre qui fournit une tension comprise entre 0 et 5V permettant de choisir la
consigne de T°.
- D’un élément chauffant commandé avec un signal TOR issu de RB2.
• 𝑇𝑎𝑐𝑞 = 4𝑇𝐴𝐷
• 𝑉𝑅𝐸𝐹+ = 𝑉𝐷𝐷; 𝑉𝑅𝐸𝐹− = 𝑉𝑆𝑆;
• Le convertisseur est configuré en mode scrutation (sans interruption)
void Init()
{
ADCON0 = 0b00000001;
ADCON1 = 0b00001101;
ADCON2 = 0b00010100 ;//bit 7=0; justification à gauche// bit7=1; justification à droite
TRISA = 0xFF;// toutes les lignes du PORTA en entrée
TRISB = 0xFE;// RB0 en sortie le reste du PORTB en entrée
}
1er cas : Le résultat de conversion sur 10 bits subit une justification à droite
2ème cas : Le résultat de conversion sur 10 bits subit une justification à gauche
11
#define _XTAL_FREQ 4000000
#include <xc.h>
void main()
{
Init();
while(1)
{
Vcons = read_ADC(CHS0);
Vmes = Lecture_ADC(CHS1);
}
}
2. Régulation de la Température :
Le résultat de conversion sur 10 bits subit une justification à droite.
2.1. Développer un organigramme permettant d’illustrer le fonctionnement du système.
12
Organigramme de fonctionnement de la serre :
Début
Init_ADC
Non
MA = 1
Lecture Vcons
oui
KA1 = 1
oui
Vmes <Vcons
Lecture Vmes
Non
KA1 = 0
void main()
{
Init();
while(1)
{
do
{
Vcons = read_ADC(CHS0); // lire la consigne tant que MA=0 (HS)
}
while (MA == 0) ;
Vmes = read_ADC(CHS1);// KA1 = 1 lire(T°) tant que Vmes < Vcons
if(Vmes < Vcons) KA1 = 1; // actionner le chauffage
else KA1 = 0; // arrêter le chauffage
}
}
3. Programmation de l’ADC en mode interruption.
3.1. Développer une fonction init_ADC () permettant de configurer l’ADC en mode
interruption.
14
PIR1bits.ADIF=0;
PIE1bits.ADIE=1;
RCONbits.IPEN=0;
KA1 = 0;
}
3.2. Développer une fonction interruption permettant de lire la valeur de conversion issue du
potentiomètre de consigne et celle du capteur de mesure et la placer dans Vcons et Vmes.
Etant donné le microcontrôleur PIC18F4520 dispose d’un seul ADC, il faut déclarer une
variable select de type char permettant l’aiguillage de l’ADC vers la consigne ou vers la
mesure :
- Si select = 0 lire la consigne
- Si select = 1 lire la mesure.
15
{
Vmes=(ADRESH<<2)+(ADRESL>>6); // cas où le résultat est justifié à gauche
ADCON0=CHS0;
}
PIR1bits.ADIF=0;
select=!select; // complémenter select pour la prochaine conversion
}
void main()
{
Init_ADC();
while(1)
{
KA1=0;
ADCON0bits.GODONE=1;
while (MA == 1)
{
ADCON0bits.GODONE=1;
if(Vmes < Vcons) KA1 = 1; // actionner le chauffage
else KA1 = 0;
}
}
}
16