IniSat Modèle 1 Version 2 TP 3 : Gestion des données Exo 1 : Lecture tension batterie Exo 2 : Lecture courants faces solaires Exo 3 : Modes de fonctionnement
Revision 0:5cee4b7380b2, committed 2021-07-06
- Comitter:
- Giamarchi
- Date:
- Tue Jul 06 12:47:20 2021 +0000
- Commit message:
- Revision
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Jul 06 12:47:20 2021 +0000 @@ -0,0 +1,121 @@ +/******************************************************************************* + Université de Montpellier + NemoSpace IUT de Nîmes + IniSat Modèle 1 Version 2 +*******************************************************************************/ +// TP n°3 : Correction + +// Exo 1 : Lecture tension batterie +// Exo 2 : Lecture courants faces solaires +// Exo 3 : Modes de fonctionnement + +#include "mbed.h" +#include "platform/mbed_thread.h" +#include "system.h" +#include "user.h" + +uint8_t etat, etat_mem; +uint16_t compteur; +float mes_accu; + +int main() +{ + + Init_System(); + etat = 0; + + while (1) { + thread_sleep_for(1); // Boucle toutes les 1 milliseconde environ + compteur++; +// Gestion des modes avec une machine d'états + switch (etat) { +/******************************************************************************/ +// Mode Init : Mise sous tension +// Initialisation du µC + case 0: + Init_User_Fonctions(); + etat = 1; + Set_Led(Ve); + thread_sleep_for(3000); + break; +/******************************************************************************/ +// Mode Gestion : Gestion des actions +// Contrôle du système + case 1: + mes_accu = Mes_Bat(); + if(mes_accu < BAT_SEUIL_BAS_1) { + etat = 4; + Set_Led(Ro); + } else { + etat = 2; + Set_Led(Ve); + } + thread_sleep_for(1000); + break; +/******************************************************************************/ +// Mode Mission : Acquisition de données +// Mesure Batterie +// Mesure Courant faces solaires +// Stockage + case 2: + Mes_Bat(); + Mes_SP(); + if(mes_accu > BAT_SEUIL_HAUT_1) + { + etat = 3; + Set_Led(Ro_Ve); + } else + { + etat = 1; + } + thread_sleep_for(1000); + break; +/******************************************************************************/ +// Mode Radio : Transmission de données +// Mise en forme pour affichage + case 3: + Envoi_Mes_Bat(); + Envoi_Mes_SP(); + etat = 1; + thread_sleep_for(1000); + break; +/******************************************************************************/ +// Mode Survie : Attente recharge de l'accu + + case 4: + mes_accu = Mes_Bat(); + if(mes_accu < BAT_SEUIL_BAS_2) { + etat = 5; + Stop_User_Fonctions(); + } + + if(mes_accu > BAT_SEUIL_HAUT_1) { + etat = 1; + Set_Led(Ve); + } + break; +/******************************************************************************/ +// Mode Zombie : Coupure des consommateurs +// Passage en mode faible consommation +// Diminution de la fréquence du CPU +// Passage en mode Sleep + case 5: + sleep(); + mes_accu = Mes_Bat(); + if(mes_accu > BAT_SEUIL_HAUT_1) + etat = 0; + break; +/******************************************************************************/ + default: + etat = 0; + break; +/******************************************************************************/ + } // end switch + if(etat != etat_mem) // Debug des états + { + pc.printf("Etat_%d\r\n",etat); + etat_mem = etat; + } + } // end while +} // end main +/******************************************************************************/ \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-os.lib Tue Jul 06 12:47:20 2021 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/mbed-os/#cf4f12a123c05fcae83fc56d76442015cb8a39e9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/system.h Tue Jul 06 12:47:20 2021 +0000 @@ -0,0 +1,26 @@ +/******************************************************************************* + system.h -> fichier de configuration + + Lignes en Entrées/Sorties + Lignes en Entrées analogiques + Lignes associées aux bus (série, I2C, SPI) +*******************************************************************************/ + +Serial pc(USBTX, USBRX); // Dialogue UART par USB à 9600 Baud sur carte Nucléo + +//DigitalOut DEL(LED1); // Ligne PB_3 sur la carte Nucléo +DigitalOut DEL_R(PB_0); // DEL rouge sur carte CPU +DigitalOut DEL_V(PB_1); // DEL verte sur carte CPU + +DigitalOut ctrl_reg(PA_12); // Controle du régulateur 3.3V sur carte EPS + +AnalogIn batin(PA_0); // Mesure tension batterie sur carte EPS +AnalogIn sp_1in(PA_6); // Mesure courant Solar Panel 1 sur carte EPS +AnalogIn sp_2in(PA_5); // Mesure courant Solar Panel 2 sur carte EPS + +// Divers seuils pour la batterie +#define BAT_SEUIL_HAUT_2 4.2f +#define BAT_SEUIL_HAUT_1 3.9f +#define BAT_SEUIL_BAS_1 3.5f +#define BAT_SEUIL_BAS_2 3.3f +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/user.h Tue Jul 06 12:47:20 2021 +0000 @@ -0,0 +1,102 @@ +/******************************************************************************* + user.h -> fichier de fonctions + + Gestion des 2 DELs de la carte CPU + Mesure tension batterie + Mesure courant panneaux solaires +*******************************************************************************/ +// Initialistion du µC, Tests divers +/** +* @param null +*/ +void Init_System(void) { +// Hello World + pc.printf("\r\nIniSat V2 : TP3\r\n\n"); + +// Test de l'horloge Systeme +// pc.printf("Horloge CPU a %d Hz\r\n", SystemCoreClock); +} +/******************************************************************************/ +// Gestion des 2 Dels de la carte CPU +Ticker Compteur_Led; +uint16_t cmpt_led; +uint8_t etat_led; +enum {Off, Ro, Ve, Ro_Ve} couleur; + +void Tache_Cmpt_Led(void) { + cmpt_led++; + if(cmpt_led >= 100) { // Période : 1 sec + cmpt_led = 0; + DEL_R = etat_led & 1; + } + else if(cmpt_led == 5) { + DEL_R = 0; + } + else if(cmpt_led == 50) { + DEL_V = etat_led & 2; + } + else if(cmpt_led == 60) { + DEL_V = 0; + } +} + +void Init_Led(void) { + cmpt_led = 0; + etat_led = 0; + Compteur_Led.attach(&Tache_Cmpt_Led,0.01); // 10ms +} + +void Stop_Led(void) { + DEL_R = 0; + DEL_V = 0; + Compteur_Led.detach(); +} + +void Set_Led(uint8_t couleur) { + etat_led = couleur; +} +/******************************************************************************/ +// Mesure de la tension de la batterie +float mes_bat; + +float Mes_Bat(void) { + + mes_bat = batin.read()*4.59f + 0.31f; // 3.3 x 13.9/10 + 310mV(D2 carte EPS) + return mes_bat; +} + +void Envoi_Mes_Bat(void) { + + pc.printf("BAT: %.2f V\n",mes_bat); // Format pour Terminal (Putty) +// pc.printf("B%.2f\n",mes_bat); // Format pour Serial Data Plotter +} +/******************************************************************************/ +// Mesure des courants des 2 panneaux solaires +float mes_sp1, mes_sp2; + +void Mes_SP(void) { + + mes_sp1 = sp_1in.read()*165.0; // 3.3 x 50 + mes_sp2 = sp_2in.read()*165.0; // 3.3 x 50 +} + +void Envoi_Mes_SP(void) { + + pc.printf("SP1: %.1f mA\tSP2: %.1f mA\n",mes_sp1,mes_sp2); +} +/******************************************************************************/ +// Fonction pour initialiser les fonctions précédentes + +void Init_User_Fonctions(void) { + + ctrl_reg = 1; // Pour mettre sous tension le moniteur de courant des Solar Panels + Init_Led(); +} +// Fonction pour stopper les fonctions précédentes + +void Stop_User_Fonctions(void) { + + ctrl_reg = 0; + Stop_Led(); +} +/******************************************************************************/ \ No newline at end of file