Code de contrôle basic des moteurs - non testé
This commit is contained in:
		
							parent
							
								
									43ce3e231a
								
							
						
					
					
						commit
						c02b3ef667
					
				| @ -16,6 +16,8 @@ Servomoteur.c | ||||
| gyro_L3GD20H.c | ||||
| gyro_ADXRS453.c | ||||
| QEI.c | ||||
| APDS_9960.c | ||||
| Moteurs.c | ||||
| ) | ||||
| 
 | ||||
| pico_generate_pio_header(test ${CMAKE_CURRENT_LIST_DIR}/quadrature_encoder.pio) | ||||
|  | ||||
							
								
								
									
										98
									
								
								Moteurs.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								Moteurs.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,98 @@ | ||||
| #include "hardware/pwm.h" | ||||
| #include "Moteurs.h" | ||||
| 
 | ||||
| #define MOTEUR_A 0 | ||||
| #define MOTEUR_B 1 | ||||
| #define MOTEUR_C 2 | ||||
| 
 | ||||
| #define MOTEUR_A_VITESSE 6 | ||||
| #define MOTEUR_B_VITESSE 8 | ||||
| #define MOTEUR_C_VITESSE 10 | ||||
| 
 | ||||
| #define MOTEUR_A_SENS 5 | ||||
| #define MOTEUR_B_SENS 7 | ||||
| #define MOTEUR_C_SENS 9 | ||||
| 
 | ||||
| uint slice_moteur_A, slice_moteur_B, slice_moteur_C; | ||||
| 
 | ||||
| 
 | ||||
| void Moteur_Init(){ | ||||
|     // Initialisation des broches pour les PWM
 | ||||
|     gpio_set_function(MOTEUR_A_VITESSE, GPIO_FUNC_PWM); | ||||
|     gpio_set_function(MOTEUR_B_VITESSE, GPIO_FUNC_PWM); | ||||
|     gpio_set_function(MOTEUR_C_VITESSE, GPIO_FUNC_PWM); | ||||
| 
 | ||||
|     // Initialisation des broches pour les sens
 | ||||
|     gpio_init(MOTEUR_A_SENS); | ||||
|     gpio_init(MOTEUR_B_SENS); | ||||
|     gpio_init(MOTEUR_C_SENS); | ||||
|     gpio_set_dir(MOTEUR_A_SENS, true); | ||||
|     gpio_set_dir(MOTEUR_B_SENS, true); | ||||
|     gpio_set_dir(MOTEUR_C_SENS, true); | ||||
| 
 | ||||
|     // Configuration des PWM à 1 kHz
 | ||||
|     // Clock_system 125 MHz - 16 bits PWM (65536)
 | ||||
|     // Donc si on veut profiter de toute la résolution du PWM,
 | ||||
|     // il faut une fréquence d'entrée à 65,536 MHz
 | ||||
|     // Soit un diviseur de 2 (apprximativement)
 | ||||
| 
 | ||||
|     slice_moteur_A = pwm_gpio_to_slice_num(MOTEUR_A_VITESSE); // GPIO6  -> PWM 3A (voir RP2040 Datasheet 4.5.2)
 | ||||
|     slice_moteur_B = pwm_gpio_to_slice_num(MOTEUR_B_VITESSE); // GPIO8  -> PWM 4A
 | ||||
|     slice_moteur_C = pwm_gpio_to_slice_num(MOTEUR_C_VITESSE); // GPIO10 -> PWM 5A
 | ||||
| 
 | ||||
|     pwm_config pwm_moteur = pwm_get_default_config(); | ||||
| 
 | ||||
|     pwm_config_set_clkdiv_int(&pwm_moteur, 2);  | ||||
|     pwm_config_set_phase_correct(&pwm_moteur, false); | ||||
|     pwm_config_set_wrap(&pwm_moteur, 65635); | ||||
| 
 | ||||
|     pwm_init(slice_moteur_A, &pwm_moteur, true); | ||||
|     pwm_init(slice_moteur_B, &pwm_moteur, true); | ||||
|     pwm_init(slice_moteur_C, &pwm_moteur, true); | ||||
| 
 | ||||
|     Moteur_set_vitesse(MOTEUR_A, 0); | ||||
|     Moteur_set_vitesse(MOTEUR_B, 0); | ||||
|     Moteur_set_vitesse(MOTEUR_C, 0); | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| Moteur_set_vitesse(enum t_moteur moteur, int16 vitesse){ | ||||
|     uint16 u_vitesse; | ||||
| 
 | ||||
|     // Le PWM accepte 16 bits de résolution, on se remet sur 16 bits (et non sur 15 + signe)
 | ||||
|     if (vitesse < 0){ | ||||
|         u_vitesse = -vitesse; | ||||
|     } | ||||
|     u_vitesse = vitesse * 2; | ||||
| 
 | ||||
|     switch(moteur){ | ||||
|         case MOTEUR_A: | ||||
|             pwm_set_chan_level(slice_moteur_A, PWM_CHAN_A, u_vitesse); | ||||
|             if(vitesse < 0){ | ||||
|                 gpio_put(MOTEUR_A_SENS, false); | ||||
|             }else{ | ||||
|                 gpio_put(MOTEUR_A_SENS, true); | ||||
|             } | ||||
|             break; | ||||
| 
 | ||||
|         case MOTEUR_B: | ||||
|             pwm_set_chan_level(slice_moteur_B, PWM_CHAN_A, u_vitesse); | ||||
|             if(vitesse < 0){ | ||||
|                 gpio_put(MOTEUR_B_SENS, false); | ||||
|             }else{ | ||||
|                 gpio_put(MOTEUR_B_SENS, true); | ||||
|             } | ||||
|             break; | ||||
| 
 | ||||
|         case MOTEUR_C: | ||||
|             pwm_set_chan_level(slice_moteur_C, PWM_CHAN_A, u_vitesse); | ||||
|             if(vitesse < 0){ | ||||
|                 gpio_put(MOTEUR_B_SENS, false); | ||||
|             }else{ | ||||
|                 gpio_put(MOTEUR_B_SENS, true); | ||||
|             } | ||||
|             break; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user