This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| fr:exercises:can:wiper:tp4 [2010/03/03 14:59] – créée sdeniaud | fr:exercises:can:wiper:tp4 [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ddd | + | ====== Exercice 1 ====== |
| + | ===== Sujet: ===== | ||
| + | |||
| + | **Sélection de commande du moteur E.G.** | ||
| + | ==== Objectifs : ==== | ||
| + | * Définir les différentes trames interrogatives ou de commande à faire transiter par le réseau CAN en fonction d'une action souhaitée. | ||
| + | * Adapter le commande d'un actionneur électrique (moteur à courant continu) par réseau CAN, en fonction de l' | ||
| + | |||
| + | ==== Cahier des charges : ==== | ||
| + | L' | ||
| + | * Si Pos1 (GP4) actionné, le moteur tourne à petite vitesse fixe. | ||
| + | * Si Pos2 (GP5) actionné, le moteur tourne à grande vitesse fixe. | ||
| + | * Si Pos3 (GP6) actionné, le moteur tourne à vitesse ajustable imposée par l' | ||
| + | * Si Pos4 (GP7) actionné, le moteur a un fonctionnement marche/ | ||
| + | {{ : | ||
| + | |||
| + | * Si ni Pos1 (GP4), ni Pos2 (GP5), ni Pos3 (GP5) est actionné, le moteur reste à l' | ||
| + | |||
| + | ===== Informations utiles ===== | ||
| + | ==== Acquisition des entrées " | ||
| + | |||
| + | La technique d' | ||
| + | |||
| + | ==== Commande du moteur Essuie Glace ==== | ||
| + | |||
| + | La technique de commande du moteur Essuie Glace est décrite dans le TP exemple n°2. | ||
| + | |||
| + | ==== Déclaration et utilisation de variables binaires ==== | ||
| + | |||
| + | Si on souhaite déclarer des variables binaires, il est possible d' | ||
| + | |||
| + | <code c> | ||
| + | /* Union pour accéder à un octet (BYTE) soit en direct, soit en individualisant les 8 bits | ||
| + | // | ||
| + | union byte_bits | ||
| + | { struct | ||
| + | { unsigned char b7:1; | ||
| + | unsigned char b6:1; | ||
| + | unsigned char b5:1; | ||
| + | unsigned char b4:1; | ||
| + | unsigned char b3:1; | ||
| + | unsigned char b2:1; | ||
| + | unsigned char b1:1; | ||
| + | unsigned char b0:1; | ||
| + | }bit; | ||
| + | BYTE valeur; | ||
| + | }; | ||
| + | </ | ||
| + | |||
| + | **Utilisation: | ||
| + | |||
| + | * Dans la partie déclarative du programme | ||
| + | |||
| + | <code c> | ||
| + | /* Déclaration des variables*/ | ||
| + | // Pour les variables binaires | ||
| + | union byte_bits Indicateurs; | ||
| + | #define User_Bit1 Indicateurs.bit.b0 | ||
| + | #define User_Bit2 Indicateurs.bit.b1 | ||
| + | </ | ||
| + | |||
| + | * Utilisation des variables binaires dans les fonctions | ||
| + | |||
| + | <code c> | ||
| + | // Pour initialiser tous les 8 bits de l' | ||
| + | Indicateurs.valeur=0x00; | ||
| + | // Pour affecter une valeur à une variable binaire | ||
| + | User_Bit1=1; | ||
| + | User_Bit0=0; | ||
| + | // Pour tester la valeur d'une variable binaire | ||
| + | if(User_Bit1==1) | ||
| + | { // Actions à faire si valeur = 1 | ||
| + | … | ||
| + | } | ||
| + | else { // Actions à faire si valeur = 0 | ||
| + | … | ||
| + | } | ||
| + | if(User_Bit2==0) | ||
| + | { // Actions à faire si valeur = 0 | ||
| + | … | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Réalisation d'une base de temps ==== | ||
| + | |||
| + | Le micro contrôleur implanté sur la carte processeur EID210 intégre un bloc fonctionnel (noté '' | ||
| + | L'une des nombreuses fonctions du TPU est la génération d'une interruption périodique. | ||
| + | Exemple d' | ||
| + | Soit la génération d'une temporisation égale à 1 S, comme le montre les signaux ci-desous. | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | **Solution: | ||
| + | Si on envisage une base de temps élémentaire égale à 1mS, la solution comportera les parties de programmes suivantes: | ||
| + | |||
| + | * Dans la partie déclarative du programme | ||
| + | |||
| + | <code c> | ||
| + | /* Déclaration des variables*/ | ||
| + | // Pour les variables binaires | ||
| + | union byte_bits Indicateurs; | ||
| + | #define Demande_Tempo Indicateurs.bit.b0 | ||
| + | #define Reponse_Tempo Indicateurs.bit.b1 | ||
| + | #define Tempo_En_Cours Indicateurs.bit.b2 | ||
| + | // Pour le compteur de passage dans la fonction d' | ||
| + | int CPTR_mS; /* déclaration des variables et compteurs de millisecondes */ | ||
| + | </ | ||
| + | |||
| + | * Définition de la fonction d' | ||
| + | |||
| + | <code c> | ||
| + | /* FONCTION d' | ||
| + | =============================================================================*/ | ||
| + | void irq_bt() | ||
| + | { | ||
| + | if (Tempo_En_Cours==1) | ||
| + | { CPTR_mS++; | ||
| + | | ||
| + | } | ||
| + | } // Fin de la définition de la fonction d' | ||
| + | </ | ||
| + | |||
| + | * Définition partielle de la fonction principale | ||
| + | |||
| + | <code c> | ||
| + | / | ||
| + | /* Fonction principale | ||
| + | / | ||
| + | main() | ||
| + | { | ||
| + | /* | ||
| + | *********************/ | ||
| + | // Pour base de temps | ||
| + | SetVect(96,& | ||
| + | PITR = 0x0048; | ||
| + | PICR = 0x0760; // 96 = 60H | ||
| + | // Pour la temporisation | ||
| + | CPTR_mS=0; | ||
| + | Demande_Tempo=0; | ||
| + | Reponse_Tempo=0; | ||
| + | Tempo_En_Cours=0; | ||
| + | /* Boucle principale * | ||
| + | **********************/ | ||
| + | do | ||
| + | { // A l' | ||
| + | Demande_Tempo=1; | ||
| + | Tempo_En_Cours=1; | ||
| + | // … Pour tester si fin tempo | ||
| + | | ||
| + | { Reponse_Tempo=0; | ||
| + | // Actions à faire à la fin de la temporisation | ||
| + | … | ||
| + | } | ||
| + | // Pour réinitialisation | ||
| + | Demande_Tempo=0; | ||
| + | … | ||
| + | if(Demande_Tempo==0)Reponse_Tempo=0, | ||
| + | |||
| + | }while(1); | ||
| + | } /* Fin de la fonction principale */ | ||
| + | </ | ||