Exercice — surveillance du vent d'une éolienne de pompage, programme MikroC à compléter, dans l'esprit des sessions 2016–2025
Une éolienne de pompage est protégée contre les vents forts. Un anémomètre délivre une tension qui dépend de la vitesse du vent. La carte à microcontrôleur PIC 16F876A de la figure 1 mesure , 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 km/h ; D1 pour km/h ; D1 et D2 pour km/h ; D1, D2 et D3 pour km/h ;
- le contacteur KF du frein du rotor (RB7, par le transistor T) : le frein est serré (KF = 1) dès que km/h et desserré (KF = 0) dès que 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 et ) :
| ADCON1 | RA5 | RA3 | RA2 | RA1 | RA0 |
|---|---|---|---|---|---|
| 1000 0000 | A | A | A | A | A |
| 1000 0100 | D | A | D | A | A |
| 1000 0110 | D | D | D | D | D |
| 1000 1110 | D | D | D | D | A |
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 de 0 à 1023 pour une tension de 0 à 5 V : .
// 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 de la caractéristique.
b. Montrer que .
c. Compléter les instructions de lecture, de mise à l'échelle et d'affichage.
4. Calculer la valeur de qui correspond à . 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 , puis (le vent faiblit), puis . Pour chaque relevé, calculer , 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 à 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 : . 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, → 0xFB ; TRISC : RC0 à RC2 en sortie, → 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.
Au point : , d'où km/h et ( en km/h, en V).
3.b On remplace par :
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, dépasserait 65 535 dès que .
4. pour V, soit . Pour (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.
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 : , donc km/h.
| N | V (km/h) | affiché | PORTC | KF |
|---|---|---|---|---|
| 400 | 93,30 | 93 | 0x07 | 1 (frein serré) |
| 330 | 72,77 | 72 | 0x03 | 1 (reste serré) |
| 280 | 58,11 | 58 | 0x01 | 0 (desserré) |
Pour , : 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 : ⇔ , soit ; desserrage : ⇔ , soit .