2022-11-18 14:16:13 +00:00
|
|
|
#include "QEI.h"
|
2022-11-20 12:13:14 +00:00
|
|
|
#include "Moteurs.h"
|
2022-12-01 21:47:51 +00:00
|
|
|
#include "Asser_Moteurs.h"
|
2022-11-18 14:16:13 +00:00
|
|
|
|
2022-11-28 19:49:55 +00:00
|
|
|
/*** C'est ici que se fait la conversion en mm
|
2022-11-18 14:16:13 +00:00
|
|
|
* ***/
|
|
|
|
|
|
|
|
// 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)
|
2022-11-28 19:49:55 +00:00
|
|
|
#define ASSERMOTEUR_GAIN_P 160
|
|
|
|
#define ASSERMOTEUR_GAIN_I .80f
|
2022-11-18 14:16:13 +00:00
|
|
|
|
2023-04-28 21:51:43 +00:00
|
|
|
float consigne_mm_s[3]; // Consigne de vitesse (en mm/s)
|
|
|
|
float commande_I[3]; // Terme integral
|
2022-11-18 14:16:13 +00:00
|
|
|
|
2022-11-28 19:49:55 +00:00
|
|
|
void AsserMoteur_Init(){
|
|
|
|
for(unsigned int i =0; i< 3; i ++){
|
|
|
|
commande_I[i]=0;
|
|
|
|
consigne_mm_s[i]=0;
|
|
|
|
}
|
|
|
|
}
|
2022-11-18 14:16:13 +00:00
|
|
|
|
2022-12-08 19:25:36 +00:00
|
|
|
/// @brief Défini une consigne de vitesse pour le moteur indiqué.
|
|
|
|
/// @param moteur : Moteur à asservir
|
|
|
|
/// @param _consigne_mm_s : consigne de vitesse en mm/s
|
2023-04-28 21:51:43 +00:00
|
|
|
void AsserMoteur_setConsigne_mm_s(enum t_moteur moteur, float _consigne_mm_s){
|
2022-11-18 14:16:13 +00:00
|
|
|
consigne_mm_s[moteur] = _consigne_mm_s;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2023-03-01 19:51:04 +00:00
|
|
|
/// @brief Envoie la consigne du moteur
|
|
|
|
/// @param moteur : Moteur à asservir
|
2023-04-28 21:51:43 +00:00
|
|
|
float AsserMoteur_getConsigne_mm_s(enum t_moteur moteur){
|
2023-03-01 19:51:04 +00:00
|
|
|
return consigne_mm_s[moteur];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-04-28 21:51:43 +00:00
|
|
|
float AsserMoteur_getVitesse_mm_s(enum t_moteur moteur, int step_ms){
|
2022-11-20 12:13:14 +00:00
|
|
|
enum QEI_name_t qei;
|
2023-04-28 21:51:43 +00:00
|
|
|
float distance, temps;
|
2022-11-20 12:13:14 +00:00
|
|
|
switch (moteur)
|
|
|
|
{
|
|
|
|
case MOTEUR_A: qei = QEI_A_NAME; break;
|
|
|
|
case MOTEUR_B: qei = QEI_B_NAME; break;
|
|
|
|
case MOTEUR_C: qei = QEI_C_NAME; break;
|
|
|
|
|
|
|
|
default: break;
|
|
|
|
}
|
2022-12-01 21:47:51 +00:00
|
|
|
distance = QEI_get_mm(qei);
|
2023-04-28 21:51:43 +00:00
|
|
|
temps = step_ms / 1000.0f;
|
2022-11-28 19:49:55 +00:00
|
|
|
|
|
|
|
return distance / temps;
|
2022-11-18 14:16:13 +00:00
|
|
|
}
|
|
|
|
|
2023-05-13 21:03:23 +00:00
|
|
|
/// @brief Indique si le robot est à l'arrêt
|
|
|
|
/// @param step_ms : pas de temps (utilisé pour déterminer les vitesses)
|
|
|
|
/// @return 1 si le robot est immobile, 0 s'il est en mouvement.
|
|
|
|
uint32_t AsserMoteur_RobotImmobile(int step_ms){
|
|
|
|
const float seuil_vitesse_immobile_mm_s = 0.1;
|
|
|
|
if(AsserMoteur_getVitesse_mm_s(MOTEUR_A, step_ms) < seuil_vitesse_immobile_mm_s &&
|
|
|
|
AsserMoteur_getVitesse_mm_s(MOTEUR_B, step_ms) < seuil_vitesse_immobile_mm_s &&
|
|
|
|
AsserMoteur_getVitesse_mm_s(MOTEUR_C, step_ms) < seuil_vitesse_immobile_mm_s ){
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2022-12-08 19:25:36 +00:00
|
|
|
/// @brief Fonction d'asservissement des moteurs, à appeler périodiquement
|
|
|
|
/// @param step_ms
|
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++ ){
|
2023-04-28 21:51:43 +00:00
|
|
|
float erreur; // Erreur entre la consigne et la vitesse actuelle
|
|
|
|
float commande_P; // Terme proportionnel
|
|
|
|
float commande;
|
2022-11-18 14:16:13 +00:00
|
|
|
|
|
|
|
// Calcul de l'erreur
|
2022-11-28 19:49:55 +00:00
|
|
|
erreur = consigne_mm_s[moteur] - AsserMoteur_getVitesse_mm_s(moteur, step_ms);
|
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
|
|
|
|
2022-11-28 19:49:55 +00:00
|
|
|
//Saturation de la commande
|
|
|
|
if(commande > 32760) {commande = 32760;}
|
|
|
|
if(commande < -32760) {commande = -32760;}
|
|
|
|
|
2022-11-18 14:16:13 +00:00
|
|
|
Moteur_SetVitesse(moteur, commande);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|