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

Files at this revision

API Documentation at this revision

Comitter:
Giamarchi
Date:
Tue Jul 06 12:47:20 2021 +0000
Commit message:
Revision

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-os.lib Show annotated file Show diff for this revision Revisions of this file
system.h Show annotated file Show diff for this revision Revisions of this file
user.h Show annotated file Show diff for this revision Revisions of this file
--- /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