This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| fr:supervisors:solutions:wiper:tp6 [2010/03/03 15:07] – créée sdeniaud | fr:supervisors:solutions:wiper:tp6 [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== TP6 - Exercice ====== | ====== TP6 - Exercice ====== | ||
| + | |||
| + | ===== Organigramme ===== | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ===== Programme ===== | ||
| + | |||
| + | <code c> | ||
| + | / | ||
| + | * TPs sur EID210 / Réseau CAN - VMD (Véhicule Multiplexé Didactique) | ||
| + | **************************************************************************************** | ||
| + | * | ||
| + | **************************************************************************************** | ||
| + | * TP Exercice n°3: Commande du système essuie glace avant | ||
| + | *--------------------------------------------------------------------------------------- | ||
| + | * | ||
| + | * ********************* | ||
| + | * On souhaite une commande normale de l' | ||
| + | * à cet effet: | ||
| + | * - position ' | ||
| + | * - position P1 (GP4) ' | ||
| + | * une attente dont la durée est réglée par l' | ||
| + | * - position P2 (GP5) -> le balai fait des " | ||
| + | * - position P3 (GP6) -> le balai fait des " | ||
| + | * - position P4 (GP7) -> le balai fait des " | ||
| + | | ||
| + | * par le ' | ||
| + | * On affichera à l' | ||
| + | *--------------------------------------------------------------------------------------- | ||
| + | * NOM du FICHIER : TP_Exercice 3.C | ||
| + | * ***************** | ||
| + | *****************************************************************************************/ | ||
| + | // Déclaration des fichiers d' | ||
| + | #include < | ||
| + | # | ||
| + | # | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | |||
| + | // Déclaration des variables | ||
| + | // Pour les Indicateurs divers (variables binaires) | ||
| + | union byte_bits Indicateurs, | ||
| + | #define I_Autorise_Cycle Indicateurs.bit.b0 // Pour autoriser 1 battement | ||
| + | #define I_Intermittent Indicateurs.bit.b1 | ||
| + | #define I_Message_Pb_Affiche Indicateurs.bit.b2 | ||
| + | #define Etat_Arret Indicateurs.bit.b3 // | ||
| + | #define Etat_Rot_Droite Indicateurs.bit.b4 // | ||
| + | #define Etat_Rot_Gauche Indicateurs.bit.b5 // | ||
| + | // Pour les fins de course | ||
| + | #define Etat_FC FC.valeur // Pour l' | ||
| + | #define fs FC.bit.b7 // | ||
| + | #define fcg FC.bit.b6 // | ||
| + | #define fcd FC.bit.b5 // | ||
| + | // Pour la position Commodo_EG | ||
| + | #define Commodo_EG_Pos1 Commodo_EG.bit.GP4 | ||
| + | #define Commodo_EG_Pos2 Commodo_EG.bit.GP5 | ||
| + | #define Commodo_EG_Pos3 Commodo_EG.bit.GP6 | ||
| + | #define Commodo_EG_Pos4 Commodo_EG.bit.GP7 | ||
| + | // Déclarations des diverses trames de communication | ||
| + | Trame Trame_Recue; | ||
| + | // Trames de type " | ||
| + | Trame T_IM_Asservissement; | ||
| + | Trame T_IM_Commodo_EG; | ||
| + | // Trames de type " | ||
| + | Trame T_IRM_Acquisition_FC; | ||
| + | Trame T_IRM_Etat_Commodo_EG; | ||
| + | // Varibles diverses | ||
| + | unsigned char Valeur_Analogique, | ||
| + | unsigned char Valeur_Commodo_EG_Mem, | ||
| + | // Pour les temporisation | ||
| + | // Déclaration constantes | ||
| + | #define Vitesse_Lente 30 | ||
| + | #define Vitesse_Moyenne 50 | ||
| + | #define Vitesse_Rapide 70 | ||
| + | |||
| + | #define Tempo1 3 // en secondes | ||
| + | #define Tempo2 6 | ||
| + | #define Tempo3 9 | ||
| + | #define Tempo4 12 | ||
| + | #define Tempo5 15 | ||
| + | // Fonction d' | ||
| + | // | ||
| + | void irq_bt() | ||
| + | // Fonction exécutée toute les 10 mS | ||
| + | {if(I_Intermittent) // Si mode intermittent actif | ||
| + | {Compteur_Passage_Irq++; | ||
| + | if(Compteur_Passage_Irq==100) | ||
| + | {Compteur_Passage_Irq=0; | ||
| + | Compteur_Secondes++; | ||
| + | if(Compteur_Secondes> | ||
| + | {Compteur_Secondes=0; | ||
| + | I_Autorise_Cycle=1; | ||
| + | }} | ||
| + | } // Fin de la fonction d' | ||
| + | |||
| + | // | ||
| + | // FONCTION PRINCIPALE | ||
| + | // | ||
| + | main() | ||
| + | { | ||
| + | // Déclaration de variables locales à la fonction principale | ||
| + | int Cptr_Affichage=0, | ||
| + | // INITIALISATIONS | ||
| + | // | ||
| + | // Pour initialiser la carte industrielle controleur CAN | ||
| + | Init_Aton_CAN(); | ||
| + | clsscr(); // Pour effacer l' | ||
| + | // 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; | ||
| + | // doc MCP25050 Page 16 | ||
| + | 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; | ||
| + | I_Message_Pb_Affiche=0; | ||
| + | do {Ecrire_Trame(T_IM_Asservissement); | ||
| + | Cptr_TimeOut=0; | ||
| + | do{Cptr_TimeOut++; | ||
| + | if(Cptr_TimeOut==100) | ||
| + | {if(I_Message_Pb_Affiche==0) | ||
| + | {I_Message_Pb_Affiche=1; | ||
| + | gotoxy(2, | ||
| + | printf(" | ||
| + | printf(" | ||
| + | }while(Cptr_TimeOut==100); | ||
| + | clsscr(); // Pour effacer l' | ||
| + | // 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 définir sortie GP3 en PWM2 | ||
| + | T_IM_Asservissement.data[0]=0x22; | ||
| + | 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 PWM2 | ||
| + | T_IM_Asservissement.data[0]=0x24; | ||
| + | T_IM_Asservissement.data[1]=0xFF; | ||
| + | T_IM_Asservissement.data[2]=0xFF; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | // Pour initialiser le rapport cyclique du signal PWM1 | ||
| + | T_IM_Asservissement.data[0]=0x25; | ||
| + | T_IM_Asservissement.data[1]=0xFF; | ||
| + | T_IM_Asservissement.data[2]=0; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | // Pour initialiser le rapport cyclique du signal PWM2 à 0 | ||
| + | T_IM_Asservissement.data[0]=0x26; | ||
| + | T_IM_Asservissement.data[1]=0xFF; | ||
| + | T_IM_Asservissement.data[2]=0; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | // Pour Valider le circuit de puissance | ||
| + | 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(& | ||
| + | // Masque pour les commandes IM futures | ||
| + | T_IM_Asservissement.data[1]=0xFF; | ||
| + | // Pour acquérir l' | ||
| + | // Trame de type " | ||
| + | T_IRM_Acquisition_FC.trame_info.registre=0x00; | ||
| + | T_IRM_Acquisition_FC.trame_info.champ.extend=1; | ||
| + | T_IRM_Acquisition_FC.trame_info.champ.dlc=1; | ||
| + | T_IRM_Acquisition_FC.trame_info.champ.rtr=1; | ||
| + | T_IRM_Acquisition_FC.ident.extend.identificateur.ident=Ident_T_IRM1_Asservissement; | ||
| + | // Demande état registre GPIN | ||
| + | |||
| + | // Pour initialiser le module " | ||
| + | // Trame de type " | ||
| + | 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.trame_info.champ.rtr=0; | ||
| + | T_IM_Commodo_EG.ident.extend.identificateur.ident=Ident_T_IM_Commodo_EG; | ||
| + | // 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]=0x0E; | ||
| + | Ecrire_Trame(T_IM_Commodo_EG); | ||
| + | do{}while(Lire_Trame(& | ||
| + | // Pour acquérir les résultats de conversion A->N et états commmodo EG | ||
| + | // Trame de type " | ||
| + | T_IRM_Etat_Commodo_EG.trame_info.registre=0x00; | ||
| + | T_IRM_Etat_Commodo_EG.trame_info.champ.extend=1; | ||
| + | T_IRM_Etat_Commodo_EG.trame_info.champ.dlc=0x08; | ||
| + | T_IRM_Etat_Commodo_EG.trame_info.champ.rtr=1; | ||
| + | T_IRM_Etat_Commodo_EG.ident.extend.identificateur.ident=Ident_T_IRM8_Commodo_EG; | ||
| + | |||
| + | // Pour initialiser système (Enmener le balai en position sur fin de course droit) | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | {T_IM_Asservissement.data[2]=Vitesse_Lente; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | while(fcd==0) | ||
| + | {Ecrire_Trame(T_IRM_Acquisition_FC); | ||
| + | do{}while(Lire_Trame(& | ||
| + | Etat_FC=~Trame_Recue.data[0]; | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | // Initialisation des variables d' | ||
| + | Etat_Arret=1, | ||
| + | I_Autorise_Cycle=0, | ||
| + | Compteur_Secondes=0, | ||
| + | // Pour afficher titre du TP | ||
| + | gotoxy(1, | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | // Pour initialiser la base de temps et temporisations | ||
| + | SetVect(96,& | ||
| + | PITR = 0x0048; // Une interruption toutes les 10 millisecondes | ||
| + | PICR = 0x0760; // 96 = 60H | ||
| + | |||
| + | // BOUCLE PRINCIPALE | ||
| + | // | ||
| + | while(1) | ||
| + | { // Acquérir l' | ||
| + | // | ||
| + | Ecrire_Trame(T_IRM_Acquisition_FC); | ||
| + | Cptr_TimeOut=0; | ||
| + | do{Cptr_TimeOut++; | ||
| + | if(Cptr_TimeOut==10000) | ||
| + | {clsscr(), | ||
| + | printf(" | ||
| + | printf(" | ||
| + | do{}while(1); | ||
| + | else { if(Trame_Recue.ident.extend.identificateur.ident==Ident_T_IRM1_Asservissement) | ||
| + | // On teste si l' | ||
| + | {Etat_FC=~Trame_Recue.data[0]; | ||
| + | // Acquérir l' | ||
| + | // | ||
| + | Ecrire_Trame(T_IRM_Etat_Commodo_EG); | ||
| + | Cptr_TimeOut=0; | ||
| + | do{Cptr_TimeOut++; | ||
| + | if(Cptr_TimeOut==10000) | ||
| + | {clsscr(), | ||
| + | printf(" | ||
| + | printf(" | ||
| + | do{}while(1); | ||
| + | else { if(Trame_Recue.ident.extend.identificateur.ident==Ident_T_IRM8_Commodo_EG) | ||
| + | // On teste si l' | ||
| + | {Valeur_Commodo_EG=~(Trame_Recue.data[1]& | ||
| + | Valeur_Analogique=Trame_Recue.data[2]; | ||
| + | // Traiter l' | ||
| + | // | ||
| + | if(Valeur_Commodo_EG!=Valeur_Commodo_EG_Mem) // Si changement sur entrées binaires | ||
| + | {if(Commodo_EG_Pos4){I_Autorise_Cycle=1, | ||
| + | // (on autorise les cycles du balai, avec une vitesse rapide, si on est en position 4 sur le commodo) | ||
| + | else {if(Commodo_EG_Pos3){I_Autorise_Cycle=1, | ||
| + | // (on autorise les cycles du balai, avec une vitesse rapide, si on est en position 3 sur le commodo) | ||
| + | else {if(Commodo_EG_Pos2){I_Autorise_Cycle=1, | ||
| + | // on autorise les cycles du balai, avec une vitesse lente, si on est en position 2 sur le commodo) | ||
| + | else {if(Commodo_EG_Pos1) | ||
| + | {I_Intermittent=1, | ||
| + | Compteur_Passage_Irq=0; | ||
| + | Compteur_Secondes=0; | ||
| + | } | ||
| + | else {I_Intermittent=0; | ||
| + | }}}} | ||
| + | printf(" | ||
| + | }// Fin si changement etat entrées binaires | ||
| + | if(Valeur_Analogique!=Valeur_Analogique_Mem) | ||
| + | {printf(" | ||
| + | if(Valeur_Analogique> | ||
| + | else {if(Valeur_Analogique> | ||
| + | else {if(Valeur_Analogique> | ||
| + | else {if(Valeur_Analogique> | ||
| + | else {if(Valeur_Analogique> | ||
| + | } | ||
| + | // Mise à jour des grandeurs mémorisées | ||
| + | Valeur_Analogique_Mem=Valeur_Analogique; | ||
| + | Valeur_Commodo_EG_Mem=Valeur_Commodo_EG; | ||
| + | |||
| + | // Traitement du diagramme des états " | ||
| + | // | ||
| + | if(Etat_Arret) // Si le système est dans l' | ||
| + | {if(I_Autorise_Cycle) // Si on un cycle a été autorisé | ||
| + | {I_Autorise_Cycle=0; | ||
| + | Etat_Arret=0, | ||
| + | T_IM_Asservissement.data[2]=Cde_Vitesse; | ||
| + | T_IM_Asservissement.data[0]=0x26; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | while(Lire_Trame(& | ||
| + | // | ||
| + | }} | ||
| + | if(Etat_Rot_Gauche) // Si le système est dans l' | ||
| + | {if(fcg) // Si on est arrivé en fin de course gauche | ||
| + | {Etat_Rot_Gauche=0, | ||
| + | T_IM_Asservissement.data[2]=0; | ||
| + | T_IM_Asservissement.data[0]=0x26; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | while(Lire_Trame(& | ||
| + | T_IM_Asservissement.data[2]=Cde_Vitesse; | ||
| + | T_IM_Asservissement.data[0]=0x25; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | while(Lire_Trame(& | ||
| + | }} | ||
| + | if(Etat_Rot_Droite) // Si le système est dans l' | ||
| + | {if(fcd) // Si on est arrivé en fin de course droit | ||
| + | | ||
| + | {Etat_Rot_Droite=0, | ||
| + | T_IM_Asservissement.data[2]=0; | ||
| + | T_IM_Asservissement.data[0]=0x25; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | while(Lire_Trame(& | ||
| + | T_IM_Asservissement.data[2]=Cde_Vitesse; | ||
| + | T_IM_Asservissement.data[0]=0x26; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | while(Lire_Trame(& | ||
| + | } | ||
| + | else | ||
| + | {Etat_Rot_Droite=0, | ||
| + | T_IM_Asservissement.data[2]=0; | ||
| + | T_IM_Asservissement.data[0]=0x25; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | while(Lire_Trame(& | ||
| + | if(I_Intermittent)Compteur_Passage_Irq=0, | ||
| + | }}} | ||
| + | // Afficher l' | ||
| + | // | ||
| + | /* | ||
| + | Cptr_Affichage++; | ||
| + | if(Cptr_Affichage==200) | ||
| + | {Cptr_Affichage=0; | ||
| + | gotoxy(1, | ||
| + | if(I_Intermittent)printf(" | ||
| + | else {if(Commodo_EG_Pos2)printf(" | ||
| + | else {if(Commodo_EG_Pos3)printf(" | ||
| + | else {printf(" | ||
| + | printf(" | ||
| + | gotoxy(1, | ||
| + | printf(" | ||
| + | printf(" | ||
| + | } // Fin " | ||
| + | */ | ||
| + | } // Fin boucle principale | ||
| + | } // Fin fonction principale | ||
| + | |||
| + | </ | ||
| + | |||