Codeurs testés fonctionnels, moteurs testés fonctionnels - programme de test inclu

This commit is contained in:
Samuel 2022-11-27 11:35:06 +01:00
parent ba83f1917d
commit 67f0e3c8f2
2 changed files with 60 additions and 11 deletions

33
QEI.c
View File

@ -10,6 +10,9 @@ struct QEI_t QEI_A, QEI_B, QEI_C;
PIO pio_QEI = pio0; PIO pio_QEI = pio0;
const uint CODEUR_1_A = 26;
const uint CODEUR_1_B = 27;
void QEI_init(){ void QEI_init(){
// Initialisation des 3 modules QEI // Initialisation des 3 modules QEI
// Chaque module QEI sera dans une machine à état du PIO 0 // Chaque module QEI sera dans une machine à état du PIO 0
@ -21,15 +24,22 @@ void QEI_init(){
if(offset != 0){ if(offset != 0){
printf("PIO init error: offset != 0"); printf("PIO init error: offset != 0");
} }
// bizarrement, il faut initialiser les boches en entrée pour les GPIO 26 et 27.
// Probablement car elle sont en analogique par défaut...
gpio_init(CODEUR_1_A);
gpio_set_dir(CODEUR_1_A, GPIO_IN);
gpio_init(CODEUR_1_B);
gpio_set_dir(CODEUR_1_B, GPIO_IN);
// Initialisation des "machines à états" : // Initialisation des "machines à états" :
// QEI1 : broche 26 et 27 - pio : pio0, sm : 0, Offset : 0, broches 26 et 27, clock div : 0 pour commencer // QEI1 : broche 31 et 32 - pio : pio0, sm : 0, Offset : 0, broches (GPIO) 26 et 27, clock div : 0 pour commencer
// QEI1 : !!! Attention, il faudra modifier la carte élec !!! // QEI1 : !!! Attention, il faudra modifier la carte élec !!!
quadrature_encoder_program_init(pio_QEI, 0, offset, 26, 0); quadrature_encoder_program_init(pio_QEI, 0, offset, 26, 0);
// QEI2: broche 26 et 27 - pio : pio0, sm : 1, Offset : 0, broches 26 et 27, clock div : 0 pour commencer // QEI2 : broche 26 et 27 - pio : pio0, sm : 1, Offset : 0, broches (GPIO) 20 et 21, clock div : 0 pour commencer
quadrature_encoder_program_init(pio_QEI, 1, offset, 20, 0); quadrature_encoder_program_init(pio_QEI, 1, offset, 20, 0);
// QEI3: broche 24 et 25 - pio : pio0, sm : 1, Offset : 0, broches 26 et 27, clock div : 0 pour commencer // QEI3 : broche 24 et 25 - pio : pio0, sm : 1, Offset : 0, broches (GPIO) 18 et 19, clock div : 0 pour commencer
quadrature_encoder_program_init(pio_QEI, 2, offset, 24, 0); quadrature_encoder_program_init(pio_QEI, 2, offset, 18, 0);
QEI_A.value=0; QEI_A.value=0;
QEI_B.value=0; QEI_B.value=0;
@ -37,7 +47,9 @@ void QEI_init(){
} }
void QEI_update(){ /// @brief Lit les modules QEI et stock l'écart en cette lecture et la lecture précédente.
void QEI_update(void){
int old_value; int old_value;
old_value = QEI_A.value; old_value = QEI_A.value;
@ -54,19 +66,24 @@ void QEI_update(){
} }
/// @brief Renvoi le nombre d'impulsion du module QEI depuis la lecture précédente
/// Les signe sont inversés (sauf A) car le reducteur inverse le sens de rotation.
/// Attention, le signe du QEI_A est inversé par rapport aux autres à cause d'un soucis sur la carte électornique
/// @param qei : Nom du module à lire (QEI_A_NAME, QEI_B_NAME ou QEI_C_NAME)
/// @return Nombre d'impulsion calculé lors du dernier appel de la function QEI_Update()
int QEI_get(enum QEI_name_t qei){ int QEI_get(enum QEI_name_t qei){
switch (qei) switch (qei)
{ {
case QEI_A_NAME: case QEI_A_NAME:
return QEI_A.value; return QEI_A.delta;
break; break;
case QEI_B_NAME: case QEI_B_NAME:
return QEI_B.value; return -QEI_B.delta;
break; break;
case QEI_C_NAME: case QEI_C_NAME:
return QEI_C.value; return -QEI_C.delta;
break; break;
default: default:

38
test.c
View File

@ -11,12 +11,16 @@
#include "QEI.h" #include "QEI.h"
const uint LED_PIN = 25; const uint LED_PIN = 25;
const uint LED_PIN_ROUGE = 28;
const uint LED_PIN_NE_PAS_UTILISER = 22;
#define V_INIT -999.0 #define V_INIT -999.0
#define TEST_TIMEOUT_US 10000000 #define TEST_TIMEOUT_US 10000000
int mode_test(); int mode_test();
int test_moteurs(); int test_moteurs();
int test_QIE();
int test_vitesse_moteur(enum t_moteur moteur); int test_vitesse_moteur(enum t_moteur moteur);
int main() { int main() {
@ -33,6 +37,15 @@ int main() {
gpio_set_dir(LED_PIN, GPIO_OUT); gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_put(LED_PIN, 1); gpio_put(LED_PIN, 1);
gpio_init(LED_PIN_ROUGE);
gpio_set_dir(LED_PIN_ROUGE, GPIO_OUT);
gpio_put(LED_PIN_ROUGE, 1);
// Il fuat neutraliser cettte broche qui pourrait interférer avec
// la lecture des codeurs. (problème sur la carte électrique)...
gpio_init(LED_PIN_NE_PAS_UTILISER);
gpio_set_dir(LED_PIN_NE_PAS_UTILISER, GPIO_IN);
sleep_ms(3000); sleep_ms(3000);
Servomoteur_Init(); Servomoteur_Init();
//puts("Debut"); //puts("Debut");
@ -41,6 +54,7 @@ int main() {
//while(1); //while(1);
Temps_init(); Temps_init();
Moteur_Init(); Moteur_Init();
QEI_init();
while(mode_test()); while(mode_test());
@ -104,12 +118,17 @@ int main() {
int mode_test(){ int mode_test(){
static int iteration = 3; static int iteration = 3;
printf("Appuyez sur une touche pour entrer en mode test :\n"); printf("Appuyez sur une touche pour entrer en mode test :\n");
printf("C - pour les codeurs\n");
printf("M - pour les moteurs\n"); printf("M - pour les moteurs\n");
stdio_flush(); stdio_flush();
int rep = getchar_timeout_us(TEST_TIMEOUT_US); int rep = getchar_timeout_us(TEST_TIMEOUT_US);
stdio_flush(); stdio_flush();
switch (rep) switch (rep)
{ {
case 'C':
case 'c':
while(test_QIE());
break;
case 'M': case 'M':
case 'm': case 'm':
/* code */ /* code */
@ -130,15 +149,29 @@ int mode_test(){
} }
int test_QIE(){
int lettre;
printf("Affichage des QEI :\nAppuyez sur une touche pour quitter\n");
do{
QEI_update();
printf("Codeur a : %d, codeur B : %d, codeur C : %d\n", QEI_get(QEI_A_NAME), QEI_get(QEI_B_NAME), QEI_get(QEI_C_NAME));
sleep_ms(100);
lettre = getchar_timeout_us(0);
}while(lettre == PICO_ERROR_TIMEOUT);
return 0;
}
int test_moteurs(){ int test_moteurs(){
int lettre_moteur; int lettre_moteur;
printf("Indiquez le moteurs à tester (A, B ou C):\n"); printf("Indiquez le moteurs à tester (A, B ou C):\n");
do{ do{
lettre_moteur = getchar_timeout_us(TEST_TIMEOUT_US); lettre_moteur = getchar_timeout_us(TEST_TIMEOUT_US);
stdio_flush();
}while(lettre_moteur == PICO_ERROR_TIMEOUT); }while(lettre_moteur == PICO_ERROR_TIMEOUT);
printf("Moteur choisi : %c %d %x\n", lettre_moteur, lettre_moteur, lettre_moteur); printf("Moteur choisi : %c %d %x\n", lettre_moteur, lettre_moteur, lettre_moteur);
stdio_flush();
switch (lettre_moteur) switch (lettre_moteur)
{ {
@ -175,8 +208,8 @@ int test_vitesse_moteur(enum t_moteur moteur){
int vitesse_moteur; int vitesse_moteur;
do{ do{
vitesse_moteur = getchar_timeout_us(TEST_TIMEOUT_US); vitesse_moteur = getchar_timeout_us(TEST_TIMEOUT_US);
stdio_flush();
}while(vitesse_moteur == PICO_ERROR_TIMEOUT); }while(vitesse_moteur == PICO_ERROR_TIMEOUT);
stdio_flush();
switch (vitesse_moteur) switch (vitesse_moteur)
{ {
@ -210,5 +243,4 @@ int test_vitesse_moteur(enum t_moteur moteur){
break; break;
} }
return 1; return 1;
} }