Bonjour, je rencontre actuellement des problèmes sur mon code au niveau des interruptions pendant la lecture de mes phases ou de cellule de hall. J'obtiens des valeurs aberrantes du style le double de la période, etc...
Si quelqu'un pouvait m'aider à réduire mon code et le stabiliser, merci
#include <SPI.h>//appel de la librairie de communication spi
#include <GD2.h>//appel de la librairie écran
#define SCREEN_WIDTH 800 // Largeur de l'écran
#define SCREEN_HEIGHT 480 // Hauteur de l'écran
// Coordonnées et dimensions du bouton virtuel
#define BUTTON_X 580 // Position X du bouton
#define BUTTON_Y 50 // Position Y du bouton
#define BUTTON_W 130 // Largeur du bouton
#define BUTTON_H 40 // Hauteur du bouton
const int Pmax=110000;
const int Pmin=90000;
//dimmension scrollbar
int scrollbarX = BUTTON_X;
int scrollbarY = BUTTON_Y + BUTTON_H + 30; // Positionnement de la scrollbar sous le bouton avec un petit espace
int scrollbarW = BUTTON_W;
int scrollbarH = 30; // Hauteur de la scrollbar
uint16_t scrollbarVal = 0; // Valeur initiale de la scrollbar
uint16_t scrollbarSize = 10; // Taille du curseur de la scrollbar
uint16_t scrollbarRange = 150; // Range de la scrollbar
// Déclaration des broches pour les signaux
const int Phase1 = 13; // Utilisation de la broche P1_Pin
const int Hall_PulsePin1 = 2; // Utilisation de la broche H1_Pin
const int Phase2 = 12; // Utilisation de la broche P2_Pin
const int Hall_PulsePin2 = 6; // Utilisation de la broche H2_Pin
const int Phase3 = 7; // Utilisation de la broche P3_Pin
const int Hall_PulsePin3 = 8; // Utilisation de la broche H3_Pin
const int Phase1_Fall = 9; // Utilisation de la broche P1_Pin
const int Hall_PulsePin1_Fall = 15; // Utilisation de la broche H1_Pin
const int Phase2_Fall = 3; // Utilisation de la broche P2_Pin
const int Hall_PulsePin2_Fall = 1; // Utilisation de la broche H2_Pin
const int Phase3_Fall = 0; // Utilisation de la broche P3_Pin
const int Hall_PulsePin3_Fall = 11; // Utilisation de la broche H3_Pin
const int SS_PIN = 10; // Déclaration de la broche SS
const int x= 380; //Valeur affichage écran longeur
// Indices de période pour chaque phase
static int periodIndex_Phase1 = 0;
static int periodIndex_Phase2 = 0;
static int periodIndex_Phase3 = 0;
static int periodIndex_Hall1 = 0;
static int periodIndex_Hall2 = 0;
static int periodIndex_Hall3 = 0;
//falling
static int periodIndex_Phase1_fall = 0;
static int periodIndex_Phase2_fall = 0;
static int periodIndex_Phase3_fall = 0;
static int periodIndex_Hall1_fall = 0;
static int periodIndex_Hall2_fall = 0;
static int periodIndex_Hall3_fall = 0;
// Nombre d'éléments stockés dans chaque tableau
int numStored_Phase1 = 0;
int numStored_Phase2 = 0;
int numStored_Phase3 = 0;
int numStored_Hall1 = 0;
int numStored_Hall2 = 0;
int numStored_Hall3 = 0;
//falling
int numStored_Phase1_fall = 0;
int numStored_Phase2_fall = 0;
int numStored_Phase3_fall = 0;
int numStored_Hall1_fall = 0;
int numStored_Hall2_fall = 0;
int numStored_Hall3_fall = 0;
// Périodes des phases
unsigned long period_Hall_1 = 0;
unsigned long period_Hall_2 = 0;
unsigned long period_Hall_3 = 0;
unsigned long period_Phase_1 = 0;
unsigned long period_Phase_2 = 0;
unsigned long period_Phase_3 = 0;
//falling
unsigned long period_Hall_1_fall = 0;
unsigned long period_Hall_2_fall = 0;
unsigned long period_Hall_3_fall = 0;
unsigned long period_Phase_1_fall = 0;
unsigned long period_Phase_2_fall = 0;
unsigned long period_Phase_3_fall = 0;
// Temps de début des impulsions
volatile unsigned long startTime_Phase_1 = 0;
volatile unsigned long stopTime_Phase_1 = 0;
volatile unsigned long startTime_Hall_1 = 0;
volatile unsigned long stopTime_Hall_1 = 0;
volatile unsigned long startTime_Phase_2 = 0;
volatile unsigned long stopTime_Phase_2 = 0;
volatile unsigned long startTime_Hall_2 = 0;
volatile unsigned long stopTime_Hall_2 = 0;
volatile unsigned long startTime_Phase_3 = 0;
volatile unsigned long stopTime_Phase_3 = 0;
volatile unsigned long startTime_Hall_3 = 0;
volatile unsigned long stopTime_Hall_3 = 0;
//temps de début d'impulsions pour front descendant
volatile unsigned long startTime_Phase_1_fall = 0;
volatile unsigned long stopTime_Phase_1_fall = 0;
volatile unsigned long startTime_Hall_1_fall = 0;
volatile unsigned long stopTime_Hall_1_fall = 0;
volatile unsigned long startTime_Phase_2_fall = 0;
volatile unsigned long stopTime_Phase_2_fall = 0;
volatile unsigned long startTime_Hall_2_fall = 0;
volatile unsigned long stopTime_Hall_2_fall = 0;
volatile unsigned long startTime_Phase_3_fall = 0;
volatile unsigned long stopTime_Phase_3_fall = 0;
volatile unsigned long startTime_Hall_3_fall = 0;
volatile unsigned long stopTime_Hall_3_fall = 0;
// Détection des impulsions
volatile bool phase1_detected = false;
volatile bool hall1_detected = false;
volatile bool phase2_detected = false;
volatile bool hall2_detected = false;
volatile bool phase3_detected = false;
volatile bool hall3_detected = false;
//falling
volatile bool phase1_detected_fall = false;
volatile bool hall1_detected_fall = false;
volatile bool phase2_detected_fall = false;
volatile bool hall2_detected_fall = false;
volatile bool phase3_detected_fall = false;
volatile bool hall3_detected_fall = false;
// Déclaration de la constante pour le debounce
const unsigned long debounceDelay = 1000; // 1000 ms en microsecondes
// Déclaration des temps d'interruption pour debounce
volatile unsigned long lastInterruptTime_Phase1 = 0;
volatile unsigned long lastInterruptTime_Phase2 = 0;
volatile unsigned long lastInterruptTime_Phase3 = 0;
volatile unsigned long lastInterruptTime_Phase1_Fall = 0;
volatile unsigned long lastInterruptTime_Phase2_Fall = 0;
volatile unsigned long lastInterruptTime_Phase3_Fall = 0;
// Initialisation de la somme des angles et du compteur d'angles
float minValue1, maxValue1, minValue2, maxValue2, minValue3, maxValue3;
float minValue1_fall, maxValue1_fall, minValue2_fall, maxValue2_fall, minValue3_fall, maxValue3_fall;
float sumAngles, sumAngles_fall;
int angleCount, angleCount_fall;
const int numPeriods = 12; // Exemple, à ajuster selon vos besoins
// Déclarations des tableaux pour les périodes (à définir)
float periods_Hall1[numPeriods], periods_Phase1[numPeriods];
float periods_Hall2[numPeriods], periods_Phase2[numPeriods];
float periods_Hall3[numPeriods], periods_Phase3[numPeriods];
float periods_Hall1_fall[numPeriods], periods_Phase1_fall[numPeriods];
float periods_Hall2_fall[numPeriods], periods_Phase2_fall[numPeriods];
float periods_Hall3_fall[numPeriods], periods_Phase3_fall[numPeriods];
void resetMicrocontroller() { // Fonction pour simuler un reset du microcontrôleur
__disable_irq(); // Désactiver les interruptions
NVIC_SystemReset(); // Effectuer le reset du système
}
void setup() {
GD.begin(); // Initialisation de l'écran
delay(3000); // Attendre 3 secondes avant de commencer la calibration
// Afficher un message avant la calibration
GD.ClearColorRGB(0x000000); // Fond noir
GD.Clear();
GD.cmd_text(400, 240, 31, OPT_CENTER, "Realiser la calibration");
GD.swap(); // Forcer l'affichage du texte
delay(3000); // Attendre 3 secondes pour permettre à l'utilisateur de voir le message
// Lancer la calibration
GD.ClearColorRGB(0xFFFFFF); // Fond blanc
GD.Clear();
GD.cmd_calibrate(); // Exécuter la calibration
GD.swap(); // Forcer l'affichage pendant la calibration
delay(3000); // Attendre 3 secondes après la calibration
// Configuration des broches en entrée
pinMode(Phase1, INPUT);
pinMode(Hall_PulsePin1, INPUT);
pinMode(Phase2, INPUT);
pinMode(Hall_PulsePin2, INPUT);
pinMode(Phase3, INPUT);
pinMode(Hall_PulsePin3, INPUT);
pinMode(Phase1_Fall, INPUT);
pinMode(Hall_PulsePin1_Fall, INPUT);
pinMode(Phase2_Fall, INPUT);
pinMode(Hall_PulsePin2_Fall, INPUT);
pinMode(Phase3_Fall, INPUT);
pinMode(Hall_PulsePin3_Fall, INPUT);
// Initialisation des valeurs minimales et maximales
minValue1 = minValue2 = minValue3 = 360.0;
maxValue1 = maxValue2 = maxValue3 = -360.0;
minValue1_fall = minValue2_fall = minValue3_fall = 360.0;
maxValue1_fall = maxValue2_fall = maxValue3_fall = -360.0;
angleCount = angleCount_fall = 0;
sumAngles = sumAngles_fall = 0.0;
// Démarrage de la communication série
Serial.begin(115200);
// Attachement des interruptions pour détecter les fronts montants
attachInterrupt(digitalPinToInterrupt(Phase1), countPulse_Phase1, RISING);
attachInterrupt(digitalPinToInterrupt(Phase2), countPulse_Phase2, RISING);
attachInterrupt(digitalPinToInterrupt(Phase3), countPulse_Phase3, RISING);
attachInterrupt(digitalPinToInterrupt(Hall_PulsePin1), countPulse_Hall1, RISING);
attachInterrupt(digitalPinToInterrupt(Hall_PulsePin2), countPulse_Hall2, RISING);
attachInterrupt(digitalPinToInterrupt(Hall_PulsePin3), countPulse_Hall3, RISING);
// Attachement des interruptions pour détecter les fronts descendants sur les broches supplémentaires
attachInterrupt(digitalPinToInterrupt(Hall_PulsePin1_Fall), countPulse_Hall1_fall, FALLING);
attachInterrupt(digitalPinToInterrupt(Hall_PulsePin2_Fall), countPulse_Hall2_fall, FALLING);
attachInterrupt(digitalPinToInterrupt(Hall_PulsePin3_Fall), countPulse_Hall3_fall, FALLING);
attachInterrupt(digitalPinToInterrupt(Phase1_Fall), countPulse_Phase1_fall, FALLING);
attachInterrupt(digitalPinToInterrupt(Phase2_Fall), countPulse_Phase2_fall, FALLING);
attachInterrupt(digitalPinToInterrupt(Phase3_Fall), countPulse_Phase3_fall, FALLING);
Serial.print("Programme initialisé");
}
void loop() {
GD.get_inputs(); // Mettre à jour les entrées tactiles
// Détecter la pression du bouton
if (GD.inputs.x != -32768) { // Si un toucher est détecté
int x = GD.inputs.x;
int y = GD.inputs.y;
// Vérifiez si les coordonnées sont dans la zone du bouton
if (x >= BUTTON_X && x <= (BUTTON_X + BUTTON_W) && y >= BUTTON_Y && y <= (BUTTON_Y + BUTTON_H)) {
resetMicrocontroller(); // Réinitialiser la carte
}
// Vérifiez si les coordonnées sont dans la zone de la scrollbar
if (x >= scrollbarX && x <= (scrollbarX + scrollbarW) && y >= scrollbarY && y <= (scrollbarY + scrollbarH)) {
// Calculer la nouvelle valeur de la scrollbar en fonction de la position du toucher
scrollbarVal = map(x, scrollbarX, scrollbarX + scrollbarW, 0, scrollbarRange - scrollbarSize);
// Limiter la valeur de scrollbarVal pour éviter les débordements
scrollbarVal = constrain(scrollbarVal, 0, scrollbarRange - scrollbarSize);
}
}
if (numStored_Hall1 == numPeriods && numStored_Hall2 == numPeriods && numStored_Hall3 == numPeriods && numStored_Phase1 == numPeriods && numStored_Phase2 == numPeriods && numStored_Phase3 == numPeriods && numStored_Hall1_fall == numPeriods && numStored_Hall2_fall == numPeriods && numStored_Hall3_fall == numPeriods && numStored_Phase1_fall == numPeriods && numStored_Phase2_fall == numPeriods && numStored_Phase3_fall == numPeriods) {
calculateAngle();
// Réinitialiser les tableaux après avoir calculé les angles
numStored_Hall1 = 0;
memset(periods_Hall1, 0, sizeof(periods_Hall1));
numStored_Hall2 = 0;
memset(periods_Hall2, 0, sizeof(periods_Hall2));
numStored_Hall3 = 0;
memset(periods_Hall3, 0, sizeof(periods_Hall3));
numStored_Phase1 = 0;
memset(periods_Phase1, 0, sizeof(periods_Phase1));
numStored_Phase2 = 0;
memset(periods_Phase2, 0, sizeof(periods_Phase2));
numStored_Phase3 = 0;
memset(periods_Phase3, 0, sizeof(periods_Phase3));
//falling reset fronts descendants
numStored_Hall1_fall = 0;
memset(periods_Hall1_fall, 0, sizeof(periods_Hall1_fall));
numStored_Hall2_fall = 0;
memset(periods_Hall2_fall, 0, sizeof(periods_Hall2_fall));
numStored_Hall3_fall = 0;
memset(periods_Hall3_fall, 0, sizeof(periods_Hall3_fall));
numStored_Phase1_fall = 0;
memset(periods_Phase1_fall, 0, sizeof(periods_Phase1_fall));
numStored_Phase2_fall = 0;
memset(periods_Phase2_fall, 0, sizeof(periods_Phase2_fall));
numStored_Phase3_fall = 0;
memset(periods_Phase3_fall, 0, sizeof(periods_Phase3_fall));
delay(2000);
}
}
void countPulse_Hall1() {
if (!hall1_detected && phase1_detected) {
// Détection suivante de Hall1, calcul de la période entre les fronts montants
stopTime_Hall_1 = micros();
period_Hall_1 = stopTime_Hall_1 - startTime_Hall_1;
hall1_detected = true;
// Stocker la période détectée dans le tableau correspondant si elle est supérieure à 100000
if (period_Hall_1 >= 100) {
periods_Hall1[periodIndex_Hall1] = period_Hall_1;
periodIndex_Hall1 = (periodIndex_Hall1 + 1) % numPeriods;
if (numStored_Hall1 < numPeriods) {
numStored_Hall1++;
}
}
} else {
hall1_detected = false;
}
}
void countPulse_Hall2() {
if (!hall2_detected && phase2_detected) {
// Détection suivante de Hall2, calcul de la période entre les fronts montants
stopTime_Hall_2 = micros();
period_Hall_2 = stopTime_Hall_2 - startTime_Hall_2;
hall2_detected = true;
// Stocker la période détectée dans le tableau correspondant si elle est supérieure à 100000
if (period_Hall_2 >= 100) {
periods_Hall2[periodIndex_Hall2] = period_Hall_2;
periodIndex_Hall2 = (periodIndex_Hall2 + 1) % numPeriods;
if (numStored_Hall2 < numPeriods) {
numStored_Hall2++;
}
}
} else {
hall2_detected = false;
}
}
void countPulse_Hall3() {
if (!hall3_detected && phase3_detected) {
// Détection suivante de Hall3, calcul de la période entre les fronts montants
stopTime_Hall_3 = micros();
period_Hall_3 = stopTime_Hall_3 - startTime_Hall_3;
hall3_detected = true;
// Stocker la période détectée dans le tableau correspondant si elle est supérieure à 100000
if (period_Hall_3 >= 100) {
periods_Hall3[periodIndex_Hall3] = period_Hall_3;
periodIndex_Hall3 = (periodIndex_Hall3 + 1) % numPeriods;
if (numStored_Hall3 < numPeriods) {
numStored_Hall3++;
}
}
} else {
hall3_detected = false;
}
}
void countPulse_Phase1() {
unsigned long currentTime_1r = micros();
if (currentTime_1r - lastInterruptTime_Phase1 > debounceDelay) {
lastInterruptTime_Phase1 = currentTime_1r;
if (!phase1_detected && !hall1_detected) {
// Première détection de Phase1, démarrage des deux timers
startTime_Phase_1 = micros();
startTime_Hall_1 = micros();
phase1_detected = true;
} else {
// Détection suivante de Phase1, calcul de la période entre les fronts montants
stopTime_Phase_1 = micros();
period_Phase_1 = stopTime_Phase_1 - startTime_Phase_1;
phase1_detected = false;
// Stocker la période détectée dans le tableau correspondant si elle est supérieure à 100000
if (period_Phase_1 >= Pmin && period_Phase_1 <= Pmax) {
periods_Phase1[periodIndex_Phase1] = period_Phase_1;
periodIndex_Phase1 = (periodIndex_Phase1 + 1) % numPeriods;
if (numStored_Phase1 < numPeriods) {
numStored_Phase1++;
}
}
}
}
}
void countPulse_Phase2() {
unsigned long currentTime_2r = micros();
if (currentTime_2r - lastInterruptTime_Phase2 > debounceDelay) {
lastInterruptTime_Phase2 = currentTime_2r;
if (!phase2_detected && !hall2_detected) {
// Première détection de Phase2, démarrage des deux timers
startTime_Phase_2 = micros();
startTime_Hall_2 = micros();
phase2_detected = true;
} else {
// Détection suivante de Phase2, calcul de la période entre les fronts montants
stopTime_Phase_2 = micros();
period_Phase_2 = stopTime_Phase_2 - startTime_Phase_2;
phase2_detected = false;
// Stocker la période détectée dans le tableau correspondant si elle est supérieure à 100000
if (period_Phase_2 >= Pmin && period_Phase_2 <= Pmax) {
periods_Phase2[periodIndex_Phase2] = period_Phase_2;
periodIndex_Phase2 = (periodIndex_Phase2 + 1) % numPeriods;
if (numStored_Phase2 < numPeriods) {
numStored_Phase2++;
}
}
}
}
}
void countPulse_Phase3() {
unsigned long currentTime_3r = micros();
if (currentTime_3r - lastInterruptTime_Phase3 > debounceDelay) {
lastInterruptTime_Phase3 = currentTime_3r;
if (!phase3_detected && !hall3_detected) {
// Première détection de Phase3, démarrage des deux timers
startTime_Phase_3 = micros();
startTime_Hall_3 = micros();
phase3_detected = true;
} else {
// Détection suivante de Phase3, calcul de la période entre les fronts montants
stopTime_Phase_3 = micros();
period_Phase_3 = stopTime_Phase_3 - startTime_Phase_3;
phase3_detected = false;
// Stocker la période détectée dans le tableau correspondant si elle est supérieure à 100000
if (period_Phase_3 >= Pmin && period_Phase_3 <= Pmax) {
periods_Phase3[periodIndex_Phase3] = period_Phase_3;
periodIndex_Phase3 = (periodIndex_Phase3 + 1) % numPeriods;
if (numStored_Phase3 < numPeriods) {
numStored_Phase3++;
}
}
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void countPulse_Hall1_fall() {
if (!hall1_detected_fall && phase1_detected_fall) {
// Détection suivante de Hall1, calcul de la période entre les fronts montants
stopTime_Hall_1_fall = micros();
period_Hall_1_fall = stopTime_Hall_1_fall - startTime_Hall_1_fall;
hall1_detected_fall = true;
// Stocker la période détectée dans le tableau correspondant si elle est supérieure à 100000
if (period_Hall_1_fall >= 10) {
periods_Hall1_fall[periodIndex_Hall1_fall] = period_Hall_1_fall;
periodIndex_Hall1_fall = (periodIndex_Hall1_fall + 1) % numPeriods;
if (numStored_Hall1_fall < numPeriods) {
numStored_Hall1_fall++;
}
}
} else {
hall1_detected_fall = false;
}
}
void countPulse_Hall2_fall() {
if (!hall2_detected_fall && phase2_detected_fall) {
// Détection suivante de Hall2, calcul de la période entre les fronts montants
stopTime_Hall_2_fall = micros();
period_Hall_2_fall = stopTime_Hall_2_fall - startTime_Hall_2_fall;
hall2_detected_fall = true;
// Stocker la période détectée dans le tableau correspondant si elle est supérieure à 100000
if (period_Hall_2_fall >= 10) {
periods_Hall2_fall[periodIndex_Hall2_fall] = period_Hall_2_fall;
periodIndex_Hall2_fall = (periodIndex_Hall2_fall + 1) % numPeriods;
if (numStored_Hall2_fall < numPeriods) {
numStored_Hall2_fall++;
}
}
} else {
hall2_detected_fall = false;
}
}
void countPulse_Hall3_fall() {
if (!hall3_detected_fall && phase3_detected_fall) {
// Détection suivante de Hall3, calcul de la période entre les fronts montants
stopTime_Hall_3_fall = micros();
period_Hall_3_fall = stopTime_Hall_3_fall - startTime_Hall_3_fall;
hall3_detected_fall = true;
// Stocker la période détectée dans le tableau correspondant si elle est supérieure à 100000
if (period_Hall_3_fall >= 10) {
periods_Hall3_fall[periodIndex_Hall3_fall] = period_Hall_3_fall;
periodIndex_Hall3_fall = (periodIndex_Hall3_fall + 1) % numPeriods;
if (numStored_Hall3_fall < numPeriods) {
numStored_Hall3_fall++;
}
}
} else {
hall3_detected_fall = false;
}
}
void countPulse_Phase1_fall() {
unsigned long currentTime_1f = micros();
if (currentTime_1f - lastInterruptTime_Phase1_Fall > debounceDelay) {
lastInterruptTime_Phase1_Fall = currentTime_1f;
if (!phase1_detected_fall && !hall1_detected_fall) {
// Première détection de Phase1, démarrage des deux timers
startTime_Phase_1_fall = micros();
startTime_Hall_1_fall = micros();
phase1_detected_fall = true;
} else {
// Détection suivante de Phase1, calcul de la période entre les fronts montants
stopTime_Phase_1_fall = micros();
period_Phase_1_fall = stopTime_Phase_1_fall - startTime_Phase_1_fall;
phase1_detected_fall = false;
// Stocker la période détectée dans le tableau correspondant si elle est supérieure à 100000
if (period_Phase_1_fall >= Pmin && period_Phase_1_fall <= Pmax) {
periods_Phase1_fall[periodIndex_Phase1_fall] = period_Phase_1_fall;
periodIndex_Phase1_fall = (periodIndex_Phase1_fall + 1) % numPeriods;
if (numStored_Phase1_fall < numPeriods) {
numStored_Phase1_fall++;
}
}
}
}
}
void countPulse_Phase2_fall() {
unsigned long currentTime_2f = micros();
if (currentTime_2f - lastInterruptTime_Phase2_Fall > debounceDelay) {
lastInterruptTime_Phase2_Fall = currentTime_2f;
if (!phase2_detected_fall && !hall2_detected_fall) {
// Première détection de Phase2, démarrage des deux timers
startTime_Phase_2_fall = micros();
startTime_Hall_2_fall = micros();
phase2_detected_fall = true;
} else {
// Détection suivante de Phase2, calcul de la période entre les fronts montants
stopTime_Phase_2_fall = micros();
period_Phase_2_fall = stopTime_Phase_2_fall - startTime_Phase_2_fall;
phase2_detected_fall = false;
// Validation de la période détectée
if (period_Phase_2_fall >= Pmin && period_Phase_2_fall <= Pmax ) {
periods_Phase2_fall[periodIndex_Phase2_fall] = period_Phase_2_fall;
periodIndex_Phase2_fall = (periodIndex_Phase2_fall + 1) % numPeriods;
if (numStored_Phase2_fall < numPeriods) {
numStored_Phase2_fall++;
}
}
}
}
}
void countPulse_Phase3_fall() {
unsigned long currentTime_3f = micros();
if (currentTime_3f - lastInterruptTime_Phase3_Fall > debounceDelay) {
lastInterruptTime_Phase3_Fall = currentTime_3f;
if (!phase3_detected_fall && !hall3_detected_fall) {
// Première détection de Phase3, démarrage des deux timers
startTime_Phase_3_fall = micros();
startTime_Hall_3_fall = micros();
phase3_detected_fall = true;
} else {
// Détection suivante de Phase3, calcul de la période entre les fronts montants
stopTime_Phase_3_fall = micros();
period_Phase_3_fall = stopTime_Phase_3_fall - startTime_Phase_3_fall;
phase3_detected_fall = false;
// Stocker la période détectée dans le tableau correspondant si elle est supérieure à 100000
if (period_Phase_3_fall >= Pmin && period_Phase_3_fall <= Pmax ) {
periods_Phase3_fall[periodIndex_Phase3_fall] = period_Phase_3_fall;
periodIndex_Phase3_fall = (periodIndex_Phase3_fall + 1) % numPeriods;
if (numStored_Phase3_fall < numPeriods) {
numStored_Phase3_fall++;
}
}
}
}
}
void calculateAngle() {
GD.ClearColorRGB(0x000000);
GD.Clear();
int y = 10; // Position de départ sur l'écran pour l'affichage
for (int i = 0; i < numPeriods; ++i) {
// Calcul des angles pour le front montant
float angle_phase1 = (static_cast<float>(periods_Hall1[i]) / periods_Phase1[i]) * 360;
float angle_phase2 = (static_cast<float>(periods_Hall2[i]) / periods_Phase2[i]) * 360;
float angle_phase3 = (static_cast<float>(periods_Hall3[i]) / periods_Phase3[i]) * 360;
angle_phase1 = angle_phase1 >= 180 ? angle_phase1 - 360 : angle_phase1;
angle_phase2 = angle_phase2 >= 180 ? angle_phase2 - 360 : angle_phase2;
angle_phase3 = angle_phase3 >= 180 ? angle_phase3 - 360 : angle_phase3;
// Compute absolute values for averaging
float abs_angle_phase1 = abs(angle_phase1);
float abs_angle_phase2 = abs(angle_phase2);
float abs_angle_phase3 = abs(angle_phase3);
// Mise à jour des valeurs minimales et maximales pour chaque angle
if (angleCount == 0) {
minValue1 = maxValue1 = angle_phase1;
minValue2 = maxValue2 = angle_phase2;
minValue3 = maxValue3 = angle_phase3;
} else {
minValue1 = min(minValue1, angle_phase1);
maxValue1 = max(maxValue1, angle_phase1);
minValue2 = min(minValue2, angle_phase2);
maxValue2 = max(maxValue2, angle_phase2);
minValue3 = min(minValue3, angle_phase3);
maxValue3 = max(maxValue3, angle_phase3);
}
// Ajouter l'angle à la somme et incrémenter le compteur d'angles
sumAngles += abs_angle_phase1 + abs_angle_phase2 + abs_angle_phase3;
angleCount++;
if (angleCount == numPeriods) {
GD.cmd_text(10, y, 28, 0, "_____Front_Montant_____");
y += 30;
// Calculer la moyenne des angles en utilisant les valeurs absolues
float moyenneAngle = sumAngles / (3 * numPeriods); // Il y a 3 angles par période
GD.cmd_text(10, y, 28, 0, "Moyenne des angles : ");
GD.cmd_text(x, y, 28, 0, String(moyenneAngle).c_str());
y += 30;
GD.cmd_text(10, y, 28, 0, "Valeur minimale pour Hall1-Phase1 : ");
GD.cmd_text(x, y, 28, 0, String(minValue1).c_str());
y += 30;
GD.cmd_text(10, y, 28, 0, "Valeur maximale pour Hall1-Phase1 : ");
GD.cmd_text(x, y, 28, 0, String(maxValue1).c_str());
y += 30;
GD.cmd_text(10, y, 28, 0, "Valeur minimale pour Hall2-Phase2 : ");
GD.cmd_text(x, y, 28, 0, String(minValue2).c_str());
y += 30;
GD.cmd_text(10, y, 28, 0, "Valeur maximale pour Hall2-Phase2 : ");
GD.cmd_text(x, y, 28, 0, String(maxValue2).c_str());
y += 30;
GD.cmd_text(10, y, 28, 0, "Valeur minimale pour Hall3-Phase3 : ");
GD.cmd_text(x, y, 28, 0, String(minValue3).c_str());
y += 30;
GD.cmd_text(10, y, 28, 0, "Valeur maximale pour Hall3-Phase3 : ");
GD.cmd_text(x, y, 28, 0, String(maxValue3).c_str());
y += 30;
// Réinitialiser la somme et le compteur
sumAngles = 0;
angleCount = 0;
}
}
// Deuxième boucle pour le front descendant
for (int i = 0; i < numPeriods; ++i) {
// Calcul des angles pour le front descendant
float angle_phase1_fall = (static_cast<float>(periods_Hall1_fall[i]) / periods_Phase1_fall[i]) * 360;
float angle_phase2_fall = (static_cast<float>(periods_Hall2_fall[i]) / periods_Phase2_fall[i]) * 360;
float angle_phase3_fall = (static_cast<float>(periods_Hall3_fall[i]) / periods_Phase3_fall[i]) * 360;
angle_phase1_fall = angle_phase1_fall >= 180 ? angle_phase1_fall - 360 : angle_phase1_fall;
angle_phase2_fall = angle_phase2_fall >= 180 ? angle_phase2_fall - 360 : angle_phase2_fall;
angle_phase3_fall = angle_phase3_fall >= 180 ? angle_phase3_fall - 360 : angle_phase3_fall;
// Compute absolute values for averaging
float abs_angle_phase1_fall = abs(angle_phase1_fall);
float abs_angle_phase2_fall = abs(angle_phase2_fall);
float abs_angle_phase3_fall = abs(angle_phase3_fall);
// Mise à jour des valeurs minimales et maximales pour chaque angle
if (angleCount_fall == 0) {
minValue1_fall = maxValue1_fall = angle_phase1_fall;
minValue2_fall = maxValue2_fall = angle_phase2_fall;
minValue3_fall = maxValue3_fall = angle_phase3_fall;
} else {
minValue1_fall = min(minValue1_fall, angle_phase1_fall);
maxValue1_fall = max(maxValue1_fall, angle_phase1_fall);
minValue2_fall = min(minValue2_fall, angle_phase2_fall);
maxValue2_fall = max(maxValue2_fall, angle_phase2_fall);
minValue3_fall = min(minValue3_fall, angle_phase3_fall);
maxValue3_fall = max(maxValue3_fall, angle_phase3_fall);
}
// Ajouter l'angle à la somme et incrémenter le compteur d'angles
sumAngles_fall += abs_angle_phase1_fall + abs_angle_phase2_fall + abs_angle_phase3_fall;
angleCount_fall++;
if (angleCount_fall == numPeriods) {
GD.cmd_text(10, y, 28, 0, "____Front_Descendant____");
y += 30;
// Calculer la moyenne des angles en utilisant les valeurs absolues
float moyenneAngle_fall = sumAngles_fall / (3 * numPeriods); // Il y a 3 angles par période
GD.cmd_text(10, y, 28, 0, "Moyenne des angles : ");
GD.cmd_text(x, y, 28, 0, String(moyenneAngle_fall).c_str());
y += 30;
GD.cmd_text(10, y, 28, 0, "Valeur minimale pour Hall1-Phase1 : ");
GD.cmd_text(x, y, 28, 0, String(minValue1_fall).c_str());
y += 30;
GD.cmd_text(10, y, 28, 0, "Valeur maximale pour Hall1-Phase1 : ");
GD.cmd_text(x, y, 28, 0, String(maxValue1_fall).c_str());
y += 30;
GD.cmd_text(10, y, 28, 0, "Valeur minimale pour Hall2-Phase2 : ");
GD.cmd_text(x, y, 28, 0, String(minValue2_fall).c_str());
y += 30;
GD.cmd_text(10, y, 28, 0, "Valeur maximale pour Hall2-Phase2 : ");
GD.cmd_text(x, y, 28, 0, String(maxValue2_fall).c_str());
y += 30;
GD.cmd_text(10, y, 28, 0, "Valeur minimale pour Hall3-Phase3 : ");
GD.cmd_text(x, y, 28, 0, String(minValue3_fall).c_str());
y += 30;
GD.cmd_text(10, y, 28, 0, "Valeur maximale pour Hall3-Phase3 : ");
GD.cmd_text(x, y, 28, 0, String(maxValue3_fall).c_str());
y += 30;
// Réinitialiser la somme et le compteur
sumAngles_fall = 0;
angleCount_fall = 0;
}
}
// Dessiner le bouton
GD.ColorRGB(0x00FF00); // Couleur verte pour le bouton
GD.Begin(RECTS);
GD.Vertex2f(BUTTON_X * 16, BUTTON_Y * 16); // Multiplication par 16 pour la précision
GD.Vertex2f((BUTTON_X + BUTTON_W) * 16, (BUTTON_Y + BUTTON_H) * 16);
GD.End();
GD.ColorRGB(0x000000); // Couleur du texte
GD.cmd_text(BUTTON_X + BUTTON_W / 2, BUTTON_Y + BUTTON_H / 2, 31, OPT_CENTER, "Reset");
GD.swap(); // Afficher tout sur l'écran
}


