| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| fr:examples:can:wiper:tp2 [2010/03/05 10:25] – sdeniaud | fr:examples:can:wiper:tp2 [2020/07/20 09:00] (current) – external edit 127.0.0.1 |
|---|
| ====== TP2 - TP EXEMPLE N°2: MARCHE/ARRET DU MOTEUR E.G. ====== | ====== TP2 - Exemple 2 ====== |
| ===== Sujet: ===== | ===== Sujet: ===== |
| | **Marche/arrêt du moteur de l'essuie-glace.** |
| |
| ==== Objectifs : ==== | ==== Objectifs : ==== |
| ==== Cahier des charges : ==== | ==== Cahier des charges : ==== |
| Le bouton poussoir BP1, connecté sur l'entrée GP4 du "CAN Expander" sur module 8 entrées sur lequel peut être connecté le commodo Essuie-Glace, est utilisé pour commander le moteur: | Le bouton poussoir BP1, connecté sur l'entrée GP4 du "CAN Expander" sur module 8 entrées sur lequel peut être connecté le commodo Essuie-Glace, est utilisé pour commander le moteur: |
| BP1 appuyé (GP4 = 0) → le moteur est en marche | * BP1 appuyé (GP4 = 0) → le moteur est en marche |
| BP1 n'est pas appuyé (GP4 = 1) → le moteur est à l'arrêt | * BP1 n'est pas appuyé (GP4 = 1) → le moteur est à l'arrêt |
| La vitesse du moteur est définie par l'entrée analogique n°0 du module "Commodo Essuie Glace". | La vitesse du moteur est définie par l'entrée analogique n°0 du module "Commodo Essuie Glace". |
| |
| Un circuit de puissance (réf: L6202"), pilotable par signaux logiques est implanté sur le module. | Un circuit de puissance (réf: L6202"), pilotable par signaux logiques est implanté sur le module. |
| D'après le schéma électronique du module "Asservissement" donné en Annexe, ce pilotage se fait par les sorties GP2, GP3 et GP4 de l'interface CAN (circuit MCP25050): | D'après le schéma électronique du module "Asservissement" donné en Annexe, ce pilotage se fait par les sorties GP2, GP3 et GP4 de l'interface CAN (circuit MCP25050): |
| → GP2 ou "PWM1" sortie logique à rapport cyclique variable, qui permet de faire varier la vitesse | * GP2 ou ''PWM1'' sortie logique à rapport cyclique variable, qui permet de faire varier la vitesse |
| → GP3 ou "PWM2" sortie logique à rapport cyclique variable, qui permet de faire varier la vitesse du moteur dans le sens négatif, | * GP3 ou ''PWM2'' sortie logique à rapport cyclique variable, qui permet de faire varier la vitesse du moteur dans le sens négatif, |
| → GP4 ou "ValidIP" sortie logique qui, lorqu'elle est positionnée à 1, Valide le circuit d' Interface de Puissance "L6202". | * GP4 ou ''ValidIP'' sortie logique qui, lorqu'elle est positionnée à 1, Valide le circuit d' Interface de Puissance "L6202". |
| Dans notre application, on fera tourner le moteur en positif. Seule la sortie PWM1 sera activée. Par contre la sortie GP4 ou "ValidIP" devra être positionnée à 1. | Dans notre application, on fera tourner le moteur en positif. Seule la sortie ''PWM1'' sera activée. Par contre la sortie GP4 ou ''ValidIP'' devra être positionnée à 1. |
| |
| **Définitions des trames pour commander le moteur:** | **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, afin de l'initialiser dans le but d'obtenir la fonction attendue | Une sucession de trames de commande (type IM) devra être envoyée, dans un ordre bien précis au module asservissement, afin de l'initialiser dans le but d'obtenir la fonction attendue |
| Définition des éléments d'identification d'une trame de type "IM" permettant de commander le module "Asservissement": | Définition des éléments d'identification d'une trame de type "IM" permettant de commander le module "Asservissement": |
| 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", avec la fonction "Write register" (voir documentation technique du MPC25025 pages 22). On pourra ainsi modifier les différents registres du module "Asservissement". | 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", avec la fonction ''Write register'' (voir documentation technique du MPC25025 pages 22). On pourra ainsi modifier les différents registres du module "Asservissement". |
| L’identificateur défini dans le chapitre 1, pour un "IM" envoyé à la carte "Asservissement"est : 0x00880000 (label: Ident_T_IM_Asservissement) | L’identificateur défini dans le chapitre 1, pour un "IM" envoyé à la carte "Asservissement"est : 0x00880000 (label: Ident_T_IM_Asservissement) |
| |
| → Définition de variables structurées sous le modèle "Trame": | * Définition de variables structurées sous le modèle "Trame": **Trame T_IM_Asservissement;** |
| Trame T_IM_Asservissement; | * Définition des éléments d'identification de la variable structurée ''T_IM_Asservissement'' |
| → Définition des éléments d'identification de la variable structurée "T_IM_Asservissement" | <code c> |
| T_IM_Asservissement.trame_info.registre=0x00; //On initialise tous les bits à 0 | T_IM_Asservissement.trame_info.registre=0x00; //On initialise tous les bits à 0 |
| T_IM_Asservissement.trame_info.champ.extend=1; //On travaille en mode étendu | T_IM_Asservissement.trame_info.champ.extend=1; //On travaille en mode étendu |
| T_IM_Asservissement.trame_info.champ.dlc=0x03; //Il y aura 3 octets de données | T_IM_Asservissement.trame_info.champ.dlc=0x03; //Il y aura 3 octets de données |
| T_IM_Asservissement.ident.extend.identificateur.ident=Ident_T_IM_Asservissement; | T_IM_Asservissement.ident.extend.identificateur.ident=Ident_T_IM_Asservissement; |
| | </code> |
| |
| A chacune des trames de commande "IM" il y aura donc à définir les trois octets associés. | A chacune des trames de commande "IM" il y aura donc à définir les trois octets associés. |
| |
| Trame n°1 → pour définir les entrées et sorties du module "Asservissement" | **Trame n°1** → pour définir les entrées et sorties du module "Asservissement" |
| Il faut initialiser le registre GPDDR ("Data Direction Register") en écrivant un 1 si bit d'entrée et un 0 si bit de sortie(doc MCP25050 p27). D'après schéma structurel de la carte "Asservissement" donné en Annexe: | Il faut initialiser le registre GPDDR ("Data Direction Register") en écrivant un 1 si bit d'entrée et un 0 si bit de sortie(doc MCP25050 p27). D'après schéma structurel de la carte "Asservissement" donné en Annexe: |
| GP7=fs -> entrée; GP6=fcg -> entrée; GP5=fcd -> entrée; GP4=ValidIP -> sortie; | <code c> |
| GP3=PWM1 -> sortie; GP2=PWM2 -> sortie; GP1=AN1 -> entrée; GP0=AN0 -> entrée; | GP7=fs -> entrée; GP6=fcg -> entrée; GP5=fcd -> entrée; GP4=ValidIP -> sortie; |
| T_IM_Asservissement.data[0]=0x1F; // Adresse du registre GPDDR en écriture | GP3=PWM1 -> sortie; GP2=PWM2 -> sortie; GP1=AN1 -> entrée; GP0=AN0 -> entrée; |
| (doc MCP25050 page 16) | T_IM_Asservissement.data[0]=0x1F; // Adresse du registre GPDDR en écriture (doc MCP25050 page 16) |
| T_IM_Asservissement.data[1]=0x7F; // Masque: bit 7 non concerné (doc MCP25050 page 16) | T_IM_Asservissement.data[1]=0x7F; // Masque: bit 7 non concerné (doc MCP25050 page 16) |
| T_IM_Asservissement.data[2]=0xE3; // Valeur: à charger dans le registre adressé | T_IM_Asservissement.data[2]=0xE3; // Valeur: à charger dans le registre adressé |
| Suite à ces définitions, il faudra | </code> |
| - envoyer la trame par la fonction Ecire_Trame(T_IM_Asservissement) | Suite à ces définitions, il faudra: |
| - puis attendre la réponse de type "Ack" en utilisant la fonction Lire_Trame(&T_Recue) | * envoyer la trame par la fonction Ecire_Trame(T_IM_Asservissement) |
| | * puis attendre la réponse de type "Ack" en utilisant la fonction ''Lire_Trame(&T_Recue)'' |
| | |
| | **Trame n°2** → pour initialiser la sortie GP2 en sortie PWM1 (commande du moteur dans le sens positif) |
| | D'après la notice technique du circuit MCP25050 (pages 30 à 32), la génération du signal PWM1 se fait à partie du ''Timer1'' et la fréquence de ce signal est choisie grâce au registre ''T1CON'' d'adresse 05H (page 15 Doc MCP25050). |
| | <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; // Adresse du registre T1CON en écriture (doc MCP25050 p15) 05H + décalage = 05H + 1CH = 21H |
| | T_IM_Asservissement.data[1]=0xB3; // Masque sur le registre (doc MCP25050 p32) |
| | T_IM_Asservissement.data[2]=0x80; // Valeur à charger dans le registre adressé |
| | </code> |
| |
| Trame n°2 → pour initialiser la sortie GP2 en sortie PWM1 (commande du moteur dans le sens positif) | |
| D'après la notice technique du circuit MCP25050 (pages 30 à 32), la génération du signal PWM1 se fait à partie du "Timer1" et la fréquence de ce signal est choisie grâce au registre "T1CON" d'adresse 05H (page 15 Doc MCP25050). | |
| 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; // Adresse du registre T1CON en écriture | |
| (doc MCP25050 p15) 05H + décalage = 05H + 1CH = 21H | |
| T_IM_Asservissement.data[1]=0xB3; // Masque sur le registre (doc MCP25050 p32) | |
| T_IM_Asservissement.data[2]=0x80; // Valeur à charger dans le registre adressé | |
| Suite à ces définitions, il faudra | Suite à ces définitions, il faudra |
| - envoyer la trame par la fonction Ecire_Trame(T_IM_Asservissement) | * envoyer la trame par la fonction ''Ecrire_Trame(T_IM_Asservissement)'' |
| - puis attendre la réponse de type "Ack" en utilisant la fonction Lire_Trame(&T_Recue) | * puis attendre la réponse de type "Ack" en utilisant la fonction ''Lire_Trame(&T_Recue)'' |
| |
| Trame n°3 → pour définir la fréquence de la sortie PWM1: | **Trame n°3** → pour définir la fréquence de la sortie PWM1: |
| Cette fréquence dépend de la valeur chargée dans le registre "PR1" | Cette fréquence dépend de la valeur chargée dans le registre "PR1" |
| T_IM_Asservissement.data[0]=0x23; // adresse du registre PR1 en écriture | <code c> |
| (doc MCP25050 p15) 07H + décalage = 07H + 1CH = 23H | T_IM_Asservissement.data[0]=0x23; // adresse du registre PR1 en écriture (doc MCP25050 p15) 07H + décalage = 07H + 1CH = 23H |
| T_IM_Asservissement.data[1]=0xFF; // Masque sur le registre (doc MCP25050 p32) | T_IM_Asservissement.data[1]=0xFF; // Masque sur le registre (doc MCP25050 p32) |
| T_IM_Asservissement.data[2]=0xFF; // On chargera 255 dans le registre | T_IM_Asservissement.data[2]=0xFF; // On chargera 255 dans le registre |
| | </code> |
| La fréquence du quartz implanté sur la carte "asservissement" étant égale à 16Mhz, la fréquence du signal PWM1 sera donc égale à : FPWM = 16.106/(4.256) = 15,6 KHz | La fréquence du quartz implanté sur la carte "asservissement" étant égale à 16Mhz, la fréquence du signal PWM1 sera donc égale à : FPWM = 16.106/(4.256) = 15,6 KHz |
| Ce qui est une fréquence correcte pour piloter un moteur en PWM (fréquence sensiblement inaudible). | Ce qui est une fréquence correcte pour piloter un moteur en PWM (fréquence sensiblement inaudible). |
| | |
| Suite à ces définitions, il faudra | Suite à ces définitions, il faudra |
| - envoyer la trame par la fonction Ecire_Trame(T_IM_Asservissement) | * envoyer la trame par la fonction ''Ecrire_Trame(T_IM_Asservissement)'' |
| - puis attendre la réponse de type "Ack" en utilisant la fonction Lire_Trame(&T_Recue) | * puis attendre la réponse de type "Ack" en utilisant la fonction ''Lire_Trame(&T_Recue)'' |
| |
| Trame n°4 → pour définir le rapport cyclique de la sortie PWM1 (module de la commande donc de la vitesse du moteur) | **Trame n°4** → pour définir le rapport cyclique de la sortie PWM1 (module de la commande donc de la vitesse du moteur) |
| T_IM_Asservissement.data[0]=0x25; //adresse du registre PWM1DCH en écriture | <code c> |
| (doc MCP25050 p15) 09H + décalage = 09H + 1CH = 25H | T_IM_Asservissement.data[0]=0x25; //adresse du registre PWM1DCH en écriture (doc MCP25050 p15) 09H + décalage = 09H + 1CH = 25H |
| T_IM_Asservissement.data[1]=0xFF; //masque sur le registre (doc MCP25050 p33) | T_IM_Asservissement.data[1]=0xFF; //masque sur le registre (doc MCP25050 p33) |
| T_IM_Asservissement.data[2]=0x7F; // Commande =127 (0xFF=255 pour la commande Maxi) | T_IM_Asservissement.data[2]=0x7F; // Commande =127 (0xFF=255 pour la commande Maxi) |
| | </code> |
| Suite à ces définitions, il faudra | Suite à ces définitions, il faudra |
| - envoyer la trame par la fonction Ecire_Trame(T_IM_Asservissement) | * envoyer la trame par la fonction ''Ecrire_Trame(T_IM_Asservissement)'' |
| - puis attendre la réponse de type "Ack" en utilisant la fonction Lire_Trame(&T_Recue) | * puis attendre la réponse de type "Ack" en utilisant la fonction ''Lire_Trame(&T_Recue)'' |
| |
| | |
| Pour démarrer (ou arrêter) le moteur, on agira alors sur le signal 'ValidIP' soit la sortie GP4 | Pour démarrer (ou arrêter) le moteur, on agira alors sur le signal ''ValidIP'' soit la sortie GP4 |
| → pour valider le circuit de puissance (démarrer le moteur) | * pour valider le circuit de puissance (démarrer le moteur) |
| | <code c> |
| T_IM_Asservissement.data[0]=0x1E; //adresse du registre GPLAT en écriture | T_IM_Asservissement.data[0]=0x1E; //adresse du registre GPLAT en écriture |
| T_IM_Asservissement.data[1]=0x10; //masque sur le registre (doc MCP25050 p27) | T_IM_Asservissement.data[1]=0x10; //masque sur le registre (doc MCP25050 p27) |
| T_IM_Asservissement.data[2]=0x10; //On positionne le bit GP4 du registre à 1 | T_IM_Asservissement.data[2]=0x10; //On positionne le bit GP4 du registre à 1 |
| → pour inhiber le circuit de puissance (arrêter le moteur) | </code> |
| | * pour inhiber le circuit de puissance (arrêter le moteur) |
| | <code c> |
| T_IM_Asservissement.data[0]=0x1E; //adresse du registre GPLAT en écriture | T_IM_Asservissement.data[0]=0x1E; //adresse du registre GPLAT en écriture |
| T_IM_Asservissement.data[1]=0x10; //masque sur le registre (doc MCP25050 p27) | T_IM_Asservissement.data[1]=0x10; //masque sur le registre (doc MCP25050 p27) |
| T_IM_Asservissement.data[2]=0x00; //On positionne le bit GP4 du registre à 0 | T_IM_Asservissement.data[2]=0x00; //On positionne le bit GP4 du registre à 0 |
| | </code> |
| Définitions des trames pour configurer et interroger le module commodo E.G. | **Définitions des trames pour configurer et interroger le module commodo E.G. |
| (Voir TP Exemple n°1) | (Voir TP Exemple n°1)** |
| | |
| |
| ==== Organigramme ==== | ==== Organigramme ==== |
| | |
| | {{ :fr:examples:can:wiper:orga_2.png |}} |
| |
| ==== Programme en "C" ==== | ==== Programme en "C" ==== |