Microcontrleurs PIC 1re sance Prsentation du PIC 16

  • Slides: 41
Download presentation
Microcontrôleurs PIC

Microcontrôleurs PIC

1ère séance • Présentation du PIC 16 F 876 • Outils de programmation du

1ère séance • Présentation du PIC 16 F 876 • 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

1ère séance

PIC 16 F 876 (I) L’architecture interne : • Mémoire programme (FLASH) 8 K

PIC 16 F 876 (I) L’architecture interne : • Mémoire programme (FLASH) 8 K 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

PIC 16 F 876 (II) Les périphériques internes : • 3 compteurs indépendants •

PIC 16 F 876 (II) 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 16 F 876 (III) Les ports d’entrées/sorties • 5 ports distincts (A: 6

PIC 16 F 876 (III) Les ports d’entrées/sorties • 5 ports distincts (A: 6 B: 8 C: 8) : 22 e/s • Courant max en sortie : 20 m. A/pin ; 200 m. A/port • Registre de sortie (effet mémoire) • Entrées analogiques : 0 ~ 5 V • Entrées numériques 0 ou 5 V

PIC 16 F 876 (IV) Circuit de RESET Pour que le PIC démarre :

PIC 16 F 876 (IV) Circuit de RESET Pour que le PIC démarre : Circuit d’alim Circuit d’horloge

La programmation PC Programmateur C Langage C / BASIC n tio la pi om

La programmation PC Programmateur C Langage C / BASIC n tio la pi om ge a l b PIC Hexadécimal em s As Langage Assembleur Haut niveau Bas niveau PIC

La programmation in-situ Elle évite de déconnecter le PIC du circuit à chaque programmation

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 <16 F 876 a. h>

Le langage C Structure du programme en C #include <16 F 876 a. h> //Définit le type de PIC utilisé #fuses HS, NOPROTECT, NOWDT //Fusibles de configuration #use delay(clock=16000000) //Vitesse du PIC : 16 Mhz //emplacements pour les fonctions Void main(){ //Programme principal }

Le langage C Les Variables Son nom peut comporter plusieurs lettes/chiffres Les types de

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 <16 F 876 a. h> #fuses HS, NOPROTECT, NOWDT #use delay(clock=16000000) Void main(){ Int a=0, b=1, test=0; . . . . }

Le langage C Les opérateurs Opérations de calcul Opérations de test Opérations logiques +

Le langage C Les opérateurs Opérations de calcul Opérations de test Opérations logiques + : addition == : égalité entre 2 éléments && : ET logique - : soustraction != : inégalité || : OU logique * : multiplication > : supérieur ! : NON logique / : division >= : supérieur ou égal ^ : puissance < : inférieur % : modulo <= : inférieur ou égal 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 : Boucle while : Boucle for :

Le langage C Les boucles Boucle if : Boucle while : Boucle for : Void main(){ … … … For(j=0; j<=3; j++){ If ((i==0)||(i!=12)){ While (i!=0){ //Action A //action. A //Action A } }else{ } } //action. B //Action. B } } }

Le langage C Les Ports d’entrées/Sorties Ex : on a une led connectée sur

Le langage C Les Ports d’entrées/Sorties Ex : on a une led connectée sur la patte RA 0, un bouton poussoir sur la patte RB 0 Dans notre programme on va vouloir allumer la led et lire l’état du bouton poussoir Void main(){ If (input(PIN_RB 0)){ // Si du 5 V est présent sur la patte 0 du port B alors on rentre dans la boucle … } Output_bit(PIN_RA 0, 1) //On applique du 5 V sur la patte 0 du port A }

Le langage C Les fonctions Elles peuvent être appelées à partir de main. Exemple

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 RA 0 ou d’un autre sur la patte RA 1 et renvoie 1 si le capteur RA 0 est excité, 2 si le capteur RA 1 l’est. Int lire_capteur (){ While((!input(PIN_A 0))&&(!input(PIN_A 1))){} //Tant que tout est à 0 on fait rien If(input(PIN_A 0)) 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

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_RA 0, 0); //Mets du 0 V sur la patte RA 0 Delay_ms(5000); //Attends 5 secondes Output_bit(PIN_RA 0, 1); //Mets du 5 V sur la patte RA 0 Reset_cpu() : fait un reset du PIC

Exemples 1 er exemple : Faire clignoter une LED (500 ms allumée, 1 s

Exemples 1 er exemple : Faire clignoter une LED (500 ms allumée, 1 s éteinte) #include <16 F 876 a. h> #fuses HS, NOPROTECT, NOWDT #use delay(clock=16000000) #define LED PIN_RB 7 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, 1 s éteinte),

Exemples 2ème exemple : Faire clignoter une LED (500 ms allumée, 1 s éteinte), s’arrêtant lors de l’appui sur un bouton poussoir. #include <16 F 876 a. h> #fuses HS, NOPROTECT, NOWDT #use delay(clock=16000000) #define LED PIN_RB 7 #define bouton PIN_RC 4 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 1 k.

Exemples 3ème exemple : Faire une PWM (pulse width modulation) de fréquence 1 k. Hz et de rapport cyclique variable sur la patte RA 0 #include <16 F 876 a. h> #fuses HS, NOPROTECT, NOWDT #use delay(clock=16000000) Void PWM( int i){ Int j; While (1){ Output_bit(PIN_RA 0, 1); For(j=0; j<i; j++){ Delay_us(10); } Output_bit(PIN_RA 0, 0); For(j=0; j<100 -i; j++){ Delay_us(10); } } } Void main(){ PWM(33); //Applique une PWM de fréquence 1 k. Hz et de rapport cyclique 33% sur la patte RA 0 }

Quelques applications du PIC

Quelques applications du PIC

2ème séance

2ème séance

Les interruptions Il est possible d’interrompre le déroulement du programme lorsqu’un changement d’état intervient

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 <16 F 876 a. h> #fuses HS, NOPROTECT, NOWDT #use delay(clock=16000000) #INT_RB //changement d’état sur les pattes B 4 -B 7 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é http: //www. robot-mobile-irbot. com/4 -modif-servomoteur-du-robotmobile. htm

3 types de motorisation différents Le Servomoteur modifié http: //www. robot-mobile-irbot. com/4 -modif-servomoteur-du-robotmobile. htm Le moteur pas à pas Le moteur à courant continu

Servomoteur Présentation du Servomoteur Le servomoteur est constitué d’un moteur à courant continu relié

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 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

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°

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, 5 V

Servomoteur modifié Vcc = 7, 5 V

Servomoteur modifié La fonction avance() permet de faire tourner le servo dans un sens

Servomoteur modifié La fonction avance() permet de faire tourner le servo dans un sens à sa vitesse maxi #include <16 F 876 a. h> #fuses HS, NOPROTECT, NOWDT #use delay(clock=16000000) #define SERVO PIN_RC 4 Void avance(){ While(1){ Output_bit(SERVO, 1); //On met à 1 pendant 2 ms Delay_ms(2); Output_bit(SERVO, 0); Delay_ms(18); //On met à 0 pendant 20 – 2 = 18 ms } } Void main(){ Avance(); }

Servomoteur Avantages : -Boîtier pratique -1 seul fil de commande par Servo -Directement pilotable

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 La consommation d’un tel moteur est d’environ 100 m. A, il est

Moteur CC La consommation d’un tel moteur est d’environ 100 m. A, il est donc impossible de le connecter directement sur une patte du PIC Transistor MOS : BUZ 11

Pont en H Attention, toujours alimenter un pont en H en diagonale, sinon +

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

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

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

Moteur pas à pas

Moteur pas à pas

Moteur pas à pas

Moteur pas à pas La fonction avance() permet de faire tourner le moteur pas

Moteur pas à pas La fonction avance() permet de faire tourner le moteur pas à pas de n*4 pas #include <16 F 876 a. h> #fuses HS, NOPROTECT, NOWDT #use delay(clock=16000000) 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 }

Moteur Pas à pas Avantages : -Rapide -Très précis -Peu coûteux Inconvénients : -Compliqué

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 CNY 70

Le CNY 70

Le CNY 70

Le CNY 70