I. Matériels▲
Matériel |
Description |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
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.
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 :
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) :
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 :
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.
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▲
#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.