Cypress PSoC 4 Pioneer Kit : piloter un moteur à courant continu avec un joystick

Un exemple de développement sur carte PSoC avec l'EDI PSoC Creator

Un exemple simple visant à piloter un moteur à courant continu avec un joystick à retour analogique et un pont en H comme interface de puissance. Le développement est réalisé avec la carte du kit Cypress PSoC 4 (voir Débuter avec les cartes Cypress PSoC et l'EDI PSoC Creator).

Commentez Donner une note à l'article (5)

Article lu   fois.

Les deux auteurs

Profil Pro

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Matériels

Image non disponible

Matériel

Description

  • Carte du CY8CKIT-042 PSoC 4 Pioneer Kit
Image non disponible
  • Module de puissance à base de L298N (Dual H-Bridge motor drivers L298N)
Image non disponible
  • Ce petit module prêt à l'emploi est un double Pont-H destiné au contrôle de moteur à courant continu avec une carte à microcontrôleur.
  • Pour ce projet, le L298N qui constitue le cœur de ce module permet de contrôler un moteur CC (et même deux) aussi bien en vitesse de rotation (signal modulé PWM) qu'en direction. Tension nominale du moteur : 6 à 35 V, courant maxi en pointe : 2 A.
  • Il existe de nombreuses variantes de ce module, assez faciles à trouver pour quelques euros seulement. Consultez sa datasheet avant de vous décider.
  • Moteur à courant continu (brushed)
Image non disponible
  • Beaucoup de moteurs ou motoréducteurs génériques pour hobbyistes conviendront pour ce projet sans finalité précise en ce qui concerne la charge entraînée. Il faudra quand même vous assurer que ses caractéristiques tension-intensité sont compatibles avec votre module de puissance L298N.
  • Alimentation stabilisée à courant continu
  • Module avec mini-joystick 2 axes à signaux analogiques (thumb joystick)
Image non disponible
  • Les mouvements du joystick actionnent deux potentiomètres 10 kΩ et délivrent donc des signaux analogiques (Xout et Yout) en fonction de la position.
  • Vous trouverez facilement ce genre de modules prêts à l'emploi, produits par Adafruit, Sparkfun…
  • Plaque de câblage rapide, fils de connexion, résistances, potentiomètres…
Image non disponible
Image non disponible
  • Tous ces petits matériels, qui font partie de l'attirail de l'apprenti maker, peuvent être trouvés facilement chez un revendeur de matériel électronique ou dans des kits d'électronique pour débutant.

II. Configuration initiale du kit

La logique de commande du module de puissance L298N fonctionne en 5 V. On sélectionnera cette tension sur la carte du kit PSoC en positionnant le cavalier d'alimentation du sélecteur J9 sur VDD = 5 V :

Image non disponible

Vous devez également renseigner la configuration en 5 V dans l'environnement PSoC Creator. Dans l'onglet avec l'extension .cydwr, sélectionnez l'onglet System en bas de la fenêtre. Renseignez les champs VDDA et VDDD avec la nouvelle configuration (au besoin, redémarrez PSoC Creator pour prendre en compte les changements) :

Image non disponible

III. Pilotage du moteur

Typiquement, le schéma de câblage du module est le suivant :

Image non disponible

Au niveau du pilotage, les broches IN1 et IN2 permettent de sélectionner le sens de rotation du moteur (IN1=5 V, IN2=0 V en marche avant ; IN1=0 V, IN2=5 V en marche arrière).

Pour cela, on utilisera un registre de contrôle (control register) dirigé vers deux connecteurs de la carte PSoC configurés en sorties (P1[1] et P1[2]). Cette façon d'interagir avec les sorties est bien plus efficace que d'écrire directement sur chaque broche.

Image non disponible
Registre de contrôle 2 bits pour sélectionner le sens de rotation du moteur dans l'EDI PSoC Ceator. Les connecteurs P1[1] et P1[2] de la carte PSoC doivent être reliés respectivement aux broches IN1 et IN2 du module de puissance L298N.

Dans le code, on définit les deux valeurs possibles du registre 2 bits :

  • 0x01, pour IN1=1 et IN2=0 (sens antihoraire ou CounterClockWise) ;
  • 0x02, pour IN1=0 et IN2=1 (sens horaire ou ClockWise).

Écriture dans le registre de contrôle du sens de rotation :

 
Sélectionnez
#define CCW() ControlReg_Write(0x01);
#define CW()  ControlReg_Write(0x02);

La broche Enable A (ou ENA) permet de contrôler la vitesse de rotation du moteur : 0 V à l'arrêt, 5 V à pleine vitesse. Un signal modulé en largeur d'impulsion PWM (Pulse Width Modulation) permet de faire varier la vitesse en jouant sur le rapport cyclique (duty cycle). Le but est donc de diriger un générateur de signaux PWM vers une sortie de la carte PSoC :

Image non disponible
Depuis PSoC Creator, on dirige un générateur de signaux PWM vers un connecteur de la carte PSoC configuré en sortie. Le connecteur P1[0] doit être relié à la broche ENA du module de puissance L298N.

Le paramètre Period est fixé à 255, et initialement le paramètre Compare est à 0 (ce qui revient à générer un signal de sortie à 0 V) :

Image non disponible
Configuration du générateur de signaux PWM dans PSoC Creator
Image non disponible
Period=255 ; Compare=50
Image non disponible
Period=255 ; Compare=100
Image non disponible
Period=255 ; Compare=180

Depuis la boîte de configuration, on peut voir dans le tableau ci-dessus l'influence du paramètre Compare sur la largeur d'impulsion. Sur débordement du compteur, la sortie bascule à l'état haut et le compteur repart à zéro. Lorsque le compteur atteint la valeur Compare, la sortie bascule à l'état bas. Avec une horloge à 6 kHz, le compteur est incrémenté toutes les 1/6000 s.

Pour modifier le paramètre Compare par le code :

 
Sélectionnez
PWMSpd_WriteCompare(uint32 compare);

IV. Signal analogique de commande du mini-Joystick

Ici, on exploite le mouvement du joystick suivant une seule direction (le potentiomètre de direction horizontale par exemple) pour faire varier plus ou moins la vitesse du moteur dans les deux sens de rotation.

Dans PSoC Creator, on configure une entrée analogique (connecteur P2[0]) que l'on dirige vers un convertisseur analogique-numérique par approximations successives (ADC SAR). La sortie End of Conversion (eoc) du composant est dirigée vers un composant ISR (Interruption Service Routine) :

Image non disponible

La configuration du convertisseur analogique-numérique est la suivante :

Image non disponible
Conversions en continu (free running mode) ; résolution=12 bits ; plage de conversion entre 0 et 2xVref=5 V ; fréquence d'horloge=1000 kHz ; résultat non signé et moyenné sur 256 échantillons.

Pour obtenir une conversion 12 bits en mode asymétrique (single ended), il faut connecter Vref à l'entrée négative. Dans ce cas, la plage de conversion est entre 0 et 2xVref. Sélectionnez le format Unsigned pour le résultat en sortie.

Image non disponible
Temps de conversion des 256 échantillons moyennés = 4,61 ms.

Un front montant sur la sortie eoc (End Of Conversion) du convertisseur produira une interruption (composant ISR nommé ISRADCEOConv) à chaque fin de cycle de conversion.

La routine d'interruption sur fin de conversion (eoc) est définie ci-dessous :

 
Sélectionnez
CY_ISR(ADCEOC) {
    static uint8 calibration = 1;
    int16 adcCountsA = ADC_GetResult16(CHA);

    if (calibration) {
        calibration = 0; 
        joystickzero = adcCountsA;
    } else {
        dutyc = (float32)adcCountsA / joystickzero - 1.;
        flagEOC = 1;
    }
}

ADC_GetResult16(CHA) retourne le résultat issu de la conversion analogique-numérique contenu dans le registre du convertisseur dans un mot 16 bits. Avec une résolution de 12 bits : 0 pour 0 V, 4095 pour 5 V. Résolution en volt = 1,2 mV.

Le résultat de la première conversion est stocké dans la variable joystickzero afin de calibrer le joystick en position neutre au démarrage du système. Sinon on calcule la variable dutyc, valeur signée en fonction du sens de rotation demandé, qui servira à redéfinir le paramètre Compare du générateur PWM et faire varier ainsi le rapport cyclique. Un drapeau flagEOC signale la fin de la conversion.

Dans la boucle principale, on lance la fonction motoroutput() à chaque cycle de conversions achevé afin de reconfigurer le rapport cyclique du générateur PWM et activer un sens de rotation :

 
Sélectionnez
    if (flagEOC) {
        flagEOC = 0;
        motoroutput(dutyc);    
    }
 
Sélectionnez
#define PWMmaxcomp 254 //Period 255

void motoroutput(float32 dc) {
    int16 compare = dc * PWMmaxcomp;
    if ((dc >= 0) && (dc <= 1)) {
        PWMSpd_WriteCompare(compare);
        CCW();
    } else if ((dc < 0) && (dc >= -1)) {
        PWMSpd_WriteCompare(-compare);
        CW();
    }
}

V. Le design et le code complet du projet

Image non disponible
main.c
Sélectionnez
#include <project.h>

//ADC param
#define CHA (0u)

volatile uint8 flagEOC = 0;
volatile float32 dutyc = 0.;

int16 joystickzero = 0;

//Motor param
#define CCW() ControlReg_Write(0x01);
#define CW()  ControlReg_Write(0x02);

#define PWMmaxcomp 254 //Period 255

void motoroutput(float32);

CY_ISR(ADCEOC) {
    static uint8 calibration = 1;
    int16 adcCountsA = ADC_GetResult16(CHA);

    if (calibration) {
        calibration = 0; 
        joystickzero = adcCountsA;
    } else {
        dutyc = (float32)adcCountsA / joystickzero - 1.;
        flagEOC = 1;
    }
}

void motoroutput(float32 dc) {
    int16 compare = dc * PWMmaxcomp;
    if ((dc >= 0) && (dc <= 1)) {
        PWMSpd_WriteCompare(compare);
        CCW();
    } else if ((dc < 0) && (dc >= -1)) {
        PWMSpd_WriteCompare(-compare);
        CW();
    }
}

int main() {
    CyGlobalIntEnable; /* Enable global interrupts */

    ISRADCEOConv_StartEx(ADCEOC);
    
    PWMSpd_Start();

    ADC_Start();
    ADC_IRQ_Enable();
    ADC_StartConvert();
    //CyDelay(50);

    for (;;) {
        if (flagEOC) {
            flagEOC = 0;
            motoroutput(dutyc);
        }
    }
}

VI. Note de la rédaction

Nous remercions Juan Esteban Paz de nous avoir autorisés à reprendre les travaux de son projet Joystick Controlled DC Motor w/H-Bridge pour ce tutoriel.

Nous remercions également les membres de la rédaction de developpez.com pour le travail de traduction et de relecture qu'ils ont effectué, en particulier : f-leb, Delias, Vincent PETIT et ClaudeLELOUP.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Licence Creative Commons
Le contenu de cet article est rédigé par f-leb et est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé.
Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright © 2013 Developpez.com.