En lisant les encodeurs à intervalles réguliers, calcule la vitesse de chaque roue en « ticks par seconde ».
Solution :
#include <stdio.h>
#include <stdint.h>
/* Variables globales pour mémoriser le dernier état */
int16_t dernier_enc = 0;
int64_t dernier_temps = 0;
/* Simule le temps système en ms (remplace k_uptime_get()) */
int64_t temps_courant_ms = 0;
int calculerVitesse(int16_t encodeur_actuel)
{
int64_t temps_actuel = temps_courant_ms;
int delta_enc = encodeur_actuel - dernier_enc;
int64_t delta_temps = temps_actuel - dernier_temps;
dernier_enc = encodeur_actuel;
dernier_temps = temps_actuel;
if (delta_temps > 0) {
/* Vitesse en ticks par seconde */
return (int)((delta_enc * 1000) / delta_temps);
}
return 0;
}
int main(void)
{
/* Lecture initiale (t=0, enc=0) — initialise les variables */
temps_courant_ms = 0;
calculerVitesse(0);
/* t=50 ms, encodeur à 5 ticks => 100 ticks/s */
temps_courant_ms = 50;
printf("t=50ms enc=5 -> Vitesse: %d ticks/s\n",
calculerVitesse(5));
/* t=100 ms, encodeur à 12 ticks => 140 ticks/s */
temps_courant_ms = 100;
printf("t=100ms enc=12 -> Vitesse: %d ticks/s\n",
calculerVitesse(12));
/* t=150 ms, encodeur à 12 ticks (robot arrêté) => 0 ticks/s */
temps_courant_ms = 150;
printf("t=150ms enc=12 -> Vitesse: %d ticks/s\n",
calculerVitesse(12));
return 0;
}
Solution copiée dans l'éditeur.