RPiPico-Holonome2023/Asser_Moteurs.c

53 lines
1.5 KiB
C
Raw Normal View History

2022-11-18 14:16:13 +00:00
#include "QEI.h"
/*** C'est ici que ce 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 (42.44f)
#define ASSERMOTEUR_GAIN_P 20
#define ASSERMOTEUR_GAIN_I 0.0f
double consigne_mm_s[3]; // Consigne de vitesse (en mm/s)
double commande_I[3]; // Terme integral
2022-11-18 14:23:40 +00:00
void AsserMoteur_setConsigne_mm_s(enum t_moteur moteur, double _consigne_mm_s){
2022-11-18 14:16:13 +00:00
consigne_mm_s[moteur] = _consigne_mm_s;
}
2022-11-18 14:23:40 +00:00
double AsserMoteur_getVitesse_mm_s(enum t_moteur moteur){
2022-11-18 14:16:13 +00:00
return (double) QEI_get(moteur) * (double)IMPULSION_PAR_MM;
}
2022-11-18 14:23:40 +00:00
void AsserMoteur_Gestion(int step_ms){
2022-11-18 14:16:13 +00:00
// Pour chaque moteur
2022-11-18 14:23:40 +00:00
for(uint moteur=MOTEUR_A; moteur<MOTEUR_C+1; moteur++ ){
2022-11-18 14:16:13 +00:00
double erreur; // Erreur entre la consigne et la vitesse actuelle
double commande_P; // Terme proportionnel
double commande;
// Calcul de l'erreur
2022-11-18 14:23:40 +00:00
erreur = consigne_mm_s[moteur] - AsserMoteur_getVitesse_mm_s(moteur);
2022-11-18 14:16:13 +00:00
// Calcul du terme propotionnel
commande_P = erreur * ASSERMOTEUR_GAIN_P;
// Calcul du terme integral
commande_I[moteur] = commande_I[moteur] + (erreur * ASSERMOTEUR_GAIN_I * step_ms);
2022-11-18 14:23:40 +00:00
commande = commande_P + commande_I[moteur];
2022-11-18 14:16:13 +00:00
Moteur_SetVitesse(moteur, commande);
}
}