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

| f-leb | Juan Esteban Paz |

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

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

- Auteurs : f-leb, Juan Esteban Paz

- Parution : 7 avril 2018

- Licence : 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.

Voir également :

- Débuter avec les cartes Cypress PSoC et l'EDI PSoC Creator

Sommaire

- I. Matériels

- II. Configuration initiale du kit

- III. Pilotage du moteur

- IV. Signal analogique de commande du mini-Joystick

- V. Le design et le code complet du projet

- VI. Note de la rédaction

I - Matériels

Matériel

Description

- Carte du CY8CKIT-042 PSoC 4 Pioneer Kit

- À lire : Test du CY8CKIT-042 PSoC 4 Pioneer Kit de Cypress.
D'autres kits PSoC peuvent convenir pour ce projet moyennant quelques adaptations, voir PSoC 4 development Kits.

- Prix constaté : 20-25 euros, chez Farnell, Mouser…

- Outil de développement sur Windows seulement (gratuit) : PSoC Creator.

- Module de puissance à base de L298N (Dual H-Bridge motor drivers L298N)

- 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)

- 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

- Alimentation stabilisée de laboratoire, récupération d'alimentation de type ATX pour PC ou autres, c'est elle qui fournira la puissance au moteur.

- Module avec mini-joystick 2 axes à signaux analogiques (thumb joystick)

- 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…

- 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 :

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) :

III - Pilotage du moteur

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

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.

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 :

#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 :

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) :

Configuration du générateur de signaux PWM dans PSoC Creator

Period=255 ; Compare=50

Period=255 ; Compare=100

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 :

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) :

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

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.

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 :

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 :

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

#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

main.c

#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.