225 lines
6.5 KiB
C
225 lines
6.5 KiB
C
#include "Securite.h"
|
||
|
||
|
||
// Seuil represente la valeur (en %) en dessous de laquelle le niveau de batterie est consideree faible
|
||
#define Seuil (20)
|
||
|
||
// Seuil represente la valeur de l'angle au dessus de laquelle le chavirement est trop prononcé
|
||
#define SeuilAngle (40)
|
||
|
||
|
||
int drapeauRecupSecurite = 0; // Flag qui est mis à 1 toute les 10 sec pour recuperer niveau batterie/rouli et envoi régulier
|
||
int drapeauDangerBatterie = 0; //Flag qui est mis à 1 toute les 10 sec si batterie faible --> envoie message alarme
|
||
int drapeauDangerRouli = 0; //Flag qui est mis à 1 toute les 10 sec si rouli pas bon --> envoie message alarme
|
||
|
||
|
||
void ConfSecurite(){
|
||
//On est pas sûrs pour ADC 1, voir datasheet page 28
|
||
|
||
//Faire les horloges
|
||
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC);
|
||
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC1);
|
||
|
||
|
||
//On configure les PINS
|
||
LL_GPIO_SetPinMode(GPIOC,LL_GPIO_PIN_0,LL_GPIO_MODE_ANALOG);
|
||
LL_GPIO_SetPinMode(GPIOC,LL_GPIO_PIN_2,LL_GPIO_MODE_ANALOG);
|
||
|
||
|
||
//ON se met en mode scan enable pour pouvoir à chaque trigger aller chercher sur plusieur voies.
|
||
LL_ADC_SetSequencersScanMode(ADC1,LL_ADC_SEQ_SCAN_ENABLE);
|
||
|
||
//Permet de faire en sorte d'aller chercher 2 voies (2 rangs) à chaque trigger
|
||
LL_ADC_INJ_SetSequencerLength(ADC1,LL_ADC_INJ_SEQ_SCAN_ENABLE_2RANKS);
|
||
|
||
//Permet de ne pas avoir d'intérruption dans le scan
|
||
LL_ADC_INJ_SetSequencerDiscont(ADC1,LL_ADC_INJ_SEQ_DISCONT_DISABLE);
|
||
|
||
//A chaque trigger, on va donc avoir voies de rang 1 puis de rang 2 de scannées
|
||
|
||
//On met le rang 1 pour la voie 10 (accéléro)
|
||
LL_ADC_INJ_SetSequencerRanks(ADC1,LL_ADC_INJ_RANK_1,LL_ADC_CHANNEL_10);
|
||
|
||
//On met rang 2 pour la voie 12 (surveillance batterie)
|
||
LL_ADC_INJ_SetSequencerRanks(ADC1,LL_ADC_INJ_RANK_2,LL_ADC_CHANNEL_12);
|
||
|
||
//Permet d'avoirdes registres indépendants pour chaque voie (chaque rangs en fait, au max 4 + 1 pour les regular)
|
||
LL_ADC_INJ_SetTrigAuto(ADC1,LL_ADC_INJ_TRIG_INDEPENDENT);
|
||
|
||
|
||
//Sampling time voie 10 et 12, à changer peut-être
|
||
LL_ADC_SetChannelSamplingTime(ADC1,LL_ADC_CHANNEL_10,LL_ADC_SAMPLINGTIME_28CYCLES_5);
|
||
|
||
LL_ADC_SetChannelSamplingTime(ADC1,LL_ADC_CHANNEL_12,LL_ADC_SAMPLINGTIME_28CYCLES_5);
|
||
|
||
|
||
|
||
LL_ADC_INJ_SetTriggerSource(ADC1,LL_ADC_INJ_TRIG_SOFTWARE); //permet d'enable le trigger de l'adc par le software
|
||
|
||
|
||
|
||
LL_ADC_StartCalibration(ADC1);
|
||
|
||
|
||
//Tant que calibration par terminée on enable pas
|
||
while(LL_ADC_IsCalibrationOnGoing(ADC1)){
|
||
}
|
||
|
||
//Activation de l'ADC (???)
|
||
LL_ADC_Enable(ADC1);
|
||
}
|
||
|
||
/**
|
||
* @brief Recuperer le niveau de batterie
|
||
* @note ADC1 -> Channel 12 (Rang 2)
|
||
* @param None
|
||
* @retval niveau de batterie en pourcentage
|
||
*/
|
||
int RecupNiveauBatterie(void){
|
||
// Lancement de la conversion
|
||
LL_ADC_INJ_StartConversionSWStart(ADC1);
|
||
// Attente de la fin de conversion
|
||
while(!LL_ADC_IsActiveFlag_JEOS(ADC1)){}
|
||
// R?cuperation de la valeur apres conversion
|
||
int NiveauBatterie = LL_ADC_INJ_ReadConversionData12(ADC1,LL_ADC_INJ_RANK_2);
|
||
// Valeur code sur 12 bits : 0 a 4095 ; on veut Niveau de batterie en pourcentage
|
||
return NiveauBatterie * 100 / 4095 ;
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief Met le flag de dangerBatterie à 1 si batterie faible.
|
||
* @note
|
||
* @param un entier representant le niveau de batterie en pourcentage
|
||
* @retval
|
||
*/
|
||
void CalculDangerNiveauBatterie(int niveau){
|
||
if ( niveau <= Seuil)
|
||
{
|
||
drapeauDangerBatterie = 1;
|
||
}
|
||
else
|
||
{
|
||
drapeauDangerBatterie = 0 ;
|
||
}
|
||
}
|
||
|
||
|
||
/*
|
||
* @brief Mets le flag drapeauDangerRouli a 1 si l angle de rouli est mauvais
|
||
* @note Si le voilier prend un angle de roulis supe´rieur a` 40° -> MSG de danger + voiles sont imme´diatement rela^che´es
|
||
* @param un entier representant l angle de rouli
|
||
* @retval NONE
|
||
*/
|
||
void CalculerDangerChavirement(int gamma){
|
||
if ( gamma >= SeuilAngle)
|
||
{
|
||
drapeauDangerRouli = 1;
|
||
TendreVoile(90); //On lache les voiles si danger de chavirement
|
||
}
|
||
else
|
||
{
|
||
drapeauDangerRouli = 0 ;
|
||
}
|
||
}
|
||
|
||
/*
|
||
* @brief Recuperer l angle de rouli
|
||
* @note ADC1 -> Channel 10 (Rang 1)
|
||
* @param None
|
||
* @retval angle de rouli
|
||
*/
|
||
int RecupRouli(){
|
||
// Lancement de la conversion
|
||
LL_ADC_INJ_StartConversionSWStart(ADC1);
|
||
// Attente de la fin de conversion
|
||
while(!LL_ADC_IsActiveFlag_JEOS(ADC1)){}
|
||
// R?cuperation de la valeur apres conversion
|
||
int NiveauChavirement = LL_ADC_INJ_ReadConversionData12(ADC1,LL_ADC_INJ_RANK_1);
|
||
return 0; // Trouver le calcul de l'angle
|
||
}
|
||
|
||
void SystemClock_Config(void)
|
||
{
|
||
/* Set FLASH latency */
|
||
LL_FLASH_SetLatency(LL_FLASH_LATENCY_2);
|
||
|
||
/* Enable HSE oscillator */
|
||
// ********* Commenter la ligne ci-dessous pour MCBSTM32 *****************
|
||
// ********* Conserver la ligne si Nucléo*********************************
|
||
LL_RCC_HSE_EnableBypass();
|
||
LL_RCC_HSE_Enable();
|
||
while(LL_RCC_HSE_IsReady() != 1)
|
||
{
|
||
};
|
||
|
||
/* Main PLL configuration and activation */
|
||
LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE_DIV_1, LL_RCC_PLL_MUL_9);
|
||
|
||
LL_RCC_PLL_Enable();
|
||
while(LL_RCC_PLL_IsReady() != 1)
|
||
{
|
||
};
|
||
|
||
/* Sysclk activation on the main PLL */
|
||
LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1);
|
||
LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL);
|
||
while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL)
|
||
{
|
||
};
|
||
|
||
/* Set APB1 & APB2 prescaler*/
|
||
LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_2);
|
||
LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
|
||
|
||
/* Set systick to 1ms in using frequency set to 72MHz */
|
||
LL_Init1msTick(72000000); // utile lorsqu'on utilise la fonction LL_mDelay
|
||
|
||
/* Update CMSIS variable (which can be updated also through SystemCoreClockUpdate function) */
|
||
LL_SetSystemCoreClock(72000000);
|
||
}
|
||
|
||
int res10;
|
||
int level ;
|
||
int danger;
|
||
int rouli;
|
||
|
||
//Dans le main voilier.c en theorie
|
||
int main(){
|
||
SystemClock_Config();
|
||
ConfSecurite();
|
||
|
||
|
||
while(1){
|
||
|
||
/* Envoi message toute les 3 sec sur l'Allure et la tension voile */
|
||
if (drapeauTransimission){
|
||
//Envoi message régulier
|
||
drapeauTransmission = 0;
|
||
}
|
||
|
||
/* Recuperation toute les 10 sec niveau batterie et angle chavirement, puis calcul des dangers */
|
||
if (drapeauRecupSecurite){
|
||
level = RecupNiveauBatterie();
|
||
CalculDangerNiveauBatterie( level );
|
||
rouli = RecupRouli()
|
||
CalculerDanger(rouli);
|
||
drapeauRecupSecurite = 0;
|
||
}
|
||
|
||
/*Si batterie faible après recup (toute les 10 sec), envoi alerte batterie faible */
|
||
if (drapeauDangerBatterie){
|
||
char * msgBatterie = "Batterie faible";
|
||
EnvoiExcpetionnel(msgBatterie);
|
||
drapeauDangerBatterie = 0;
|
||
}
|
||
|
||
/*Si angle chavirement pas bon après recup (toute les 10 sec), envoi alerte chavirement */
|
||
if (drapeauDangerRouli){
|
||
char * msgRouli = "Bateau chavire !";
|
||
EnvoiExcpetionnel(msgRouli);
|
||
drapeauDangerRouli = 0;
|
||
}
|
||
|
||
}
|
||
}
|