Microcontrôleurs PIC
1ère séance Présentation du PIC16F876 Outils de programmation du PIC Le langage C Exemples d’applications simples 2ème séance Présentation des motorisations Interfaçage avec le PIC Capteurs IR Interfaçage avec le PIC
1ère séance
PIC 16F876 (I) L’architecture interne : Mémoire programme (FLASH) 8K mots de 14 bits Mémoire RAM 368 octets Mémoire utilisateur (EEPROM) 256 octets Unité de calcul (ALU) Circuit d’horloge (ex 16 Mhz => 4 MIPS) Périphériques internes Ports d’entrées/sorties
Les périphériques internes : 3 compteurs indépendants 5 convertisseurs analogiques/numériques 10 bits 1 port série connectable à un ordinateur 1 port I²C 1 port SPI (pour connecter des PICs entre eux) PIC 16F876 (II)
PIC 16F876 (III) Les ports d’entrées/sorties 5 ports distincts (A:6 B:8 C:8) : 22 e/s Courant max en sortie : 20mA/pin ; 200mA/port Registre de sortie (effet mémoire) Entrées analogiques : 0 ~ 5V Entrées numériques 0 ou 5 V
PIC 16F876 (IV) Pour que le PIC démarre : Circuit de RESET Circuit d’horloge Circuit d’alim
La programmation Langage C / BASIC Compilation Langage Assembleur Assemblage Hexadécimal Haut niveauBas niveau PIC PC ProgrammateurPIC
La programmation in-situ Elle évite de déconnecter le PIC du circuit à chaque programmation Connecteur de programmation Attention : Toujours couper l’alimentation de votre circuit durant la prog.
Le langage C Structure du programme en C #include //Définit le type de PIC utilisé #fuses HS,NOPROTECT,NOWDT //Fusibles de configuration #use delay(clock= ) //Vitesse du PIC : 16Mhz //emplacements pour les fonctions Void main(){ //Programme principal }
Le langage C Les Variables Son nom peut comporter plusieurs lettes/chiffres Les types de variables : Int : entier de 0 à 255 Bit : 0 ou 1 Char : Caractère dans la norme ASCII Float : réels 32 bits à virgule flottante Il faut définir toutes les variables au début du programme et de préférence leur attribuer une valeur par défaut #include #fuses HS,NOPROTECT,NOWDT #use delay(clock= ) Void main(){ Int a=0,b=1,test=0; }
Le langage C Les opérateurs Opérations de calcul + : addition - : soustraction * : multiplication / : division ^ : puissance % : modulo Opérations de test == : égalité entre 2 éléments != : inégalité > : supérieur >= : supérieur ou égal < : inférieur <= : inférieur ou égal Opérations logiques && : ET logique || : OU logique ! : NON logique Raccourcis i++ i = i + 1 : incrémentation i-- i = i – 1 : décrémentation x^=y x = x^y …
Le langage C Les boucles Boucle if : Void main(){ … If ((i==0)||(i!=12)){ //actionA }else{ //actionB } Boucle while : Void main(){ … While (i!=0){ //Action A } //ActionB } Boucle for : Void main(){ … For(j=0;j<=3;j++){ //Action A }
Le langage C Les Ports d’entrées/Sorties Ex : on a une led connectée sur la patte RA0, un bouton poussoir sur la patte RB0 Dans notre programme on va vouloir allumer la led et lire l’état du bouton poussoir Void main(){ If (input(PIN_RB0)){ // Si du 5V est présent sur la patte 0 du port B alors on rentre dans la boucle … } Output_bit(PIN_RA0,1) //On applique du 5V sur la patte 0 du port A }
Le langage C Les fonctions Elles peuvent être appelées à partir de main. Exemple : on fait une fonction lire_capteur() qui attends un signal d’un capteur branché sur la patte RA0 ou d’un autre sur la patte RA1 et renvoie 1 si le capteur RA0 est excité, 2 si le capteur RA1 l’est. Int lire_capteur (){ While((!input(PIN_A0))&&(!input(PIN_A1))){} //Tant que tout est à 0 on fait rien If(input(PIN_A0)) Return 1; Else Return 2; } Main(){ Int x; x = lire_capteur(); // x vaut 1 ou 2 selon l’état du capteur lors de l’appel de la fonction }
Le langage C Les commandes spéciales Rand() : x = rand(); //x prend une valeur aléatoire entre 0 et 255 Delay_ms() : pause dans un programme en ms Main(){ Output_bit(PIN_RA0,0); //Mets du 0V sur la patte RA0 Delay_ms(5000); //Attends 5 secondes Output_bit(PIN_RA0,1); //Mets du 5V sur la patte RA0 Reset_cpu() : fait un reset du PIC
Exemples 1er exemple : Faire clignoter une LED (500 ms allumée, 1s éteinte) #include #fuses HS,NOPROTECT,NOWDT #use delay(clock= ) #define LEDPIN_RB7 Void main(){ While( 1 ){ Output_bit(LED,1); Delay_ms(500); Output_bit(LED,0); Delay_ms(1000); }
Exemples 2ème exemple : Faire clignoter une LED (500 ms allumée, 1s éteinte), s’arrêtant lors de l’appui sur un bouton poussoir. #include #fuses HS,NOPROTECT,NOWDT #use delay(clock= ) #define LEDPIN_RB7 #define boutonPIN_RC4 Void main(){ While(input(bouton)){ Output_bit(LED,1); Delay_ms(500); Output_bit(LED,0); Delay_ms(1000); }
Exemples 3ème exemple : Faire une PWM (pulse width modulation) de fréquence 1kHz et de rapport cyclique variable sur la patte RA0 #include #fuses HS,NOPROTECT,NOWDT #use delay(clock= ) Void PWM( int i){ Int j; While (1){ Output_bit(PIN_RA0,1); For(j=0;j<i;j++){ Delay_us(10); } Output_bit(PIN_RA0,0); For(j=0;j<100-i;j++){ Delay_us(10); } Void main(){ PWM(33); //Applique une PWM de fréquence 1 kHz et de rapport cyclique 33% sur la patte RA0 }
Quelques applications du PIC
2ème séance
Les interruptions Il est possible d’interrompre le déroulement du programme lorsqu’un changement d’état intervient sur une ou plusieurs patte du port B ou C #include #fuses HS,NOPROTECT,NOWDT #use delay(clock= ) #INT_RB //changement d’état sur les pattes B4-B7 Void fonction_interruption(){...//Fonction d’interruption... } Void main(){ Enable_interrupts(INT_RB); //Activation des interruptions sur le port B... }
3 types de motorisation différents Le Servomoteur modifié mobile.htm Le moteur pas à pas Le moteur à courant continu
Servomoteur Présentation du Servomoteur Le servomoteur est constitué d’un moteur à courant continu relié à un réducteur, et asservit par un potentiomètre et un circuit de contrôle
Servomoteur Pour le commander, on lui applique des impulsions selon la norme suivante
Servomoteur Typiquement, un Servo est destiné à avoir une course de 180° et est asservi par un potentiomètre relié à l’axe du moteur. Modifier un servo consiste à lui permettre mécaniquement de faire un tour complet (on coupe la butée) Ensuite on déconnecte le potentiomètre et on le remplace par deux resistances de valeurs égales, ainsi, le circuit d’asservissement « à l’impression » d’être au point milieu.
Servomoteur modifié -Une impulsion de 1,5 ms va l’envoyer à la position 0° (où il est toujours) donc il ne bouge pas -Une impulsion de 1 ms va l’envoyer à -90° mais il n’y arrivera jamais donc il va tourner indéfiniment dans le sens anti-horaire -Une impulsion de 2 ms va l’envoyer à +90° mais il n’y arrivera jamais donc il va tourner indéfiniment dans le sens horaire Plus la durée de l’impulsion est proche du neutre (1,5 ms) plus il tournera doucement, inversement, plus cette durée est proche des extrêmes (1 ou 2 ms), plus il va tourner vite
Servomoteur modifié Vcc = 7,5V
Servomoteur modifié La fonction avance() permet de faire tourner le servo dans un sens à sa vitesse maxi #include #fuses HS,NOPROTECT,NOWDT #use delay(clock= ) #define SERVO PIN_RC4 Void avance(){ While(1){ Output_bit(SERVO,1);//On met à 1 pendant 2ms Delay_ms(2); Output_bit(SERVO,0); Delay_ms(18);//On met à 0 pendant 20 – 2 = 18ms } Void main(){ Avance(); }
Servomoteur Avantages : -Boîtier pratique -1 seul fil de commande par Servo -Directement pilotable par le PIC -Couple élevé Inconvénients : -Les impulsions doivent êtres précises et régulières -Vitesse assez faible -Prix : 7-8 € -Il faut le modifier
Moteur CC Transistor MOS : BUZ11 La consommation d’un tel moteur est d’environ 100mA, il est donc impossible de le connecter directement sur une patte du PIC
Pont en H Attention, toujours alimenter un pont en H en diagonale, sinon + sur –, pas bien
Moteur CC Avantages : -Rapide -Facile à commander -Répandu Inconvénients : -Assez compliqué pour un fonctionnement dans les 2 sens -Rond, donc plus difficile à fixer
Moteur Pas à Pas Moteur pas à pas bipolaire : plus facile à piloter que l’unipolaire En alimentant successivement les bobines A, B, C, D 2 à 2 on réalise 4 pas
Moteur pas à pas
#include #fuses HS,NOPROTECT,NOWDT #use delay(clock= ) Void avance(int i){ Int j; For(j=0;j<=i;j++){ Output_b(6); //1ère position Delay_ms(5); //pause entre 2 pas Output_b(5); //2ème position Delay_ms(5); //pause entre 2 pas Output_b(9); //3ème position Delay_ms(5); //pause entre 2 pas Output_b(10); //4ème position Delay_ms(5); //pause entre 2 pas } Return; } Void main(){ Avance(4); //Fait tourner le moteur de 16 pas } La fonction avance() permet de faire tourner le moteur pas à pas de n*4 pas Etat Etat Etat Etat1 portB RB0 DRB1 CRB2 BRB3 A 2^02^12^22^3
Moteur Pas à pas Avantages : -Rapide -Très précis -Peu coûteux Inconvénients : -Compliqué à mettre en œuvre -Pics de courants lors d’un pas
Le CNY70