diff --git a/QEI.c b/QEI.c index 30cf071..9647b5e 100644 --- a/QEI.c +++ b/QEI.c @@ -10,6 +10,9 @@ struct QEI_t QEI_A, QEI_B, QEI_C; PIO pio_QEI = pio0; +const uint CODEUR_1_A = 26; +const uint CODEUR_1_B = 27; + void QEI_init(){ // Initialisation des 3 modules QEI // Chaque module QEI sera dans une machine à état du PIO 0 @@ -21,15 +24,22 @@ void QEI_init(){ if(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" : - // 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 !!! 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); - // QEI3: broche 24 et 25 - pio : pio0, sm : 1, Offset : 0, broches 26 et 27, clock div : 0 pour commencer - quadrature_encoder_program_init(pio_QEI, 2, offset, 24, 0); + // 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, 18, 0); QEI_A.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; 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){ switch (qei) { case QEI_A_NAME: - return QEI_A.value; + return QEI_A.delta; break; case QEI_B_NAME: - return QEI_B.value; + return -QEI_B.delta; break; case QEI_C_NAME: - return QEI_C.value; + return -QEI_C.delta; break; default: diff --git a/test.c b/test.c index 9a10f43..15a8cb6 100644 --- a/test.c +++ b/test.c @@ -11,12 +11,16 @@ #include "QEI.h" 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 TEST_TIMEOUT_US 10000000 int mode_test(); int test_moteurs(); +int test_QIE(); int test_vitesse_moteur(enum t_moteur moteur); int main() { @@ -33,6 +37,15 @@ int main() { gpio_set_dir(LED_PIN, GPIO_OUT); 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); Servomoteur_Init(); //puts("Debut"); @@ -41,6 +54,7 @@ int main() { //while(1); Temps_init(); Moteur_Init(); + QEI_init(); while(mode_test()); @@ -104,12 +118,17 @@ int main() { int mode_test(){ static int iteration = 3; printf("Appuyez sur une touche pour entrer en mode test :\n"); + printf("C - pour les codeurs\n"); printf("M - pour les moteurs\n"); stdio_flush(); int rep = getchar_timeout_us(TEST_TIMEOUT_US); stdio_flush(); switch (rep) { + case 'C': + case 'c': + while(test_QIE()); + break; case 'M': case 'm': /* 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 lettre_moteur; printf("Indiquez le moteurs à tester (A, B ou C):\n"); do{ lettre_moteur = getchar_timeout_us(TEST_TIMEOUT_US); + stdio_flush(); }while(lettre_moteur == PICO_ERROR_TIMEOUT); printf("Moteur choisi : %c %d %x\n", lettre_moteur, lettre_moteur, lettre_moteur); - stdio_flush(); switch (lettre_moteur) { @@ -175,8 +208,8 @@ int test_vitesse_moteur(enum t_moteur moteur){ int vitesse_moteur; do{ vitesse_moteur = getchar_timeout_us(TEST_TIMEOUT_US); + stdio_flush(); }while(vitesse_moteur == PICO_ERROR_TIMEOUT); - stdio_flush(); switch (vitesse_moteur) { @@ -210,5 +243,4 @@ int test_vitesse_moteur(enum t_moteur moteur){ break; } return 1; - } \ No newline at end of file