This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| fr:examples:can:wiper:tp2 [2010/03/03 15:11] – créée sdeniaud | fr:examples:can:wiper:tp2 [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== TP2 - Exemple ====== | + | ====== TP2 - Exemple |
| + | ===== Sujet: ===== | ||
| + | **Marche/ | ||
| + | ==== Objectifs : ==== | ||
| + | |||
| + | * Définir les différentes trames de commande à faire transiter par le réseau CAN en fonction d'une action souhaitée. | ||
| + | |||
| + | * Commander un actionneur électrique (moteur à courant continu) en variation de vitesse, par l' | ||
| + | |||
| + | ==== Cahier des charges : ==== | ||
| + | Le bouton poussoir BP1, connecté sur l' | ||
| + | * BP1 appuyé | ||
| + | * BP1 n'est pas appuyé (GP4 = 1) → le moteur est à l' | ||
| + | La vitesse du moteur est définie par l' | ||
| + | |||
| + | ===== Elements de solution ===== | ||
| + | ==== Analyse ==== | ||
| + | |||
| + | **Principe: | ||
| + | Le module " | ||
| + | Un circuit de puissance (réf: L6202" | ||
| + | D' | ||
| + | * GP2 ou '' | ||
| + | * GP3 ou '' | ||
| + | * GP4 ou '' | ||
| + | Dans notre application, | ||
| + | |||
| + | **Définitions des trames pour commander le moteur:** | ||
| + | Une sucession de trames de commande (type IM) devra être envoyée, dans un ordre bien précis au module asservissement, | ||
| + | Définition des éléments d' | ||
| + | Dans ce cas, la trame envoyée par le contrôleur CAN (Circuit SJA1000 sur carte CAN_PC104) sera vue par le récepteur (circuit MCP25050 sur module) comme une IM "Input message", | ||
| + | L’identificateur défini dans le chapitre 1, pour un " | ||
| + | |||
| + | * Définition de variables structurées sous le modèle | ||
| + | * Définition des éléments d' | ||
| + | <code c> | ||
| + | T_IM_Asservissement.trame_info.registre=0x00; | ||
| + | T_IM_Asservissement.trame_info.champ.extend=1; | ||
| + | T_IM_Asservissement.trame_info.champ.dlc=0x03; | ||
| + | T_IM_Asservissement.ident.extend.identificateur.ident=Ident_T_IM_Asservissement; | ||
| + | </ | ||
| + | |||
| + | A chacune des trames de commande " | ||
| + | |||
| + | **Trame n°1** | ||
| + | Il faut initialiser le registre GPDDR ("Data Direction Register" | ||
| + | <code c> | ||
| + | GP7=fs -> entrée; GP6=fcg -> entrée; GP5=fcd -> entrée; GP4=ValidIP -> sortie; | ||
| + | GP3=PWM1 -> sortie; GP2=PWM2 -> sortie; GP1=AN1 -> entrée; GP0=AN0 -> entrée; | ||
| + | T_IM_Asservissement.data[0]=0x1F; | ||
| + | T_IM_Asservissement.data[1]=0x7F; | ||
| + | T_IM_Asservissement.data[2]=0xE3; | ||
| + | </ | ||
| + | Suite à ces définitions, | ||
| + | * envoyer la trame par la fonction Ecire_Trame(T_IM_Asservissement) | ||
| + | * puis attendre la réponse de type " | ||
| + | |||
| + | **Trame n°2** | ||
| + | D' | ||
| + | <code c> | ||
| + | bit 7 =1 TMR1ON Validation du "Timer 1" | ||
| + | bits 5:4 seront mis à 0 pour avoir un coefficient de division de fréquence égal à 1 ("TMR1 prescaler value" = 1) | ||
| + | T_IM_Asservissement.data[0]=0x21; | ||
| + | T_IM_Asservissement.data[1]=0xB3; | ||
| + | T_IM_Asservissement.data[2]=0x80; | ||
| + | </ | ||
| + | |||
| + | Suite à ces définitions, | ||
| + | * envoyer la trame par la fonction '' | ||
| + | * puis attendre la réponse de type " | ||
| + | |||
| + | **Trame n°3** | ||
| + | Cette fréquence dépend de la valeur chargée dans le registre " | ||
| + | <code c> | ||
| + | T_IM_Asservissement.data[0]=0x23; | ||
| + | T_IM_Asservissement.data[1]=0xFF; | ||
| + | T_IM_Asservissement.data[2]=0xFF; | ||
| + | </ | ||
| + | La fréquence du quartz implanté sur la carte " | ||
| + | Ce qui est une fréquence correcte pour piloter un moteur en PWM (fréquence sensiblement inaudible). | ||
| + | |||
| + | Suite à ces définitions, | ||
| + | * envoyer la trame par la fonction '' | ||
| + | * puis attendre la réponse de type " | ||
| + | |||
| + | **Trame n°4** | ||
| + | <code c> | ||
| + | T_IM_Asservissement.data[0]=0x25; | ||
| + | T_IM_Asservissement.data[1]=0xFF; | ||
| + | T_IM_Asservissement.data[2]=0x7F; | ||
| + | </ | ||
| + | Suite à ces définitions, | ||
| + | * envoyer la trame par la fonction '' | ||
| + | * puis attendre la réponse de type " | ||
| + | |||
| + | |||
| + | Pour démarrer (ou arrêter) le moteur, on agira alors sur le signal '' | ||
| + | * pour valider le circuit de puissance (démarrer le moteur) | ||
| + | <code c> | ||
| + | T_IM_Asservissement.data[0]=0x1E; | ||
| + | T_IM_Asservissement.data[1]=0x10; | ||
| + | T_IM_Asservissement.data[2]=0x10; | ||
| + | </ | ||
| + | * pour inhiber | ||
| + | <code c> | ||
| + | T_IM_Asservissement.data[0]=0x1E; | ||
| + | T_IM_Asservissement.data[1]=0x10; | ||
| + | T_IM_Asservissement.data[2]=0x00; | ||
| + | </ | ||
| + | **Définitions des trames pour configurer et interroger le module commodo E.G. | ||
| + | (Voir TP Exemple n°1)** | ||
| + | |||
| + | ==== Organigramme ==== | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | ==== Programme en " | ||
| + | |||
| + | <code c> | ||
| + | / | ||
| + | * TPs sur EID210 / Réseau CAN - VMD (Véhicule Multiplexé Didactique) | ||
| + | ************************************************************************************************* | ||
| + | * | ||
| + | ************************************************************************************************* | ||
| + | * TP Exemple n°2: Marche Arrêt du moteur + vitesse réglable par commodo Essuie-Glace | ||
| + | *------------------------------------------------------------------------------------------------ | ||
| + | * | ||
| + | * ********************* | ||
| + | * On souhaite que l'etat du moteur (marche ou arret) suive l'etat de BP1 (GP4) | ||
| + | * La vitesse du moteur sera fonction de l' | ||
| + | *---------------------------------------------------------------------------------------------- | ||
| + | * NOM du FICHIER : TP_Exemple 2.C | ||
| + | * ***************** | ||
| + | *************************************************************************************************/ | ||
| + | // Fichiers à inclure | ||
| + | // | ||
| + | #include < | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | // | ||
| + | // FONCTION PRINCIPALE | ||
| + | // | ||
| + | main() | ||
| + | {// Définition de variables locales | ||
| + | int Compteur_Passage; | ||
| + | char Commodo_EG_Mem; | ||
| + | unsigned int Cptr_TimeOut; | ||
| + | unsigned char AN0H; // Pour mémoriser les 8 biits de poids forts du résultat de conversion A->N | ||
| + | unsigned char Val_Vitesse, | ||
| + | Trame Trame_Recue; | ||
| + | Trame T_IRM_Commodo_EG; | ||
| + | // IRM -> Information Request Message -> Trame interrogative | ||
| + | Trame T_IM_Commodo_EG; | ||
| + | // IM -> Information Message -> Trame de commande | ||
| + | Trame T_IM_Asservissement; | ||
| + | // IM -> Information Message -> Trame de commande | ||
| + | // Initialisations | ||
| + | // | ||
| + | |||
| + | /* Initialisation DU SJA1000 de la carte PC104 */ | ||
| + | Init_Aton_CAN(); | ||
| + | // Pour initialiser les liaisons en entrées | ||
| + | T_IM_Commodo_EG.trame_info.registre=0x00; | ||
| + | T_IM_Commodo_EG.trame_info.champ.extend=1; | ||
| + | T_IM_Commodo_EG.trame_info.champ.dlc=0x03; | ||
| + | T_IM_Commodo_EG.ident.extend.identificateur.ident=Ident_T_IM_Commodo_EG; | ||
| + | T_IM_Commodo_EG.data[0]=0x1F; | ||
| + | // | ||
| + | T_IM_Commodo_EG.data[1]=0x7F; | ||
| + | //-> Tous les bits concernés sauf GP0 (voir doc page 16) | ||
| + | T_IM_Commodo_EG.data[2]=0x7F; | ||
| + | // Envoi trame pour définir de la direction des entrées sorties | ||
| + | Ecrire_Trame(T_IM_Commodo_EG); | ||
| + | Cptr_TimeOut=0; | ||
| + | do{Cptr_TimeOut++; | ||
| + | if(Cptr_TimeOut==2000) | ||
| + | { clsscr(); | ||
| + | gotoxy(2, | ||
| + | printf(" | ||
| + | printf(" | ||
| + | do{}while(Lire_Trame(& | ||
| + | for(Cptr_TimeOut=0; | ||
| + | Ecrire_Trame(T_IM_Commodo_EG); | ||
| + | Cptr_TimeOut=0; | ||
| + | do{Cptr_TimeOut++; | ||
| + | if(Cptr_TimeOut==2000) | ||
| + | { gotoxy(2, | ||
| + | printf(" | ||
| + | printf(" | ||
| + | do{}while(1); | ||
| + | } | ||
| + | } | ||
| + | // Pour activer les conversions Ana -> Num | ||
| + | T_IM_Commodo_EG.data[0]=0x2A; | ||
| + | T_IM_Commodo_EG.data[1]=0xF0; | ||
| + | T_IM_Commodo_EG.data[2]=0x80; | ||
| + | Ecrire_Trame(T_IM_Commodo_EG); | ||
| + | do{}while(Lire_Trame(& | ||
| + | // Pour définir le mode de conversion | ||
| + | T_IM_Commodo_EG.data[0]=0x2B; | ||
| + | T_IM_Commodo_EG.data[1]=0xFF; | ||
| + | T_IM_Commodo_EG.data[2]=0x0C; | ||
| + | Ecrire_Trame(T_IM_Commodo_EG); | ||
| + | do{}while(Lire_Trame(& | ||
| + | // Pour initialiser le module " | ||
| + | // Trame de type " | ||
| + | T_IM_Asservissement.trame_info.registre=0x00; | ||
| + | T_IM_Asservissement.trame_info.champ.extend=1; | ||
| + | T_IM_Asservissement.trame_info.champ.dlc=0x03; | ||
| + | T_IM_Asservissement.trame_info.champ.rtr=0; | ||
| + | T_IM_Asservissement.ident.extend.identificateur.ident=Ident_T_IM_Asservissement; | ||
| + | // Pour définir des Entrées/ | ||
| + | T_IM_Asservissement.data[0]=0x1F; | ||
| + | T_IM_Asservissement.data[1]=0xEF; | ||
| + | T_IM_Asservissement.data[2]=0xE3; | ||
| + | // GP7=fs Entrée; GP6=fcg Entree; GP5=fcd Entrée; | ||
| + | // GP3=PWM2 Sortie; GP2=PWM1 Sortie; GP1=AN1 Entrée; GP0=AN0 Entrée; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | // Pour mettre à 0 les sorties | ||
| + | T_IM_Asservissement.data[0]=0x1E; | ||
| + | T_IM_Asservissement.data[1]=0x1C; | ||
| + | T_IM_Asservissement.data[2]=0x00; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | // Pour définir sortie GP2 en PWM1 | ||
| + | T_IM_Asservissement.data[0]=0x21; | ||
| + | T_IM_Asservissement.data[1]=0xB3; | ||
| + | T_IM_Asservissement.data[2]=0x80; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | // Pour définir fréquence signal sortie PWM1 | ||
| + | T_IM_Asservissement.data[0]=0x23; | ||
| + | T_IM_Asservissement.data[1]=0xFF; | ||
| + | T_IM_Asservissement.data[2]=0xFF; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | |||
| + | // Pour trame interrogative envoyée au commodo Essuie-Glace | ||
| + | // Définir données d' | ||
| + | T_IRM_Commodo_EG.trame_info.registre=0x00; | ||
| + | T_IRM_Commodo_EG.trame_info.champ.extend=1; | ||
| + | T_IRM_Commodo_EG.trame_info.champ.dlc=0x08; | ||
| + | T_IRM_Commodo_EG.trame_info.champ.rtr=1; | ||
| + | T_IRM_Commodo_EG.ident.extend.identificateur.ident=Ident_T_IRM8_Commodo_EG; | ||
| + | // Voir définitions dans fichier CAN_VMD.h | ||
| + | Ecrire_Trame(T_IRM_Commodo_EG); | ||
| + | do{}while(Lire_Trame(& | ||
| + | Commodo_EG.valeur=Trame_Recue.data[1]& | ||
| + | Commodo_EG_Mem=Commodo_EG.valeur; | ||
| + | |||
| + | Val_Vitesse=Trame_Recue.data[2]; | ||
| + | // Pour initialiser rapport cyclique PWM1 -> c'est le module de la commande | ||
| + | T_IM_Asservissement.data[0]=0x25; | ||
| + | T_IM_Asservissement.data[1]=0xFF; | ||
| + | T_IM_Asservissement.data[2]=Val_Vitesse; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | Val_Vitesse_Mem=Val_Vitesse; | ||
| + | |||
| + | // Les initialisations se sont bien passée | ||
| + | // On peut afficher le titre du TP | ||
| + | clsscr(); | ||
| + | gotoxy(1, | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | |||
| + | // Pour afficher l' | ||
| + | | ||
| + | printf(" | ||
| + | if(Commodo_EG.bit.GP4)printf(" | ||
| + | else {printf(" | ||
| + | T_IM_Asservissement.data[0]=0x1E; | ||
| + | T_IM_Asservissement.data[1]=0x10; | ||
| + | T_IM_Asservissement.data[2]=0x10; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | } | ||
| + | gotoxy(2, | ||
| + | printf(" | ||
| + | |||
| + | // Boucle principale | ||
| + | // | ||
| + | do | ||
| + | { Ecrire_Trame(T_IRM_Commodo_EG); | ||
| + | // On attend la réponse | ||
| + | | ||
| + | if (Trame_Recue.ident.extend.identificateur.ident==Ident_T_IRM8_Commodo_EG) | ||
| + | { // On a reçu l' | ||
| + | // Pour l' | ||
| + | Commodo_EG.valeur=Trame_Recue.data[1]& | ||
| + | if(Commodo_EG.valeur!=Commodo_EG_Mem) | ||
| + | {// S'il y a eu changement, on commande le moteur | ||
| + | gotoxy(2, | ||
| + | printf(" | ||
| + | if(Commodo_EG.bit.GP4) // On test GP4 (BP1) du commodo EG | ||
| + | {// BP1 est relaché car l' | ||
| + | T_IM_Asservissement.data[0]=0x1E; | ||
| + | T_IM_Asservissement.data[1]=0x10; | ||
| + | T_IM_Asservissement.data[2]=0x00; | ||
| + | printf(" | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | } | ||
| + | else | ||
| + | {// dans la cas contraire BP1 est appuyé | ||
| + | T_IM_Asservissement.data[0]=0x1E; | ||
| + | T_IM_Asservissement.data[1]=0x10; | ||
| + | T_IM_Asservissement.data[2]=0x10; | ||
| + | printf(" | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | } | ||
| + | }// Fin si changement | ||
| + | Commodo_EG_Mem=Commodo_EG.valeur; | ||
| + | // Pour l' | ||
| + | Val_Vitesse=Trame_Recue.data[2]; | ||
| + | if(Val_Vitesse!=Val_Vitesse_Mem) | ||
| + | { gotoxy(2, | ||
| + | printf(" | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | Val_Vitesse_Mem=Val_Vitesse; | ||
| + | } // Fin si identificateur correct | ||
| + | }while(1);// | ||
| + | }// FIN fonction principale | ||
| + | </ | ||