Aller au contenu

Un mot pour Fahmio

Tu écris. Tu continues.

Un problème, une idée — assez pour qu’on comprenne, puis tu retournes à ta copie.

On lit. Tu n’as rien d’autre à faire.

Où veux-tu aller ?

↑ ↓ pour parcourir · Entrée pour ouvrir · Échap pour fermer

Fahmio
Fahmio
Bac Tunisie
PIC-CAutomatisme — PIC et mikroPascal

Programme d'acquisition analogique en MikroC : CAN 10 bits, mise à l'échelle, affichage LCD et décision à seuils

Idée directrice

Une grandeur analogique (vitesse, température, tension de batterie…) arrive sur une broche ANx du PIC. Le programme la convertit (N de 0 à 1023), la remet à l'échelle physique par l'équation de la caractéristique, l'affiche sur le LCD et en déduit des sorties : diodes par plage, contacteur à deux seuils. L'épreuve donne le programme à trous, guidé par ses commentaires : chaque trou se justifie par le schéma, le tableau d'ADCON1 ou la caractéristique du capteur.

Ce qui aide à reconnaître la démarche

« Compléter les instructions manquantes du programme en MikroC » ; « Lecture de la valeur M fournie par le CAN » ; « La relation entre Tc et N s'écrit sous la forme » ; « déterminer l'équation du segment de droite » ; « Commande du contacteur KA »

Besoin d’un point de départ ? Voir la méthode
  • Repérer la broche ANx de la grandeur, puis la ligne d'ADCON1 où elle est A et où chaque broche utilisée en numérique est D ; TRIS : 1 = entrée, 0 = sortie, avec le N.B.
  • Mise à l'échelle : équation de la caractéristique par deux points (grandeur = a·U + b), puis U=5N/1023U=5N/1023 ; écrire le calcul en réel (300.0) pour éviter le débordement.
  • Affichage : conversion en texte (IntToStr, WordToStr, ByteToStr) puis Lcd_Out(ligne, colonne, texte).
  • Plages : une valeur de port par plage (bit 0 = RC0…) ; deux seuils différents pour un contacteur = hystérésis logicielle : entre les seuils, aucune instruction ne change la sortie.
  • Contrôler par un cas numérique : N → grandeur → valeur affichée → sorties.
Les pièges à vérifier dans ta démarche

Choisir une ligne d'ADCON1 qui rend analogique une broche utilisée en sortie numérique ; oublier l'ordonnée à l'origine d'un capteur décalé (0,4 V à vent nul) ; écrire 300*N en entier (dépassement au-delà de 65 535) ; réunir les deux seuils du contacteur en un seul if/else, ce qui supprime la mémoire ; écrire PORTC = 0x04 pour « D3 allumée » alors que la plage demande 0x07 (D1, D2 et D3).

Sujet principal

Exercice — surveillance du vent d'une éolienne de pompage, programme MikroC à compléter, dans l'esprit des sessions 2016–2025

3 questionsFigure fournieCorrigé masqué

Une éolienne de pompage est protégée contre les vents forts. Un anémomètre délivre une tension UU qui dépend de la vitesse vv du vent. La carte à microcontrôleur PIC 16F876A de la figure 1 mesure vv, l'affiche en km/h sur la ligne 2 d'un afficheur LCD et commande :

  • les diodes D1, D2, D3 (RC0, RC1, RC2) : aucune diode pour v<40v<40 km/h ; D1 pour 40≤v<7040\le v<70 km/h ; D1 et D2 pour 70≤v<9070\le v<90 km/h ; D1, D2 et D3 pour v≥90v\ge 90 km/h ;
  • le contacteur KF du frein du rotor (RB7, par le transistor T) : le frein est serré (KF = 1) dès que v>90v>90 km/h et desserré (KF = 0) dès que v<70v<70 km/h ;
  • le buzzer (RA2), qui sonne tant que le frein est serré.

La caractéristique de l'anémomètre est une droite (figure 2).

Extrait du document constructeur du PIC 16F876A — registre ADCON1 (ADFM = 1 : résultat justifié à droite ; A : entrée analogique ; D : broche numérique ; références VDDV_{DD} et VSSV_{SS}) :

ADCON1RA5RA3RA2RA1RA0
1000 0000AAAAA
1000 0100DADAA
1000 0110DDDDD
1000 1110DDDDA

N.B : les broches non utilisées sont considérées comme des entrées. Le CAN du PIC délivre sur 10 bits un nombre NN de 0 à 1023 pour une tension de 0 à 5 V : U=5 N1023U=\dfrac{5\,N}{1023}.

Programme en MikroC à compléter :

// Déclaration des variables
unsigned int N;        // résultat de la conversion (10 bits)
float V;               // vitesse du vent en km/h
int Vent;              // vitesse affichée
char txt[7];           // texte pour IntToStr
sbit Buzzer at RA2_bit;
sbit KF at RB7_bit;
// Connexion de l'afficheur LCD (à ne pas traiter)

void main() {
  ADCON1 = 0x……;        // RA1/AN1 analogique, RA2 numérique
  TRISA = 0x……;         // configuration du port A
  TRISC = 0x……;         // RC0, RC1, RC2 en sortie
  TRISB7_bit = ……;      // RB7 en sortie
  PORTC = 0;  Buzzer = 0;  KF = 0;
  Lcd_Init();
  Lcd_Cmd(_LCD_CURSOR_OFF);
  Lcd_Out(1, 1, "Vent en km/h :");
  while (1) {
    N = ADC_Read(……);            // lecture de l'anémomètre
    V = ……………………;                // mise à l'échelle
    if (V < 0) V = 0;
    Vent = V;                    // partie entière
    IntToStr(Vent, txt);
    Lcd_Out(……, ……, txt);        // ligne 2, colonne 1
    // Diodes de plage
    if (V < 40) PORTC = 0x00;
    if ((V >= 40) && (V < 70)) PORTC = 0x……;
    if ((V >= 70) && (V < 90)) PORTC = 0x……;
    if (……………) PORTC = 0x07;
    // Frein du rotor et buzzer
    if (V > 90) KF = ……;
    if (……………) KF = 0;
    Buzzer = ……;
  }
}

1. a. Quelle est la nature du signal appliqué sur RA1/AN1 ?

b. Choisir dans l'extrait la valeur d'ADCON1 qui convient. Justifier.

2. Compléter les valeurs de TRISA, TRISC et TRISB7_bit.

3. a. À partir de la figure 2, établir l'équation v=a U+bv=a\,U+b de la caractéristique.

b. Montrer que v=300 N1023−24v=\dfrac{300\,N}{1023}-24.

c. Compléter les instructions de lecture, de mise à l'échelle et d'affichage.

4. Calculer la valeur de NN qui correspond à v=0v=0. Quel est le rôle de l'instruction if (V < 0) V = 0; ?

5. Compléter les instructions de commande des diodes, du frein et du buzzer.

6. On relève successivement N=400N=400, puis N=330N=330 (le vent faiblit), puis N=280N=280. Pour chaque relevé, calculer VV, la valeur affichée, la valeur de PORTC et l'état de KF.

7. Entre 70 et 90 km/h, le programme ne modifie pas KF. Quel est l'intérêt de cet écart entre les deux seuils ? Déterminer les valeurs de NN à partir desquelles le frein est serré, et en dessous desquelles il est desserré.

Voir la correction commentéeAprès avoir posé votre démarche

1.a La tension de l'anémomètre varie de façon continue entre 0,4 V et 2,4 V : c'est un signal analogique, que le CAN doit convertir.

1.b Idée : chercher la ligne où RA1 est A (entrée analogique) et où RA2, qui commande le buzzer, est D (numérique). 1000 0000 rend RA2 analogique : le buzzer ne peut plus être commandé ; 1000 0110 et 1000 1110 rendent RA1 numérique. Seule la ligne 1000 0100 convient : ADCON1=0x84\boxed{\text{ADCON1}=0\text{x}84}. RA0 et RA3, restés analogiques, ne sont pas utilisés.

2. Idée : 1 = entrée, 0 = sortie, et le N.B. place en entrée toute broche non utilisée. TRISA : RA2 en sortie, le reste en entrée, 1111 10111111\,1011 → 0xFB ; TRISC : RC0 à RC2 en sortie, 1111 10001111\,1000 → 0xF8 ; TRISB7_bit = 0. Les broches du LCD sont configurées par la bibliothèque (connexion à ne pas traiter).

3.a Idée : une droite se détermine par deux points de la caractéristique.

a=120−02,4−0,4=60 km/h par Va=\dfrac{120-0}{2{,}4-0{,}4}=60\ \text{km/h par V}

Au point (0 ; 0,4)(0\ ;\ 0{,}4) : 0=60×0,4+b0=60\times0{,}4+b, d'où b=−24b=-24 km/h et v=60 U−24\boxed{v=60\,U-24} (vv en km/h, UU en V).

3.b On remplace UU par 5 N1023\dfrac{5\,N}{1023} :

v=60×5 N1023−24=300 N1023−24v=\dfrac{60\times5\,N}{1023}-24=\dfrac{300\,N}{1023}-24
3.c Instructions complétées (avec les réponses des questions 1 et 2) :

ADCON1 = 0x84;
TRISA = 0xFB;
TRISC = 0xF8;
TRISB7_bit = 0;
// dans la boucle :
N = ADC_Read(1);
V = 300.0 * N / 1023 - 24;
Lcd_Out(2, 1, txt);

Le calcul est écrit avec 300.0 : il se fait en réel. En entier 16 bits, 300×N300\times N dépasserait 65 535 dès que N>218N>218.

4. v=0v=0 pour U=0,4U=0{,}4 V, soit N=1023×0,45=81,84N=\dfrac{1023\times0{,}4}{5}=81{,}84. Pour N≤81N\le 81 (vent nul, décalage ou bruit du capteur), la formule donne une vitesse négative : l'instruction la ramène à 0 pour que le LCD n'affiche pas de valeur absurde.

5. Idée : D1 est sur le bit 0 de PORTC ; chaque plage ajoute une diode.

if ((V >= 40) && (V < 70)) PORTC = 0x01;
if ((V >= 70) && (V < 90)) PORTC = 0x03;
if (V >= 90) PORTC = 0x07;
if (V > 90) KF = 1;
if (V < 70) KF = 0;
Buzzer = KF;

Le buzzer recopie l'état du frein : il sonne tant que KF = 1.

6. Idée : dérouler la boucle relevé par relevé, en gardant l'état de KF d'un tour à l'autre. Pour N=400N=400 : 300×4001023=117,30\dfrac{300\times400}{1023}=117{,}30, donc V=93,30V=93{,}30 km/h.

NV (km/h)affichéPORTCKF
40093,30930x071 (frein serré)
33072,77720x031 (reste serré)
28058,11580x010 (desserré)

Pour N=330N=330, 70<V<9070<V<90 : aucune instruction ne modifie KF, qui garde la valeur 1 du relevé précédent. Le même relevé, obtenu vent montant depuis le calme, laisserait KF à 0 : la sortie dépend de l'histoire.

7. L'écart évite le battement du contacteur quand le vent oscille autour d'un seul seuil. Serrage : V>90V>90 ⇔ N>114×1023300=388,74N>\dfrac{114\times1023}{300}=388{,}74, soit N≥389\boxed{N\ge 389} ; desserrage : V<70V<70 ⇔ N<94×1023300=320,54N<\dfrac{94\times1023}{300}=320{,}54, soit N≤320\boxed{N\le 320}.

Changer d’énoncé, garder le raisonnement

Choisis un seul transfert après le sujet principal. Qu’est-ce qui change ? Quel résultat ou quelle méthode peux-tu réutiliser ? Les autres exercices restent disponibles pour une prochaine séance.

Variantes rencontrées : température de séchoir Ts=Ns⋅800/1023T_s=N_s\cdot800/1023, consigne réglée par deux boutons en interruption, contacteur à Tc±25T_c\pm25 °C et affichage en °F (principale 2025) ; tension de batteries Ubat=500 Nv/1023U_{bat}=500\,N_v/1023, équation par morceaux et diodes par zone avec PortC = 0x07 (principale 2024) ; dynamo tachymétrique 16 M/102316\,M/1023 en mikroPascal et lampe à la vitesse maximale (principale 2022) ; consigne par potentiomètre Tc=a N+bT_c=a\,N+b et chauffe à Tc±5T_c\pm5 (contrôle 2015) ; température LM35 N×500/1023N\times500/1023 affichée en BCD (principale 2016).

Exercices d'entraînement — une nuance à la fois

1 Drill PIC-C.1 — mikroPascal : vitesse d'un tambour par dynamo tachymétrique, programme commenté à compléter
Entraînement 01 / 05

Drill PIC-C.1 — mikroPascal : vitesse d'un tambour par dynamo tachymétrique, programme commenté à compléter

1 questionCorrigé masqué

Le tambour d'une essoreuse industrielle est entraîné par un moteur dont l'arbre porte une dynamo tachymétrique. Elle délivre une tension de 0 à 5 V proportionnelle à la vitesse nn du tambour, qui varie de 0 à 25 tr/s. Cette tension est appliquée sur RA0/AN0 d'un PIC 16F876A ; un afficheur LCD est relié au port C ; une lampe rouge H (RB2) avertit l'opérateur dès que la vitesse atteint 24 tr/s. La vitesse calculée est ncalcul=25 M1023n_{calcul}=\dfrac{25\,M}{1023}, où MM est le résultat de la conversion.

1. Compléter le programme en mikroPascal PRO conformément aux commentaires. Les broches non utilisées sont des entrées.

program Essoreuse;                   // nom du programme
var M : ……… ;                        // résultat du CAN
    n_calcul : ……… ;                 // vitesse calculée (réel)
    n : ……… ;                        // vitesse entière (octet)
    n_affiche : ……… ;                // chaîne de 3 caractères
    H : sbit at RB2_bit;             // lampe d'avertissement
// Connexion de l'afficheur LCD (à ne pas traiter)
begin
  TRISB := $……;                      // RB2 en sortie
  PORTB := $00;                      // lampe éteinte
  ADCON1 := %10001110;               // RA0/AN0 seule analogique
  ADC_Init();                        // initialisation du CAN
  LCD_Init();
  LCD_Cmd(_LCD_CURSOR_OFF);
  while TRUE do
  begin
    M := ………………;                   // lecture de la voie AN0
    n_calcul := ………………;            // calcul de la vitesse
    n := ………………;                   // conversion en octet
    ByteToStr(……, ……);               // vitesse en texte
    LCD_Out(1, 1, 'Vitesse tambour');
    LCD_Out(2, 1, ……);               // ligne 2, colonne 1
    LCD_Out(2, 5, 'tr/s');
    if ……………… then H := 1          // lampe dès 24 tr/s
    else H := 0;
  end;
end.

2. Le CAN délivre M=700M=700. Calculer ncalculn_{calcul} et la valeur affichée.

3. À partir de quelle valeur de MM la lampe s'allume-t-elle ?

4. Pourquoi MM est-il déclaré de type word et nn de type byte ?

Voir la correction commentéeAprès avoir posé votre démarche
1. Idée : chaque commentaire dicte le type ou l'instruction ; RB2 est la seule sortie du port B.

var M : word;
    n_calcul : real;
    n : byte;
    n_affiche : string[3];
...
  TRISB := $FB;                      // 1111 1011
  PORTB := $00;
...
    M := ADC_Read(0);
    n_calcul := (25 * M) / 1023;
    n := byte(n_calcul);
    ByteToStr(n, n_affiche);
    LCD_Out(2, 1, n_affiche);
    if n_calcul >= 24 then H := 1
    else H := 0;

2. ncalcul=25×7001023=17,11n_{calcul}=\dfrac{25\times700}{1023}=17{,}11 tr/s ; byte() garde la partie entière : le LCD affiche 17\boxed{17} tr/s.

3. 25 M1023≥24\dfrac{25\,M}{1023}\ge24 ⇔ M≥24×102325=982,08M\ge\dfrac{24\times1023}{25}=982{,}08 : la lampe s'allume pour M≥983\boxed{M\ge983}.

4. Le résultat du CAN tient sur 10 bits (jusqu'à 1023, plus que 255) : il faut un mot de 16 bits. La vitesse entière ne dépasse pas 25 : un octet suffit, et ByteToStr attend un octet.

2 Drill PIC-C.2 — équation par morceaux : état de charge d'un banc de batteries et diodes par zone
Entraînement 02 / 05

Drill PIC-C.2 — équation par morceaux : état de charge d'un banc de batteries et diodes par zone

1 questionFigure fournieCorrigé masqué

Une installation photovoltaïque stocke l'énergie dans un banc de batteries de 48 V. Sa tension à vide UbatU_{bat} dépend de la décharge DD (en %) selon la caractéristique ci-dessous, assimilée à trois segments : zone ① [AB], zone ② [BC], zone ③ [CD]. Un pont diviseur de rapport 1/12 applique U=Ubat/12U=U_{bat}/12 sur RA0/AN0 d'un PIC 16F876A. Quatre diodes D1 à D4 (RC0 à RC3) indiquent la charge : quatre diodes pour Ubat>52U_{bat}>52 V ; D1, D2 et D3 en zone ① ; D1 et D2 en zone ② ; D1 seule en zone ③ ; aucune pour Ubat≤42U_{bat}\le42 V (décharge 100 %).

1. Montrer que Ubat=60 Nv1023U_{bat}=\dfrac{60\,N_v}{1023}, où NvN_v est le résultat de la conversion.

2. Déterminer l'équation du segment [AB] sous la forme D=f(Ubat)D=f(U_{bat}).

3. Compléter le programme MikroC (les broches non utilisées sont des entrées).

unsigned int Nv;
float Ubat, decharge, charge;
char aff[7];
// Connexion de l'afficheur LCD (à ne pas traiter)
void calculer() {
  Nv = ADC_Read(……);
  Ubat = 60.0 * Nv / 1023;
  if (Ubat > 52) {
    decharge = 0;  PORTC = 0x……; }
  if ((Ubat <= 52) && (Ubat > 50)) {
    decharge = ……………;  PORTC = 0x……; }
  if ((Ubat <= 50) && (Ubat > 47)) {
    decharge = 1020 - 20 * Ubat;  PORTC = 0x……; }
  if ((Ubat ……) && (Ubat ……)) {
    decharge = 268 - 4 * Ubat;  PORTC = 0x01; }
  if (Ubat <= 42) {
    decharge = 100;  PORTC = 0x……; }
  charge = 100 - decharge;
}
void main() {
  TRISA = 0x……;
  TRISC = 0x……;          // RC0 à RC3 en sortie
  ADCON1 = 0x8E;
  Lcd_Init();  Lcd_Cmd(_LCD_CURSOR_OFF);
  while (1) {
    calculer();
    IntToStr(charge, aff);
    Lcd_Out(1, 1, "Charge %");  Lcd_Out(1, 10, aff);
  }
}

4. Pour Ubat=48,5U_{bat}=48{,}5 V, puis pour Ubat=44U_{bat}=44 V, calculer le niveau de charge et dire quelles diodes sont allumées.

Voir la correction commentéeAprès avoir posé votre démarche

1. Le diviseur donne U=Ubat/12U=U_{bat}/12 et le CAN U=5 Nv1023U=\dfrac{5\,N_v}{1023}, d'où Ubat=12×5 Nv1023=60 Nv1023U_{bat}=\dfrac{12\times5\,N_v}{1023}=\dfrac{60\,N_v}{1023}.

2. Idée : pente et ordonnée à l'origine à partir de A et B. Pente : 50−5220−0=−0,1\dfrac{50-52}{20-0}=-0{,}1 V par %, donc Ubat=52−0,1 DU_{bat}=52-0{,}1\,D, soit D=520−10 Ubat\boxed{D=520-10\,U_{bat}}. Contrôle en B : 520−500=20520-500=20 %.

3. Idée : D1 est sur RC0 ; zone ③ → 0x01, zone ② → 0x03, zone ① → 0x07, pleine charge → 0x0F.

Nv = ADC_Read(0);
if (Ubat > 52) { decharge = 0; PORTC = 0x0F; }
if ((Ubat <= 52) && (Ubat > 50)) {
  decharge = 520 - 10 * Ubat;  PORTC = 0x07; }
if ((Ubat <= 50) && (Ubat > 47)) {
  decharge = 1020 - 20 * Ubat;  PORTC = 0x03; }
if ((Ubat <= 47) && (Ubat > 42)) {
  decharge = 268 - 4 * Ubat;  PORTC = 0x01; }
if (Ubat <= 42) { decharge = 100; PORTC = 0x00; }
// dans main :
TRISA = 0xFF;
TRISC = 0xF0;

4. Ubat=48,5U_{bat}=48{,}5 V est dans la zone ② (47<48,5≤5047<48{,}5\le50) : D=1020−970=50D=1020-970=50 %, charge 50 %\boxed{50\ \%}, PORTC = 0x03 : D1 et D2 allumées.

Ubat=44U_{bat}=44 V est dans la zone ③ : D=268−176=92D=268-176=92 %, charge 8 %\boxed{8\ \%}, PORTC = 0x01 : D1 seule.

3 Drill PIC-C.3 — consigne réglée par deux boutons en interruption, bornes, affichage en °C ou en °F
Entraînement 03 / 05

Drill PIC-C.3 — consigne réglée par deux boutons en interruption, bornes, affichage en °C ou en °F

1 questionCorrigé masqué

Le four d'une boulangerie est régulé par un PIC 16F876A. Un capteur délivre sur RA0/AN0 une tension de 0 V à 0 °C et de 5 V à 400 °C. La consigne Nc (en °C), initialisée à 200 °C, se règle par pas de 10 °C : bouton « + » sur RB6, bouton « − » sur RB7 (1 quand on appuie), lus dans la procédure d'interruption sur changement d'état de RB4 à RB7 ; elle reste comprise entre 150 °C et 280 °C. Le commutateur C/F (RB1) choisit l'affichage : 0 pour °C, 1 pour °F, avec T(°F)=95 T(°C)+32T(°\text{F})=\dfrac{9}{5}\,T(°\text{C})+32. Le contacteur KC de la résistance de chauffe (RB2, par un transistor) est enclenché si Ts<Nc−5T_s<N_c-5 et déclenché si Ts>Nc+5T_s>N_c+5 (températures en °C). L'afficheur LCD est relié au port C.

1. Compléter le programme (les broches non utilisées sont des entrées).

unsigned int Nc, Ns, Tc, Ts;
char Tc_txt[6], Ts_txt[6];
sbit KC at RB2_bit;
// Connexion de l'afficheur LCD (à ne pas traiter)
void interrupt() {                 // réglage de la consigne
  if ((RB6_bit == 1) && (Nc < ……)) Nc = Nc + 10;
  if ((RB7_bit == 1) && (Nc > ……)) Nc = ……………;
  INTCON = 0x88;
}
void main() {
  TRISA = 0x……;
  TRISB = 0x……;                    // RB2 en sortie
  ADCON1 = 0x8E;
  KC = 0;  Nc = 200;
  INTCON = 0x88;
  Lcd_Init();  Lcd_Cmd(_LCD_CURSOR_OFF);
  while (1) {
    Ns = ADC_Read(0);
    Ts = Ns * 400.0 / 1023;        // température du four en °C
    if (Ts < Nc - 5) KC = 1;       // chauffe
    if (……………) KC = 0;            // arrêt de la chauffe
    if (RB1_bit == 0) {            // affichage en °C
      Tc = Nc;
      Lcd_Out(1, 16, "C");  Lcd_Out(2, 16, "C"); }
    else {                         // affichage en °F
      Tc = ……………;
      Ts = ……………;
      Lcd_Out(1, 16, "F");  Lcd_Out(2, 16, "F"); }
    WordToStr(Tc, Tc_txt);  WordToStr(Ts, Ts_txt);
    Lcd_Out(1, 1, "Consigne");  Lcd_Out(1, 10, Tc_txt);
    Lcd_Out(2, 1, "Four");      Lcd_Out(2, 10, Ts_txt);
  }
}

2. Justifier INTCON = 0x88 (bit 7 : GIE ; bit 3 : RBIE). Pourquoi la procédure teste-t-elle RB6_bit == 1 ?

3. Le four vient d'être allumé. L'opérateur appuie 3 fois sur « + », puis le CAN délivre Ns=563N_s=563. Calculer Ts, donner l'état de KC, puis les deux valeurs affichées lorsque C/F = 1.

4. Combien d'appuis sur « + » seront encore pris en compte, au plus ?

Voir la correction commentéeAprès avoir posé votre démarche
1. Idée : tester la borne avant de modifier Nc, et commander KC avant la conversion d'affichage.

if ((RB6_bit == 1) && (Nc < 280)) Nc = Nc + 10;
if ((RB7_bit == 1) && (Nc > 150)) Nc = Nc - 10;
// dans main :
TRISA = 0xFF;
TRISB = 0xFB;
if (Ts > Nc + 5) KC = 0;
Tc = Nc * 9 / 5 + 32;
Ts = Ts * 9 / 5 + 32;

Les tests de KC sont faits sur les valeurs en °C, avant la conversion : la régulation ne dépend pas de l'unité affichée.

2. 0x88=1000 10000\text{x}88=1000\,1000 : GIE = 1 autorise les interruptions, RBIE = 1 valide l'interruption sur changement d'état de RB4 à RB7. Elle se déclenche à l'appui et au relâchement : le test RB6_bit == 1 ne compte que l'appui, une fois par appui. La lecture de RB6 et RB7 met fin à la condition de changement, et la réécriture d'INTCON efface l'indicateur RBIF.

3. Trois appuis : Nc=230N_c=230 °C. Ts=563×4001023=220,14T_s=\dfrac{563\times400}{1023}=220{,}14, soit 220 °C en entier. 220<230−5=225220<230-5=225 : KC=1\boxed{KC=1}, le four chauffe. En °F : Tc=230×9/5+32=446T_c=230\times9/5+32=\boxed{446} et Ts=220×9/5+32=428T_s=220\times9/5+32=\boxed{428}.

4. De 230 °C à la borne de 280 °C : 5\boxed{5} appuis ; au-delà, le test Nc < 280 est faux et l'appui est ignoré.

4 Drill PIC-C.4 — consigne par potentiomètre : deux voies du CAN, Tc=a N+bT_c=a\,N+b et affichage BCD sur deux décodeurs
Entraînement 04 / 05

Drill PIC-C.4 — consigne par potentiomètre : deux voies du CAN, Tc=a N+bT_c=a\,N+b et affichage BCD sur deux décodeurs

1 questionCorrigé masqué

Dans une chaîne de traitement de surface, l'eau d'un bac de rinçage doit rester à la température choisie par l'opérateur. Un PIC 16F876A reçoit sur RA1/AN1 la tension d'un potentiomètre de consigne (0 à 5 V), et sur RA0/AN0 la tension d'un capteur de température de l'eau (0 V à 0 °C, 5 V à 90 °C). Le commutateur Aff (RC4) choisit la valeur affichée sur deux afficheurs 7 segments commandés par deux décodeurs BCD : dizaines sur RB7…RB4, unités sur RB3…RB0. Aff = 1 : consigne affichée et diode D1 (RC5) allumée ; Aff = 0 : température de l'eau affichée et diode D2 (RC6) allumée.

La consigne est réglable de 30 °C à 70 °C : Nc=0N_c=0 donne Tc=30T_c=30 °C et Nc=1023N_c=1023 donne Tc=70T_c=70 °C, avec Tc=a Nc+bT_c=a\,N_c+b.

1. Déterminer aa et bb.

2. Compléter le programme (les broches non utilisées sont des entrées).

unsigned int Nc, Ne;
unsigned short Tc, Te, d, u;
sbit Aff at RC4_bit;
sbit D1 at RC5_bit;
sbit D2 at RC6_bit;
void main() {
  ADCON1 = 0x84;                 // AN0 et AN1 analogiques
  TRISA = 0xFF;
  TRISB = 0x……;                  // afficheurs
  TRISC = 0x……;                  // RC5, RC6 en sortie
  while (1) {
    Nc = ADC_Read(……);           // consigne
    Ne = ADC_Read(……);           // température de l'eau
    Tc = ……………………;               // consigne en °C
    Te = Ne * 90.0 / 1023;       // eau en °C
    if (Aff == 1) {
      d = Tc / 10;  u = ……………;
      D1 = 1;  D2 = 0; }
    else {
      d = ……………;  u = Te % 10;
      D1 = 0;  D2 = 1; }
    PORTB = ……………;               // dizaines en poids fort
  }
}

3. Calculer PORTB (en hexadécimal et en binaire) pour Aff = 1 avec Nc=614N_c=614, puis pour Aff = 0 avec Ne=700N_e=700.

4. Quelle valeur de NcN_c donne une consigne de 45 °C ?

Voir la correction commentéeAprès avoir posé votre démarche

1. Idée : deux points (N ; Tc) déterminent la droite. Nc=0N_c=0 donne b=30b=30 °C ; a=70−301023=401023≈0,0391a=\dfrac{70-30}{1023}=\dfrac{40}{1023}\approx0{,}0391 °C, d'où Tc=40 Nc1023+30\boxed{T_c=\dfrac{40\,N_c}{1023}+30}.

2. Idée : dizaines dans le quartet de poids fort, d'où 16 × d.

TRISB = 0x00;
TRISC = 0x9F;                    // 1001 1111
Nc = ADC_Read(1);
Ne = ADC_Read(0);
Tc = 40.0 * Nc / 1023 + 30;
u = Tc % 10;
d = Te / 10;
PORTB = 16 * d + u;

3. Tc=40×6141023+30=54,01T_c=\dfrac{40\times614}{1023}+30=54{,}01, soit 54 : d=5d=5, u=4u=4, PORTB =16×5+4=84=0x54=0101 0100=16\times5+4=84=\boxed{0\text{x}54}=0101\,0100.

Te=700×901023=61,58T_e=\dfrac{700\times90}{1023}=61{,}58, soit 61 : PORTB =0x61=0110 0001=\boxed{0\text{x}61}=0110\,0001.

4. 45=40 Nc1023+3045=\dfrac{40\,N_c}{1023}+30 ⇔ Nc=383,6N_c=383{,}6 : on prend Nc=384\boxed{N_c=384} (Tc=45,01T_c=45{,}01, affiché 45).

5 Drill PIC-C.5 — capteur LM35 : choisir ADCON1, calculer la température et l'afficher en BCD par Dec2Bcd
Entraînement 05 / 05

Drill PIC-C.5 — capteur LM35 : choisir ADCON1, calculer la température et l'afficher en BCD par Dec2Bcd

1 questionCorrigé masqué

Une étuve de séchage de pièces peintes affiche sa température sur deux afficheurs 7 segments reliés au port C d'un PIC 16F876A par deux décodeurs 7447 (dizaines sur RC7…RC4, unités sur RC3…RC0). Le capteur LM35 délivre sur RA0/AN0 une tension proportionnelle à la température ; la valeur affichée est obtenue par T=N×5001023T=\dfrac{N\times500}{1023}.

Extrait du document constructeur du PIC 16F876A — registre ADCON1 (ADFM = 1 : résultat justifié à droite ; A : entrée analogique ; D : broche numérique ; références VDDV_{DD} et VSSV_{SS}) :

ADCON1RA5RA3RA2RA1RA0
1000 0000AAAAA
1000 0100DADAA
1000 0110DDDDD
1000 1110DDDDA

1. Quelle est la nature du signal appliqué sur RA0/AN0 ? Choisir la valeur d'ADCON1 qui fait de RA0/AN0 la seule entrée analogique.

2. Compléter le programme.

unsigned int N;                  // résultat de la conversion
unsigned short T;                // température entière
void main() {
  ADCON1 = 0x……;                 // RA0/AN0 seule analogique
  TRISA = 0xFF;
  TRISC = 0x……;                  // port C en sortie
  while (1) {
    N = ADC_Read(……);            // lecture de RA0/AN0
    T = ……………………;               // calcul de la température
    PORTC = ……………;               // conversion en BCD
  }
}

3. Le CAN délivre N=90N=90. Calculer TT et la valeur écrite dans PORTC (en binaire).

4. Un élève écrit PORTC = T; sans conversion. Que reçoivent alors les décodeurs ?

5. Jusqu'à quelle valeur de NN l'affichage à deux chiffres convient-il ?

Voir la correction commentéeAprès avoir posé votre démarche

1. Le LM35 délivre une tension qui varie de façon continue : signal analogique. La ligne 1000 1110 rend RA0 analogique et les autres broches numériques : ADCON1=0x8E\boxed{\text{ADCON1}=0\text{x}8\text{E}}.

2.

ADCON1 = 0x8E;
TRISC = 0x00;
N = ADC_Read(0);
T = N * 500.0 / 1023;
PORTC = Dec2Bcd(T);

3. T=90×5001023=43,99T=\dfrac{90\times500}{1023}=43{,}99 ; l'affectation à un entier garde 43. Dec2Bcd(43) =0100 0011=\boxed{0100\,0011} (0x43) : les afficheurs montrent 4 et 3.

4. 43=0010 101143=0010\,1011 en binaire naturel : le décodeur des dizaines reçoit 0010 (il affiche 2) et celui des unités 1011, qui n'est pas un code BCD : le 7447 affiche un symbole sans signification.

5. Deux chiffres tant que T<100T<100 : N×5001023<100\dfrac{N\times500}{1023}<100 ⇔ N<204,6N<204{,}6, soit N≤204\boxed{N\le204}. Un pas du CAN vaut 500/1023≈0,49500/1023\approx0{,}49 °C.

Relier ce raisonnement au bac

Choisis une filière pour voir les sujets qui étayent ce scénario.