Asservissement des moteurs fonctionnel
This commit is contained in:
		
							parent
							
								
									6162c6f412
								
							
						
					
					
						commit
						bde7f64555
					
				@ -2,20 +2,8 @@
 | 
			
		||||
#include "Moteurs.h"
 | 
			
		||||
#include "Asser_Moteurs.h"
 | 
			
		||||
 | 
			
		||||
/*** C'est ici que se fait la conversion en mm 
 | 
			
		||||
 * ***/
 | 
			
		||||
 | 
			
		||||
// Roues 60 mm de diamètre, 188,5 mm de circonférence
 | 
			
		||||
// Réduction Moteur 30:1
 | 
			
		||||
// Réduction poulie 16:12
 | 
			
		||||
// Nombre d'impulsions par tour moteur : 200
 | 
			
		||||
// Nombre d'impulsions par tour réducteur : 6000
 | 
			
		||||
// Nombre d'impulsions par tour de roue : 8000
 | 
			
		||||
// Impulsion / mm : 42,44
 | 
			
		||||
 | 
			
		||||
#define IMPULSION_PAR_MM (1.f)
 | 
			
		||||
#define ASSERMOTEUR_GAIN_P 2.f
 | 
			
		||||
#define ASSERMOTEUR_GAIN_I 0.f
 | 
			
		||||
#define ASSERMOTEUR_GAIN_P 300000.f
 | 
			
		||||
#define ASSERMOTEUR_GAIN_I 30000.f
 | 
			
		||||
 | 
			
		||||
float consigne_mm_s[3]; // Consigne de vitesse (en mm/s)
 | 
			
		||||
float commande_I[3]; // Terme integral
 | 
			
		||||
 | 
			
		||||
@ -23,6 +23,7 @@ pico_generate_pio_header(Mon_Projet ${CMAKE_CURRENT_LIST_DIR}/quadrature_encoder
 | 
			
		||||
target_include_directories(Mon_Projet PRIVATE Mon_Projet_ULD_API/inc/)
 | 
			
		||||
 | 
			
		||||
target_link_libraries(Mon_Projet
 | 
			
		||||
  hardware_adc 
 | 
			
		||||
  hardware_i2c 
 | 
			
		||||
  hardware_pwm 
 | 
			
		||||
  hardware_pio
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										29
									
								
								QEI.c
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								QEI.c
									
									
									
									
									
								
							@ -17,9 +17,8 @@
 | 
			
		||||
// Nombre d'impulsions par tour de roue : 8000
 | 
			
		||||
// Impulsion / mm : 42,44
 | 
			
		||||
 | 
			
		||||
#define IMPULSION_PAR_MM (1.f)
 | 
			
		||||
#define ASSERMOTEUR_GAIN_P 2
 | 
			
		||||
#define ASSERMOTEUR_GAIN_I .0f
 | 
			
		||||
#define IMPULSION_PAR_MM (12.45f)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct QEI_t QEI_A, QEI_B;
 | 
			
		||||
 | 
			
		||||
@ -27,34 +26,22 @@ bool QEI_est_init = false;
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
    if(!QEI_est_init){
 | 
			
		||||
 | 
			
		||||
        // Offset le début du programme
 | 
			
		||||
        // Si ce n'est pas 0, le programme ne marchera pas
 | 
			
		||||
        uint offset = pio_add_program(pio_QEI, &quadrature_encoder_program); 
 | 
			
		||||
        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 31 et 32 - pio : pio0, sm : 0, Offset : 0, GPIO 2 et 3, clock div : 0 pour commencer
 | 
			
		||||
    // QEI1 : !!! Attention, il faudra modifier la carte élec !!! => Fait.
 | 
			
		||||
    quadrature_encoder_program_init(pio_QEI, 0, offset, 2, 0);
 | 
			
		||||
    // QEI2 : broche 26 et 27 - pio : pio0, sm : 1, Offset : 0, GPIO 11 et 12, clock div : 0 pour commencer
 | 
			
		||||
    quadrature_encoder_program_init(pio_QEI, 1, offset, 11, 0);
 | 
			
		||||
        // QEI1 : broche 11 et 12 - pio : pio0, sm : 0, Offset : 0, GPIO 11 et 12, clock div : 0 pour commencer
 | 
			
		||||
        quadrature_encoder_program_init(pio_QEI, 0, offset, 11, 0);
 | 
			
		||||
        // QEI2 : broche 2 et 3 - pio : pio0, sm : 1, Offset : 0, GPIO 2 et 3, clock div : 0 pour commencer
 | 
			
		||||
        quadrature_encoder_program_init(pio_QEI, 1, offset, 2, 0);
 | 
			
		||||
 | 
			
		||||
        QEI_A.value=0;
 | 
			
		||||
        QEI_B.value=0;
 | 
			
		||||
@ -87,11 +74,11 @@ int QEI_get(enum QEI_name_t qei){
 | 
			
		||||
    switch (qei)
 | 
			
		||||
    {
 | 
			
		||||
    case QEI_A_NAME:
 | 
			
		||||
        return -QEI_A.delta;
 | 
			
		||||
        return QEI_A.delta;
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    case QEI_B_NAME:
 | 
			
		||||
        return QEI_B.delta;
 | 
			
		||||
        return -QEI_B.delta;
 | 
			
		||||
        break;
 | 
			
		||||
    
 | 
			
		||||
    default:
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										74
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										74
									
								
								main.c
									
									
									
									
									
								
							@ -5,6 +5,7 @@
 | 
			
		||||
*/
 | 
			
		||||
#include "pico/stdlib.h"
 | 
			
		||||
#include "pico/multicore.h"
 | 
			
		||||
#include "hardware/adc.h"
 | 
			
		||||
#include "hardware/pwm.h"
 | 
			
		||||
#include "Asser_Moteurs.h"
 | 
			
		||||
#include "Moteurs.h"
 | 
			
		||||
@ -13,43 +14,53 @@
 | 
			
		||||
#include "QEI.h"
 | 
			
		||||
 | 
			
		||||
#define LED1PIN 20
 | 
			
		||||
#define M1_SENS1 7
 | 
			
		||||
#define M1_SENS2 13
 | 
			
		||||
#define M1_VITESSE 27 //5B
 | 
			
		||||
#define M2_SENS1 10
 | 
			
		||||
#define M2_SENS2 5
 | 
			
		||||
#define M2_VITESSE 9 //4B
 | 
			
		||||
 | 
			
		||||
void affichage(void);
 | 
			
		||||
void tension_batterie_init(void);
 | 
			
		||||
uint16_t tension_batterie_lire(void);
 | 
			
		||||
 | 
			
		||||
void identifiant_init(void);
 | 
			
		||||
uint identifiant_lire(void);
 | 
			
		||||
 | 
			
		||||
uint32_t step_ms=1;
 | 
			
		||||
float distance1_mm=0, distance2_mm=0;
 | 
			
		||||
 | 
			
		||||
void main(void)
 | 
			
		||||
{
 | 
			
		||||
	int ledpower = 500;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    stdio_init_all();
 | 
			
		||||
	AsserMoteur_Init();
 | 
			
		||||
	Temps_init();
 | 
			
		||||
	tension_batterie_init();
 | 
			
		||||
	identifiant_init();
 | 
			
		||||
	uint32_t temps_ms = Temps_get_temps_ms();
 | 
			
		||||
	uint32_t step_ms=1;
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	gpio_init(LED1PIN);
 | 
			
		||||
	gpio_set_dir(LED1PIN, GPIO_OUT );
 | 
			
		||||
	gpio_put(LED1PIN, 1);
 | 
			
		||||
	AsserMoteur_setConsigne_mm_s(MOTEUR_A, 6000);
 | 
			
		||||
	AsserMoteur_setConsigne_mm_s(MOTEUR_B, 6000);
 | 
			
		||||
	AsserMoteur_setConsigne_mm_s(MOTEUR_A, 100.);
 | 
			
		||||
	AsserMoteur_setConsigne_mm_s(MOTEUR_B, 100.);
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	multicore_launch_core1(affichage);
 | 
			
		||||
	Moteur_SetVitesse(MOTEUR_A, 16000);
 | 
			
		||||
	Moteur_SetVitesse(MOTEUR_B, 16000);
 | 
			
		||||
	Moteur_SetVitesse(MOTEUR_A, 000);
 | 
			
		||||
	Moteur_SetVitesse(MOTEUR_B, 000);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	while(1){
 | 
			
		||||
		
 | 
			
		||||
		if(temps_ms != Temps_get_temps_ms()){
 | 
			
		||||
			temps_ms = Temps_get_temps_ms();
 | 
			
		||||
			if(temps_ms % step_ms == 0){
 | 
			
		||||
				QEI_update();
 | 
			
		||||
				AsserMoteur_Gestion(step_ms);
 | 
			
		||||
			}
 | 
			
		||||
			if(temps_ms % 100 == 0){
 | 
			
		||||
				identifiant_lire();
 | 
			
		||||
				//printf(">c1:%d\n>c2:%d\n", QEI_get(QEI_A_NAME), QEI_get(QEI_B_NAME) );	
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@ -61,11 +72,44 @@ void main(void)
 | 
			
		||||
 | 
			
		||||
void affichage(void){
 | 
			
		||||
	while(1){
 | 
			
		||||
		printf(">c1_mm:%f\n>c2_mm:%f\n", QEI_get_mm(QEI_A_NAME), QEI_get_mm(QEI_B_NAME) );
 | 
			
		||||
		
 | 
			
		||||
		printf(">c1:%d\n>c1_mm:%f\n", QEI_get(QEI_A_NAME), QEI_get_mm(QEI_A_NAME) );
 | 
			
		||||
		//printf(">c2:%d\n>c2_mm:%f\n", QEI_get(QEI_B_NAME), QEI_get_mm(QEI_B_NAME) );
 | 
			
		||||
		printf(">m1:%f\n>m2:%f\n", AsserMoteur_getVitesse_mm_s(MOTEUR_A, 1), AsserMoteur_getVitesse_mm_s(MOTEUR_B, 1) );
 | 
			
		||||
		printf(">m1_c:%f\n>m2_c:%f\n", AsserMoteur_getConsigne_mm_s(MOTEUR_A), AsserMoteur_getConsigne_mm_s(MOTEUR_B) );
 | 
			
		||||
		/*printf(">m1:%f\n>m2:%f\n", AsserMoteur_getVitesse_mm_s(MOTEUR_A, step_ms), AsserMoteur_getVitesse_mm_s(MOTEUR_B, step_ms) );
 | 
			
		||||
		printf(">m1_c:%f\n>m2_c:%f\n", AsserMoteur_getConsigne_mm_s(MOTEUR_A), AsserMoteur_getConsigne_mm_s(MOTEUR_B) );*/
 | 
			
		||||
		sleep_ms(100);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void tension_batterie_init(void){
 | 
			
		||||
	adc_init();
 | 
			
		||||
    adc_gpio_init(28); // Analog_2
 | 
			
		||||
    adc_select_input(2);
 | 
			
		||||
    adc_run(1); // Free running mode
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint16_t tension_batterie_lire(){
 | 
			
		||||
	uint16_t result = (uint16_t) adc_hw->result;
 | 
			
		||||
	const float conversion_factor = 3.3f / (1 << 12);
 | 
			
		||||
	float v_bat = result * conversion_factor * 11.;
 | 
			
		||||
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void identifiant_init(){
 | 
			
		||||
	gpio_init(21);
 | 
			
		||||
	gpio_init(22);
 | 
			
		||||
	gpio_init(26);
 | 
			
		||||
	gpio_pull_up(21);
 | 
			
		||||
	gpio_pull_up(22);
 | 
			
		||||
	gpio_pull_up(26);
 | 
			
		||||
	gpio_set_dir(21, GPIO_IN);
 | 
			
		||||
	gpio_set_dir(22, GPIO_IN);
 | 
			
		||||
	gpio_set_dir(26, GPIO_IN);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// @brief !! Arg la GPIO 26 ne répond pas !
 | 
			
		||||
/// @return 
 | 
			
		||||
uint identifiant_lire(){
 | 
			
		||||
	return (gpio_get(21) << 2)+ (gpio_get(22) << 1) + gpio_get(26);
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user