This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| fr:supervisors:solutions:didalab:exercice2 [2010/05/27 20:06] – créée sdeniaud | fr:supervisors:solutions:didalab:exercice2 [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Exercice 2 (TP5) ====== | ====== Exercice 2 (TP5) ====== | ||
| + | |||
| + | ===== Organigramme ===== | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ===== Programme ===== | ||
| + | |||
| + | <code c> | ||
| + | |||
| + | / | ||
| + | * TPs sur EID210 / Réseau CAN - VMD (Véhicule Multiplexé Didactique) | ||
| + | ************************************************************************************************* | ||
| + | * | ||
| + | ************************************************************************************************* | ||
| + | * TP Exercice n°2: Réguler la vitesse du moteur essuie-glace avec correcteur P | ||
| + | *----------------------------------------------------------------------------------------------- | ||
| + | |||
| + | * | ||
| + | * ********************* | ||
| + | * Réguler la vitesse du moteur EG avec pour consigne, l' | ||
| + | * La commande du moteur se fait boucle fermé avec correcteur à action proportionnelle | ||
| + | * | ||
| + | *------------------------------------------------------------------------------------------------ | ||
| + | * NOM du FICHIER : TP_Exercice 2.C | ||
| + | * ***************** | ||
| + | *************************************************************************************************/ | ||
| + | |||
| + | // Déclaration des fichiers d' | ||
| + | #include < | ||
| + | # | ||
| + | # | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | |||
| + | // Déclarations des diverses trames de communication | ||
| + | Trame Trame_Recue; | ||
| + | // Trmes de type " | ||
| + | Trame T_IM_Asservissement; | ||
| + | Trame T_IM_Commodo_EG; | ||
| + | Trame T_IRM_Commodo_EG; | ||
| + | // Déclaration des variables | ||
| + | // Pour les Indicateurs divers (variables binaires) | ||
| + | union byte_bits Indicateurs; | ||
| + | #define I_Sens_Rotation Indicateurs.bit.b0 | ||
| + | #define I_Attente_Reponse_IRM Indicateurs.bit.b1 | ||
| + | #define I_Message_Pb_Affiche Indicateurs.bit.b2 | ||
| + | // Pour les résultats de conversion | ||
| + | unsigned short S_Mesure_Vitesse, | ||
| + | unsigned char AN0H, | ||
| + | // Pour régulateur de vitesse | ||
| + | int Ecart, | ||
| + | unsigned char Cde_Moteur; | ||
| + | // Déclaration constante pour régulation | ||
| + | #define Kp 6 // Coefficient d' | ||
| + | //en fait valeur réelle Kp/16 = 6/16 | ||
| + | |||
| + | // | ||
| + | // FONCTION PRINCIPALE | ||
| + | // | ||
| + | main() | ||
| + | { | ||
| + | // INITIALISATIONS | ||
| + | // | ||
| + | // Déclaration de variables locales à la fonction principale | ||
| + | // Les différents compteurs | ||
| + | unsigned int Cptr_Affichage, | ||
| + | // Initilisation carte controleur réseau CAN | ||
| + | Init_Aton_CAN(); | ||
| + | // Effacer l' | ||
| + | clsscr(); | ||
| + | // Pour initialiser les liaison en entrées du noeud " | ||
| + | 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; | ||
| + | |||
| + | // Pour envoyer trame et test si réponse | ||
| + | I_Message_Pb_Affiche=0; | ||
| + | do {Ecrire_Trame(T_IM_Commodo_EG); | ||
| + | Cptr_TimeOut=0; | ||
| + | do{Cptr_TimeOut++; | ||
| + | if(Cptr_TimeOut==500) | ||
| + | {if(I_Message_Pb_Affiche==0) | ||
| + | {I_Message_Pb_Affiche=1; | ||
| + | gotoxy(2, | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | do{}while(1); | ||
| + | }while(Cptr_TimeOut==500); | ||
| + | // La première tramme est bien passée ... on peut continuer! | ||
| + | clsscr(); | ||
| + | // Pour afficher titre | ||
| + | gotoxy(1, | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | |||
| + | |||
| + | // 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(& | ||
| + | // Trame de type " | ||
| + | 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; | ||
| + | |||
| + | // Initialisation des différentes trames et envoi aux modules " | ||
| + | // 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; | ||
| + | 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 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(& | ||
| + | // Pour initialiser le rapport cyclique | ||
| + | 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 activer les conversions Ana -> Num | ||
| + | T_IM_Asservissement.data[0]=0x2A; | ||
| + | T_IM_Asservissement.data[1]=0xF0; | ||
| + | T_IM_Asservissement.data[2]=0x80; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | // Pour définir le mode de conversion | ||
| + | T_IM_Asservissement.data[0]=0x2B; | ||
| + | T_IM_Asservissement.data[1]=0xFF; | ||
| + | T_IM_Asservissement.data[2]=0x0C; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | // Pour valider le séquenceur | ||
| + | T_IM_Asservissement.data[0]=0x2C; | ||
| + | T_IM_Asservissement.data[1]=0xFF; | ||
| + | T_IM_Asservissement.data[2]=0xD2; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | // Pour valider le séquencement sur entrées analogiques 0 et 1 | ||
| + | T_IM_Asservissement.data[0]=0x2C; | ||
| + | T_IM_Asservissement.data[1]=0x03; | ||
| + | T_IM_Asservissement.data[2]=0x03; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | Cptr_Affichage=0; | ||
| + | Ctpr_Acquisition=0; | ||
| + | Cptr_TimeOut=0; | ||
| + | // BOUCLE PRINCIPALE | ||
| + | // | ||
| + | while(1) | ||
| + | {// Un trame donnant les états est recue à intervalles de temps réguliers | ||
| + | // Fonction ' | ||
| + | if(Lire_Trame(& | ||
| + | {Cptr_TimeOut++; | ||
| + | if(Cptr_TimeOut==10000) | ||
| + | {clsscr(), | ||
| + | printf(" | ||
| + | printf(" | ||
| + | do{}while(1); | ||
| + | else {Cptr_TimeOut=0; | ||
| + | if(Trame_Recue.ident.extend.identificateur.ident==Ident_T_OB_Asservissement) | ||
| + | // On teste si l' | ||
| + | {AN1H =Trame_Recue.data[3]; | ||
| + | AN10L =Trame_Recue.data[4]; | ||
| + | // Traiter les données et reconstituer les résultats | ||
| + | S_Mesure_Vitesse=(unsigned short)(AN1H); | ||
| + | S_Mesure_Vitesse=S_Mesure_Vitesse<< | ||
| + | S_Temp=(unsigned short)(AN10L& | ||
| + | S_Mesure_Vitesse=S_Mesure_Vitesse|(S_Temp>> | ||
| + | // Calculer la grandeur de commande | ||
| + | Ecart = S_Consigne - S_Mesure_Vitesse; | ||
| + | Resultat_Calcul = (Kp*Ecart)>> | ||
| + | if(Resultat_Calcul> | ||
| + | if(Resultat_Calcul< | ||
| + | Cde_Moteur=(unsigned char)(Resultat_Calcul); | ||
| + | T_IM_Asservissement.data[0]=0x25; | ||
| + | T_IM_Asservissement.data[1]=0xFF; | ||
| + | T_IM_Asservissement.data[2]=Cde_Moteur; | ||
| + | Ecrire_Trame(T_IM_Asservissement); | ||
| + | do{}while(Lire_Trame(& | ||
| + | // Acquisition de la consigne | ||
| + | Ecrire_Trame(T_IRM_Commodo_EG); | ||
| + | do{}while(Lire_Trame(& | ||
| + | if(Trame_Recue.ident.extend.identificateur.ident==Ident_T_IRM8_Commodo_EG) | ||
| + | {AN0H =Trame_Recue.data[2]; | ||
| + | AN10L =Trame_Recue.data[4]; | ||
| + | // Traiter les données et reconstituer les résultats | ||
| + | S_Consigne=(unsigned short)(AN0H); | ||
| + | S_Consigne=S_Consigne<< | ||
| + | S_Temp=(unsigned short)(AN10L& | ||
| + | S_Consigne=S_Consigne|(S_Temp>> | ||
| + | } | ||
| + | }} // Fin acquisition et traitement | ||
| + | |||
| + | Cptr_Affichage++; | ||
| + | if(Cptr_Affichage==20000) | ||
| + | {Cptr_Affichage=0; | ||
| + | gotoxy(1, | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | // Afficher grandeurs | ||
| + | gotoxy(1, | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | printf(" | ||
| + | } // Fin boucle principale | ||
| + | } // Fin fonction principale | ||
| + | |||
| + | |||
| + | |||
| + | </ | ||
| + | |||