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-AAutomatisme — PIC et mikroPascal

PIC — TMR0 compteur, ADC et affichage LCD

Idée directrice

Sur PIC 16F876A en mikroPascal, on configure TMR0 en compteur d’impulsions (OPTION_REG, entrée RA4), le CAN/ADC (ADC_INIT, adc_read), puis on affiche avec lcd_out(ligne, colonne, texte).

Ce qui aide à reconnaître la démarche

PIC 16F876A ; TMR0 ; ADC ; lcd_out ; mikroPascal

Besoin d’un point de départ ? Voir la méthode

Ordre type : config TRIS/ports → ADC ou TMR0 → lcd_init → boucle while true lecture/calcul/affichage.

Écrire tout registre bit par bit avant de le convertir : %10001000 puis $88.

Les pièges à vérifier dans ta démarche

Inverser ligne/colonne dans lcd_out ; oublier ADC_INIT avant adc_read.

Sujet principal

Exercice — dans l’esprit des sujets techniques

6 questionsCorrigé masqué

A — Comptage (type 2019). Un capteur S2S2 est relié à l’entrée RA4 d’un PIC 16F876A pour compter des fûts.

  1. Pourquoi choisir RA4 / TMR0 plutôt qu’une simple entrée logique pollée pour compter des impulsions rapides ?
  2. Que configure l’instruction OPTION_REG:=$E8 dans le corrigé type (compteur à front montant sur RA4) ?
  3. Cite deux instructions d’initialisation de l’afficheur LCD vues au bac.

B — Mesure de vitesse (type 2022). Une dynamo tachymétrique livre 00–5 V5\,\mathrm{V} sur RA3/AN3. La vitesse se calcule ncalcul=16×M1023n_{\mathrm{calcul}}=\dfrac{16\times M}{1023} où MM est la lecture ADC 10 bits.

  1. Écrire la séquence d’initialisation : module CAN + lecture de la voie 3.
  2. Si M=511M=511, calculer ncalculn_{\mathrm{calcul}} (valeur réelle).
  3. Compléter : lcd_out(1,1, …… ); pour afficher le texte Vitesse de rotation en ligne 1 colonne 1.
Voir la correction commentéeAprès avoir posé votre démarche

A1. TMR0 en mode compteur incrémente sur les fronts sans rater d’impulsions entre deux lectures logicielles (corrigé 2019).

A2. Configure le timer/compteur pour compter sur front montant de RA4 (OPTION_REG:=$E8).

A3. lcd_init(); et lcd_cmd(_LCD_CURSOR_OFF);.

B1. ADC_INIT(); puis M:= adc_read(3);.

B2. ncalcul=16×511/1023≈8,0n_{\mathrm{calcul}}=16\times 511/1023\approx 8{,}0.

B3. lcd_out(1,1,'Vitesse de rotation '); (corrigé 2022).

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 : comptage par TMR0 sur RA4 (OPTION_REG := $E8, 2018 principale), lecture analogique puis affichage LCD, commande d'un moteur par MLI (2017 principale, 2020), interruption sur RB4…RB7 avec INTCON = 0x88 (2024 contrôle, 2025) ; depuis 2024 les programmes sont en MikroC.

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

1 Drill — ADC 10 bits
Entraînement 01 / 13

Drill — ADC 10 bits

1 questionCorrigé masqué

Sur le PIC, après ADC_INIT et adc_read(3), pourquoi divise-t-on par 10231023 dans ncalcul=(16M)/1023n_{\mathrm{calcul}}=(16 M)/1023 pour l’affichage LCD ?

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

L’ADC 10 bits du PIC code 00–10231023 pour 00–VrefV_{\mathrm{ref}} ; on normalise MM avant lcd_out / bytetostr.

2 Drill — RA4
Entraînement 02 / 13

Drill — RA4

1 questionCorrigé masqué

Relier le capteur de comptage à RA4 sert à : (a) PWM (b) compteur d’impulsions TMR0 (c) DAC.

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

(b) compteur d’impulsions via TMR0 (corrigé 2019).

3 PIC — RA4 et TMR0 en mode compteur
Entraînement 03 / 13

PIC — RA4 et TMR0 en mode compteur

3 questionsCorrigé masqué

Sur une carte à PIC 16F876A (sujet type fabrication de fûts), un capteur S2S2 détecte chaque fût fabriqué. On relie S2S2 à l’entrée RA4 pour compter les impulsions via le timer TMR0 programmé en mode compteur (mikroPascal Pro).

  1. Pourquoi relier le capteur à RA4 plutôt qu’à une entrée logique quelconque pollée en boucle ?
  2. Que configure l’instruction OPTION_REG:=\$E8 d’après le corrigé type ?
  3. Écrire l’instruction qui remet TMR0 à zéro avant la boucle de comptage.
Voir la correction commentéeAprès avoir posé votre démarche

1. RA4 est l’entrée externe du TMR0 en mode compteur : chaque impulsion incrémente le timer matériellement, sans rater d’impulsions rapides qu’un simple test logiciel pourrait manquer.

2. OPTION_REG:=\$E8 configure le compteur à front montant sur RA4 (commentaire du corrigé 2019).

3. tmr0:=0; initialise le compteur avant le while true do.

4 PIC — initialisation de l’afficheur LCD
Entraînement 04 / 13

PIC — initialisation de l’afficheur LCD

3 questionsCorrigé masqué

Un programme mikroPascal affiche des grandeurs sur un LCD 2 lignes branché sur un port du PIC (sujet type 2019). On dispose des routines bibliothèque lcd_init, lcd_cmd, lcd_out.

  1. Citer deux instructions d’initialisation de l’afficheur LCD vues au bac.
  2. Compléter : lcd_out(1,5, txt1); affiche txt1 sur quelle ligne et quelle colonne ?
  3. Pourquoi déclarer les bits LCD_RS, LCD_EN, LCD_D4… LCD_D7 avant le begin principal ?
Voir la correction commentéeAprès avoir posé votre démarche

1. Exemples du corrigé : lcd_init(); et lcd_cmd(_LCD_CURSOR_OFF);.

2. Ligne 1, colonne 5 : la signature est lcd_out(ligne, colonne, texte).

3. Ces sbit décrivent le câblage matériel de l’afficheur sur les broches du microcontrôleur ; sans cette déclaration, les routines LCD ne savent pas quelles broches piloter.

5 PIC — ADC 10 bits et formule n_calcul
Entraînement 05 / 13

PIC — ADC 10 bits et formule n_calcul

3 questionsCorrigé masqué
Une dynamo tachymétrique livre une tension 00–5 V5\,\mathrm{V} sur la broche RA3/AN3 d’un PIC. Après conversion, la vitesse affichée est calculée par
ncalcul=16×M1023n_{\mathrm{calcul}}=\dfrac{16\times M}{1023}

où MM est la lecture entière du CAN 10 bits.
  1. Écrire la séquence d’instructions : configuration de RA3 en analogique, ADC_INIT, puis lecture de la voie 3.
  2. Si M=767M=767, calculer ncalculn_{\mathrm{calcul}} (valeur réelle).
  3. Pourquoi le dénominateur est-il 10231023 et non 10001000 ?
Voir la correction commentéeAprès avoir posé votre démarche

1. Exemple type corrigé 2022 : configuration ADCON1 pour RA3/AN3 analogique, ADC_INIT();, puis M:= adc_read(3);.

2. ncalcul=16×7671023=122721023≈12,00n_{\mathrm{calcul}}=\dfrac{16\times 767}{1023}=\dfrac{12272}{1023}\approx 12{,}00.

3. Un CAN 10 bits code 210−1=10232^{10}-1=1023 quanta entre 00 et VrefV_{\mathrm{ref}} ; 10231023 est la pleine échelle numérique, pas une base décimale.

6 PIC — lecture adc_read et affichage vitesse
Entraînement 06 / 13

PIC — lecture adc_read et affichage vitesse

3 questionsCorrigé masqué

Après M:= adc_read(3); et n_calcul:= (16 * M) / 1023;, le programme convertit la vitesse en octet pour l’affichage LCD : n:= byte(n_calcul); puis bytetostr / lcd_out.

  1. Pourquoi convertir n_calcul (type réel) en byte avant l’affichage ?
  2. Écrire l’instruction lcd_out pour afficher le texte Vitesse de rotation en ligne 1, colonne 1.
  3. Si M=0M=0, que vaut ncalculn_{\mathrm{calcul}} ? Interpréter physiquement (dynamo à l’arrêt).
Voir la correction commentéeAprès avoir posé votre démarche

1. Les routines d’affichage numériques du bac travaillent souvent sur des entiers / chaînes ; byte(n_calcul) retient la partie entière affichable sur le LCD.

2. lcd_out(1,1,'Vitesse de rotation ');

3. ncalcul=0n_{\mathrm{calcul}}=0 : tension nulle sur AN3 → vitesse nulle (arbre arrêté). C’est un contrôle de cohérence simple avant une action de sécurité.

7 PIC — structure d’un programme mikroPascal
Entraînement 07 / 13

PIC — structure d’un programme mikroPascal

3 questionsCorrigé masqué

Un corrigé de bac Technique demande de compléter un programme en mikroPascal PRO pour un PIC16F876A : déclaration des variables, configuration des TRIS, initialisation LCD, puis boucle while true do.

  1. Quelle est la première ligne typique (entête) d’un programme mikroPascal ?
  2. Que signifie configurer un bit de TRISB à 00 ? à 11 ?
  3. Pourquoi le corrigé rappelle-t-il de faire correspondre chaque begin à un end ?
Voir la correction commentéeAprès avoir posé votre démarche

1. Program suivi du nom du programme et d’un point-virgule, par exemple Program compt_lcd_16F876A;.

2. TRIS=0 : broche en sortie ; TRIS=1 : broche en entrée.

3. Un begin sans end (ou l’inverse) casse la structure des boucles et des blocs conditionnels : le programme ne compile pas ou exécute une logique fausse.

8 PIC — comptage d’un lot et condition TMR0
Entraînement 08 / 13

PIC — comptage d’un lot et condition TMR0

3 questionsCorrigé masqué

On compte un lot de fûts avec TMR0. Le cahier des charges indique qu’on traite la production tant que le compteur reste strictement inférieur à 100100 : dans le programme, le test s’écrit if tmr0 < 100 then ….

  1. Que représente la variable tmr0 dans ce programme de comptage ?
  2. Si tmr0 vaut 3737, le test tmr0 < 100 est-il vrai ? Que fait-on typiquement dans le then ?
  3. Pourquoi initialiser tmr0:=0 avant la boucle while true do ?
Voir la correction commentéeAprès avoir posé votre démarche

1. tmr0 est le contenu du timer/compteur matériel : il vaut le nombre d’impulsions (fûts) déjà comptées depuis la dernière remise à zéro.

2. Oui, 37<10037<100 est vrai. On calcule souvent une grandeur dérivée et on affiche le compte via byteToStr puis lcd_out.

3. Sans remise à zéro, le compteur pourrait démarrer à une valeur résiduelle et fausser le lot (dépassement prématuré de 100100).

9 PIC — ADCON1 et entrée analogique AN3
Entraînement 09 / 13

PIC — ADCON1 et entrée analogique AN3

3 questionsCorrigé masqué

Avant d’appeler ADC_INIT() et adc_read(3), le corrigé configure le registre ADCON1 pour que la broche RA3/AN3 soit une entrée analogique (dynamo tachymétrique 00–5 V5\,\mathrm{V}).

  1. Pourquoi faut-il configurer RA3 en analogique avant la lecture ADC ?
  2. Que fait ADC_INIT() dans la séquence type du bac ?
  3. Si l’on lit par erreur la voie 00 au lieu de la voie 33, que risque-t-on physiquement pour la mesure de vitesse ?
Voir la correction commentéeAprès avoir posé votre démarche

1. Sans configuration analogique, la broche reste numérique : le CAN ne convertit pas correctement la tension de la dynamo.

2. ADC_INIT() initialise le module CAN (horloge, références, état interne) avant les lectures adc_read.

3. On lirait une autre voie (éventuellement non câblée) : la vitesse calculée serait fausse même si la formule 16M/102316M/1023 est correcte.

10 Drill PIC-A.10 — Registre INTCON : interruptions sur RB0 et sur RB4 à RB7
Entraînement 10 / 13

Drill PIC-A.10 — Registre INTCON : interruptions sur RB0 et sur RB4 à RB7

4 questionsCorrigé masquéEn cours de relecture

Un PIC 16F876A surveille un bouton d'arrêt d'urgence sur RB0/INT et quatre capteurs sur RB4 à RB7. Le programme est écrit en mikroPascal. Registre INTCON, du bit 7 au bit 0 : GIE, PEIE, T0IE, INTE, RBIE, T0IF, INTF, RBIF.

  1. Donner, en binaire puis en hexadécimal, la valeur d'INTCON pour n'autoriser que l'interruption sur RB0.
  2. Même question pour n'autoriser que l'interruption sur un changement de RB4 à RB7, puis pour autoriser les deux.
  3. Quelle valeur de TRIS convient au port B si RB0 et RB4 à RB7 sont des entrées et RB1 à RB3 des sorties ?
  4. Dans la procédure d'interruption des capteurs RB4 à RB7, pourquoi lit-on PORTB avant d'écrire à nouveau INTCON ?

Cet exercice et sa correction sont en cours de relecture. Tu peux les consulter ; l’exercice n’est pas encore proposé en séance.

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

Idée : on écrit le registre bit par bit (autorisation générale GIE plus l'autorisation de la source), puis on convertit.

1. GIE =1=1, INTE =1=1 : INTCON := %10010000; soit $90 en hexadécimal.

2. GIE et RBIE : %10001000, soit $88 ; les deux sources : %10011000, soit $98.

3. Bits à 1 pour les entrées : RB7…RB4 =1111=1111, RB3…RB1 =000=000, RB0 =1=1 : TRISB := %11110001; soit $F1.

4. Le changement sur RB4 à RB7 verrouille le drapeau RBIF à 1 ; une lecture de PORTB déverrouille ce drapeau, qui peut alors être remis à 0 en réécrivant INTCON := $88. Sans cette lecture, la routine se relancerait sans fin.

11 Drill PIC-A.11 — Potentiomètre, CAN 10 bits et MLI d'un moteur
Entraînement 11 / 13

Drill PIC-A.11 — Potentiomètre, CAN 10 bits et MLI d'un moteur

4 questionsCorrigé masquéEn cours de relecture

Un PIC 16F876A règle la vitesse d'un petit moteur à courant continu alimenté en 12 V12\,\mathrm{V} par un transistor commandé par la sortie CCP1. La consigne vient d'un potentiomètre branché sur RA0/AN0 ; le module CAN est initialisé par ADC_Init() (00 à 5 V5\,\mathrm{V}). Le programme mikroPascal exécute :

N := ADC_Read(0); K := byte(255*N/1023); PWM1_Set_Duty(K); après PWM1_Init(1000); PWM1_Start();

  1. Le potentiomètre délivre 1,8 V1{,}8\,\mathrm{V}. Calculer la valeur entière NN lue par ADC_Read.
  2. Calculer KK, puis le rapport cyclique α=K/255\alpha=K/255.
  3. Calculer la tension moyenne aux bornes du moteur et la durée de l'état haut sur une période.
  4. Pourquoi NN doit-il être déclaré word et KK peut-il être un byte ?

Cet exercice et sa correction sont en cours de relecture. Tu peux les consulter ; l’exercice n’est pas encore proposé en séance.

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

Idée : deux mises à l'échelle se suivent : tension vers 0…10230\ldots1023, puis 0…10230\ldots1023 vers 0…2550\ldots255.

1. N=1023×1,8/5=368,3N=1023\times1{,}8/5=368{,}3 ; le convertisseur rend N=368\mathbf{N=368}.

2. K=255×368/1023≈91,7K=255\times368/1023\approx91{,}7, tronqué par byte : K=91\mathbf{K=91} ; α=91/255≈0,357\alpha=91/255\approx\mathbf{0{,}357}.

3. Umoy=α×12≈4,28 VU_{moy}=\alpha\times12\approx\mathbf{4{,}28\,V}. À 1000 Hz1000\,\mathrm{Hz}, T=1 msT=1\,\mathrm{ms} et l'état haut dure αT≈0,357 ms\alpha T\approx\mathbf{0{,}357\,ms}.

4. NN va jusqu'à 10231023, au-delà des 255255 d'un octet : il faut 16 bits (word). KK ne dépasse jamais 255255 et tient dans un byte.

12 Drill PIC-A.12 — PWM1 et PWM2 d'un PIC sur un pont en H : un module par sens, arrêter l'autre, K = 255·α
Entraînement 12 / 13

Drill PIC-A.12 — PWM1 et PWM2 d'un PIC sur un pont en H : un module par sens, arrêter l'autre, K = 255·α

1 questionCorrigé masqué

Le chariot porte-outil d'une scie à panneaux est déplacé par un moteur à courant continu Mt alimenté en 24 V24\text{ V} par un pont en H. Bras gauche : T1 en haut, T3 en bas ; bras droit : T2 en haut, T4 en bas ; le moteur est branché entre les milieux des deux bras. Un PIC 16F876A commande le pont : la sortie PWM1 (RC2/CCP1) attaque la diagonale T1–T4 (avance), la sortie PWM2 (RC1/CCP2) la diagonale T2–T3 (recul). Entrées sur le port A : DCY (RA0, départ cycle), S1 (RA1, approche de la pièce), S2 (RA2, fin de coupe), S0 (RA3, chariot en position arrière).

Cycle : si DCY = 1 et S0 = 1, avance rapide (α=1\alpha=1) jusqu'à S1, puis avance lente (α=0,4\alpha=0{,}4) jusqu'à S2, puis recul (α=0,75\alpha=0{,}75) jusqu'à S0, puis arrêt. Les deux modules travaillent à 2 kHz2\text{ kHz}. Les broches non utilisées d'un port sont configurées en entrées. PWMx_Set_Duty(K) reçoit un entier KK de 00 à 255255 (α=K/255\alpha=K/255) : on prend la partie entière de 255α255\alpha.

1. Compléter le programme en mikroPascal Pro.

program chariot;
var DCY : sbit at RA0_bit;
    S1  : sbit at RA1_bit;
    S2  : sbit at RA2_bit;
    S0  : sbit at RA3_bit;
    X   : byte;           // 0 repos, 1 et 2 avance, 3 recul
begin
  TRISA := $FF;  TRISC := $……;   // RC1 et RC2 en sortie
  ADCON1 := $06;                 // port A numérique
  PORTC := $00;
  PWM1_Init(……);  PWM2_Init(……); // f = 2 kHz
  X := 0;
  while true do
  begin
    if (X = 0) and (DCY = 1) and (S0 = 1) then
      begin PWM1_Start(); PWM1_Set_Duty(……); X := 1; end;
    if (X = 1) and (S1 = 1) then
      begin PWM1_Set_Duty(……); X := 2; end;
    if (X = 2) and (S2 = 1) then
      begin ……………; ……………; PWM2_Set_Duty(……); X := 3; end;
    if (X = 3) and (S0 = 1) then
      begin ……………; X := 0; end;
  end;
end.

2. Donner KK pour chaque phase, puis la tension moyenne UmoyU_{moy} aux bornes du moteur. On admet que la vitesse est proportionnelle à UmoyU_{moy} et vaut 1500 tr/min1500\text{ tr/min} sous 24 V24\text{ V} : calculer la vitesse de chaque phase.

3. Calculer la période du signal PWM et la durée de l'état haut pendant l'avance lente.

4. Pourquoi le recul utilise-t-il PWM2, et non PWM1 avec un autre rapport cyclique ?

5. Au passage au recul, que se passerait-il si l'on démarrait PWM2 sans arrêter PWM1 ?

Voir la correction commentéeAprès avoir posé votre démarche
1. Idée : un module par diagonale, donc par sens de rotation ; changer de sens, c'est arrêter un module avant de démarrer l'autre.

TRISA := $FF;  TRISC := $F9;      // TRISC = %11111001
PWM1_Init(2000);  PWM2_Init(2000);
PWM1_Set_Duty(255);               // avance rapide, α = 1
PWM1_Set_Duty(102);               // avance lente, α = 0,4
PWM1_Stop(); PWM2_Start(); PWM2_Set_Duty(191);   // recul
PWM2_Stop();                      // arrêt en position arrière

Un bit de TRIS à 00 met la broche en sortie : seuls les bits 1 (RC1) et 2 (RC2) sont à 00, d'où 1111 10011111\,1001, soit F9 en hexadécimal. PWM1_Init et PWM2_Init reçoivent la fréquence en hertz.

2. Idée : KK = partie entière de 255α255\alpha, puis Umoy=K255 UU_{moy}=\dfrac{K}{255}\,U.

Phaseα\alpha255α255\alphaKKUmoyU_{moy}nn
Avance rapide1125525525525524 V24\text{ V}1500 tr/min1500\text{ tr/min}
Avance lente0,40{,}41021021021029,6 V9{,}6\text{ V}600 tr/min600\text{ tr/min}
Recul0,750{,}75191,25191{,}2519119117,98 V17{,}98\text{ V}1124 tr/min1124\text{ tr/min}

En recul, la diagonale T2–T3 inverse le signe de la tension : Umoy≈−17,98 VU_{moy}\approx-17{,}98\text{ V}, le tableau en donne la valeur absolue et le moteur tourne en sens inverse. Pour le recul :

Umoy=191255×24≈17,98 VU_{moy}=\dfrac{191}{255}\times24\approx\boxed{17{,}98\text{ V}}
n=1500×17,9824≈1124 tr/minn=1500\times\dfrac{17{,}98}{24}\approx\boxed{1124\text{ tr/min}}

3.

T=12000=0,5 msT=\dfrac{1}{2000}=\boxed{0{,}5\text{ ms}}
tH=α T=0,4×0,5=0,2 mst_H=\alpha\,T=0{,}4\times0{,}5=\boxed{0{,}2\text{ ms}}

4. α\alpha ne règle que la valeur de UmoyU_{moy}, dont le signe est fixé par la diagonale qui conduit : α=0\alpha=0 arrête le moteur, il ne l'inverse pas. Pour inverser le courant dans l'induit, donc le sens de rotation, il faut faire conduire l'autre diagonale (T2–T3), commandée par PWM2.

5. Les deux modules seraient actifs ensemble : pendant les états hauts communs, T1 et T3 (bras gauche), T2 et T4 (bras droit) conduiraient en même temps. L'alimentation 24 V24\text{ V} serait court-circuitée à travers les bras et les transistors détruits. D'où l'ordre PWM1_Stop(); avant PWM2_Start();.

13 Drill PIC-A.13 — α réglé par potentiomètre et corrigé de ±0,1 par deux boutons : anti-rebond, bornes 0,1 ≤ α ≤ 0,9
Entraînement 13 / 13

Drill PIC-A.13 — α réglé par potentiomètre et corrigé de ±0,1 par deux boutons : anti-rebond, bornes 0,1 ≤ α ≤ 0,9

1 questionCorrigé masqué

L'extracteur d'air d'une cabine de peinture est entraîné par un moteur à courant continu alimenté en 24 V24\text{ V} à travers un transistor commandé par la sortie PWM1 (RC2/CCP1) d'un PIC 16F876A. Le réglage de base vient d'un potentiomètre (00 à 5 V5\text{ V}) relié à RA0/AN0 ; l'opérateur l'affine avec deux boutons-poussoirs, PLUS sur RB0 et MOINS sur RB1 (niveau 1 à l'appui). Chaque appui ajoute ou retranche 0,10{,}1 à une correction KK, et α=N1023+K\alpha=\dfrac{N}{1023}+K. Le fabricant du variateur impose 0,1≤α≤0,90{,}1\le\alpha\le0{,}9. Fréquence du signal PWM : 4 kHz4\text{ kHz}.

On admet que le convertisseur rend la partie entière de 1023 VAN0/51023\,V_{AN0}/5, que PWM1_Set_Duty ne garde que la partie entière de 255α255\alpha, et qu'un appui bref n'est pris en compte qu'une fois.

1. Compléter le programme en mikroPascal Pro. Quel est le rôle de delay_ms(40) ?

program extracteur;
var N : word;  alpha, K : real;
begin
  ADCON1 := %10001110;   // AN0 analogique, justifié à droite
  TRISA := $FF;  TRISB := $FF;  TRISC := $……;
  PORTC := $00;
  ADC_Init();
  PWM1_Init(……);         // f = 4 kHz
  PWM1_Start();
  K := 0;  alpha := 0.5;
  while true do
  begin
    N := ADC_Read(……);
    if (RB0_bit = 1) then              // PLUS
      begin delay_ms(40);
      if (alpha < 0.9) then K := K + 0.1; end;
    if (RB1_bit = 1) then              // MOINS
      begin ……………;
      if (alpha > ……) then K := ……………; end;
    alpha := ……………;
    if (alpha > 0.9) then alpha := ……;
    if (alpha < 0.1) then alpha := ……;
    PWM1_Set_Duty(255 * alpha);
    delay_ms(5);
  end;
end.

2. Le potentiomètre délivre 2,2 V2{,}2\text{ V} et K=0K=0. Calculer NN, α\alpha, l'entier reçu par PWM1_Set_Duty et la tension moyenne UmoyU_{moy} aux bornes du moteur.

3. Sans toucher au potentiomètre, l'opérateur appuie 6 fois sur PLUS. Donner KK et α\alpha après chaque appui. Calculer UmoyU_{moy} après le 3e appui, puis quand α\alpha est à sa borne haute.

4. Le potentiomètre est ramené à 0,3 V0{,}3\text{ V} avec K=0K=0. Que valent NN, α\alpha et l'entier envoyé au module PWM ? Que produit un appui sur MOINS ?

5. Une autre version du programme teste if (alpha <= 0.9) avant d'ajouter 0,10{,}1. Potentiomètre à 2,2 V2{,}2\text{ V}, K=0K=0 : l'opérateur appuie 8 fois sur PLUS, puis plusieurs fois sur MOINS. Combien d'appuis sur MOINS faut-il pour que la vitesse baisse ? Expliquer.

Voir la correction commentéeAprès avoir posé votre démarche
1. Idée : MOINS est le symétrique de PLUS ; les bornes de α\alpha s'appliquent après le calcul, juste avant PWM1_Set_Duty.

TRISB := $FF;  TRISC := $FB;     // TRISC = %11111011
PWM1_Init(4000);
N := ADC_Read(0);
begin delay_ms(40);
if (alpha > 0.1) then K := K - 0.1; end;
alpha := N / 1023 + K;
if (alpha > 0.9) then alpha := 0.9;
if (alpha < 0.1) then alpha := 0.1;

Seule RC2 est en sortie : 1111 10111111\,1011, soit FB en hexadécimal. delay_ms(40) est l'anti-rebond : le contact rebondit pendant quelques millisecondes, on attend la fin des rebonds avant de modifier KK. Les tests alpha < 0.9 et alpha > 0.1 refusent de modifier KK quand α\alpha est déjà à sa borne.

2. Idée : NN est entier, α\alpha est un réel ; seule la partie entière de 255α255\alpha part vers le module PWM.

N=1023×2,25=450,12⇒N=450N=\dfrac{1023\times2{,}2}{5}=450{,}12\Rightarrow\boxed{N=450}
α=4501023≈0,440\alpha=\dfrac{450}{1023}\approx\boxed{0{,}440}

255α≈112,17255\alpha\approx112{,}17 : PWM1_Set_Duty reçoit 112\boxed{112}.

Umoy=112255×24≈10,54 VU_{moy}=\dfrac{112}{255}\times24\approx\boxed{10{,}54\text{ V}}

3. Idée : chaque appui teste d'abord α\alpha ; le calcul suivant est ensuite borné.

Appui123456
KK0,10{,}10,20{,}20,30{,}30,40{,}40,50{,}50,50{,}5
α\alpha0,540{,}540,640{,}640,740{,}740,840{,}840,900{,}900,900{,}90

Au 5e appui, N/1023+K≈0,94>0,9N/1023+K\approx0{,}94>0{,}9 : α\alpha est ramené à 0,90{,}9. Au 6e, le test alpha < 0.9 est faux : KK n'est plus modifié.

Après le 3e appui, 255×0,74≈188,7255\times0{,}74\approx188{,}7 donne 188188 :

Umoy=188255×24≈17,69 VU_{moy}=\dfrac{188}{255}\times24\approx\boxed{17{,}69\text{ V}}

À la borne haute, 255×0,9=229,5255\times0{,}9=229{,}5 donne 229229 :

Umoy=229255×24≈21,55 VU_{moy}=\dfrac{229}{255}\times24\approx\boxed{21{,}55\text{ V}}

4. N=1023×0,3/5=61,38N=1023\times0{,}3/5=61{,}38, soit N=61N=61 ; 61/1023≈0,060<0,161/1023\approx0{,}060<0{,}1, donc α=0,1\boxed{\alpha=0{,}1}. 255×0,1=25,5255\times0{,}1=25{,}5 : le module reçoit 25\boxed{25}, Umoy=25/255×24≈2,35 VU_{moy}=25/255\times24\approx2{,}35\text{ V}. Un appui sur MOINS ne fait rien : alpha > 0.1 est faux. Les boutons ne peuvent pas arrêter l'extracteur.

5. Idée : avec <=, une borne atteinte laisse encore passer le test. Après le 5e appui, α=0,9\alpha=0{,}9 ; aux appuis 6, 7 et 8, 0.9 <= 0.9 est vrai : KK passe à 0,60{,}6, 0,70{,}7 puis 0,80{,}8, mais le bornage maintient α=0,9\alpha=0{,}9 et rien ne change. Sur MOINS, KK redescend à 0,70{,}7, 0,60{,}6, 0,50{,}5 sans effet visible (α\alpha calculé vaut encore 1,141{,}14, 1,041{,}04, 0,940{,}94) ; ce n'est qu'au 4e appui (K=0,4K=0{,}4) que α\alpha tombe à 0,840{,}84. Il faut donc 4\boxed{4} appuis sur MOINS : l'opérateur croit le bouton en panne pendant les trois premiers. Le test strict alpha < 0.9 évite cette réserve cachée.

Relier ce raisonnement au bac

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

Autres repères du catalogue · toutes filières

Autres sujets de référence

Bac Technique — PIC (2019 comptage / 2022 ADC)· Partie B — Génie électriquelien confirméTMR0, ADC, LCD mikroPascal