Ajout de pleins de commentaires + modifications voile

This commit is contained in:
EyeXion 2020-11-15 23:52:35 +01:00
parent 96c8eb9242
commit cc4d4415e9
9 changed files with 223 additions and 66 deletions

View file

@ -432,6 +432,54 @@
<ExecCommand></ExecCommand> <ExecCommand></ExecCommand>
<Expression></Expression> <Expression></Expression>
</Bp> </Bp>
<Bp>
<Number>3</Number>
<Type>0</Type>
<LineNumber>35</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>0</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>..\Src\Voilier.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
<Bp>
<Number>4</Number>
<Type>0</Type>
<LineNumber>36</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>0</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>..\Src\Voilier.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
<Bp>
<Number>5</Number>
<Type>0</Type>
<LineNumber>81</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>0</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>..\Src\Voilier.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
</Breakpoint> </Breakpoint>
<WatchWindow1> <WatchWindow1>
<Ww> <Ww>
@ -514,7 +562,7 @@
<GroupNumber>1</GroupNumber> <GroupNumber>1</GroupNumber>
<FileNumber>1</FileNumber> <FileNumber>1</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2> <bDave2>0</bDave2>
<PathWithFileName>..\Src\Voilier.c</PathWithFileName> <PathWithFileName>..\Src\Voilier.c</PathWithFileName>
@ -582,7 +630,7 @@
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>6</FileNumber> <FileNumber>6</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2> <bDave2>0</bDave2>
<PathWithFileName>..\Src\Voile.c</PathWithFileName> <PathWithFileName>..\Src\Voile.c</PathWithFileName>

View file

@ -1,6 +1,8 @@
#ifndef ALLURE_H #ifndef ALLURE_H
#define ALLURE_H #define ALLURE_H
/* PERSONNES QUI ONT TRAVAILLE SUR CE MODULE : PAUL */
/** /**
* @brief Configure la girouette pour la détection de l'allure (sens du vent). * @brief Configure la girouette pour la détection de l'allure (sens du vent).
* @note Configuration des ports PA6 et 7 en alternate input pour récupérer les signaux * @note Configuration des ports PA6 et 7 en alternate input pour récupérer les signaux

View file

@ -1,6 +1,9 @@
#ifndef GOUVERNAIL_H #ifndef GOUVERNAIL_H
#define GOUVERNAIL_H #define GOUVERNAIL_H
/* PERSONNES QUI ONT TRAVAILLE SUR CE MODULE : PAUL, ELISE */
/** /**
* @brief Configure le récepteur de la télécommande ainsi que le plateau rotatif. * @brief Configure le récepteur de la télécommande ainsi que le plateau rotatif.
* @note Configuration du port PB6 et 7 en alternate input pour récupérer les signaux de la télécommande * @note Configuration du port PB6 et 7 en alternate input pour récupérer les signaux de la télécommande

View file

@ -75,12 +75,6 @@ void ConfSecurite(){
LL_ADC_Enable(ADC1); 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){ int RecupNiveauBatterie(void){
// Lancement de la conversion // Lancement de la conversion
LL_ADC_INJ_StartConversionSWStart(ADC1); LL_ADC_INJ_StartConversionSWStart(ADC1);
@ -93,12 +87,6 @@ int RecupNiveauBatterie(void){
} }
/**
* @brief Met le flag de dangerBatterie à 1 si batterie faible.
* @note
* @param un entier representant le niveau de batterie en pourcentage
* @retval
*/
int CalculerDangerNiveauBatterie(int niveau){ int CalculerDangerNiveauBatterie(int niveau){
if ( niveau <= Seuil) if ( niveau <= Seuil)
{ {
@ -111,12 +99,6 @@ int CalculerDangerNiveauBatterie(int niveau){
} }
/*
* @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
*/
int CalculerDangerChavirement(int gamma){ int CalculerDangerChavirement(int gamma){
if ( gamma >= SeuilAngle) if ( gamma >= SeuilAngle)
{ {
@ -128,12 +110,6 @@ int CalculerDangerChavirement(int gamma){
} }
} }
/*
* @brief Recuperer l angle de rouli
* @note ADC1 -> Channel 10 (Rang 1)
* @param None
* @retval angle de rouli
*/
int RecupRouli(){ int RecupRouli(){
// Lancement de la conversion // Lancement de la conversion
LL_ADC_INJ_StartConversionSWStart(ADC1); LL_ADC_INJ_StartConversionSWStart(ADC1);

View file

@ -1,44 +1,49 @@
#ifndef SECURITE_H #ifndef SECURITE_H
#define SECURITE_H #define SECURITE_H
/** /* PERSONNES QUI ONT TRAVAILLE SUR CE MODULE : ELIES, AURIANE, ELISE */
* @brief
* @note
* @param /**
* @retval * @brief Mets le flag drapeauDangerRouli a 1 si l angle de roulis est mauvais
*/ * @note Si le voilier prend un angle de roulis supérieur à 40° -> MSG de danger + voiles sont immédiatement relâchées
* @param un entier representant l angle de roulis (entre 0 et 90 degrés)
* @retval NONE
*/
int CalculerDangerChavirement(int gamma); int CalculerDangerChavirement(int gamma);
/** /**
* @brief * @brief Recuperer l angle de rouli
* @note * @note ADC1 -> Channel 10 (Rang 1)
* @param * @param None
* @retval * @retval angle de rouli (entre 0 et 90 degrès)
*/ */
int RecupRouli(void); int RecupRouli(void);
/** /**
* @brief * @brief Recuperer le niveau de batterie
* @note * @note ADC1 -> Channel 12 (Rang 2)
* @param * @param None
* @retval * @retval niveau de batterie en pourcentage (entre 0 et 100)
*/ */
int RecupNiveauBatterie(void); int RecupNiveauBatterie(void);
/** /**
* @brief * @brief Configuration de l'ADC 1 pour l'acceleromètre et le niveau de batterie
* @note A lancer en 1er avant tout * @note Channels 10 et 12. A lancer en 1er
* @param * @param None
* @retval * @retval None
*/ */
void ConfSecurite(void); void ConfSecurite(void);
/** /**
* @brief * @brief Met le flag de dangerBatterie à 1 si batterie faible.
* @note * @note
* @param * @param un entier representant le niveau de batterie en pourcentage
* @retval * @retval 1 si danger, 0 si pas de danger
*/ */
int CalculerDangerNiveauBatterie(int niveau); int CalculerDangerNiveauBatterie(int niveau);

View file

@ -1,12 +1,42 @@
#ifndef TRANSMISSION_H #ifndef TRANSMISSION_H
#define TRANSMISSION_H #define TRANSMISSION_H
/* PERSONNES QUI ONT TRAVAILLE SUR CE MODULE : PAUL, ELIES, AURIANE */
/**
* @brief Initialiser la structure de transmission avec les chaines de caractères pour l'envoi régulier
* @note Flag d'envoi mis à 1 à la fin pour activer la transmission dans EnvoyerCaractere
* @param 2 chaines de caractères pour l'allure et la tension des voiles
* @retval None
*/
void EnvoiRegulier(char * Allure, char * tension); void EnvoiRegulier(char * Allure, char * tension);
/**
* @brief Initialiser la structure de transmission avec les chaines de caractères pour l'envoi excptionnel
* @note Flag d'envoi mis à 1 à la fin pour activer la transmission dans EnvoyerCaractere
Envoi excpetionnel peut être un message d'alerte pour la batterie ou le roulis
* @param A chaine de caractère pour indiquer quel danger est mis en avant
* @retval None
*/
void EnvoiExceptionnel(char * msgAlarme); void EnvoiExceptionnel(char * msgAlarme);
/**
* @brief Appelée en BG dans le while(1). Si le flag d'envoi est à 1, envoi le prochain caractère contenu dans la
structure transmission
* @note
* @param None
* @retval None
*/
void EnvoyerCaractere(void); void EnvoyerCaractere(void);
/**
* @brief Configuration de l'USART pour les transmissions
* @note None
* @param None
* @retval None
*/
void ConfTransmission(void); void ConfTransmission(void);
#endif #endif

View file

@ -15,22 +15,36 @@
#define A_BETA_TO_GAMMA ((GAMMA_90 - GAMMA_0)/90.0) //Coefficient directeur de la relation entre l'angle de voile et la PWM #define A_BETA_TO_GAMMA ((GAMMA_90 - GAMMA_0)/90.0) //Coefficient directeur de la relation entre l'angle de voile et la PWM
#define B_BETA_TO_GAMMA (GAMMA_0) //Ordonnée a l'origine #define B_BETA_TO_GAMMA (GAMMA_0) //Ordonnée a l'origine
//Valeurs de CCR1 pour la PWM output
#define POSITION_00 1000
#define POSITION_10 1100
#define POSITION_20 1200
#define POSITION_30 1300
#define POSITION_40 1400
#define POSITION_50 1500
#define POSITION_60 1600
#define POSITION_70 1700
#define POSITION_80 1800
#define POSITION_90 1900
int angleVoileActuel = 0; //angle de la voile. Mis à jour quans on la tend. de 0 à 45. int angleVoileActuel = 0; //angle de la voile. Mis à jour quans on la tend. de 0 à 45.
void ConfVoile(void){
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
LL_TIM_SetAutoReload(Timer, ARR);
LL_TIM_SetPrescaler(Timer, PSC);
LL_GPIO_SetPinMode(GPIOA,LL_GPIO_PIN_8,LL_GPIO_MODE_ALTERNATE);
LL_GPIO_SetPinOutputType(GPIOA,LL_GPIO_PIN_8,LL_GPIO_OUTPUT_PUSHPULL);
LL_TIM_OC_SetMode(Timer, channel, LL_TIM_OCMODE_PWM1);
Timer->CCER |= TIM_CCER_CC1E;
Timer->BDTR |= 0x1 << 15;
Timer->CCR1 = 1500; // par defaut tendu à 1ms
LL_TIM_EnableCounter(Timer);
}
void ConfVoile(void){
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA); //Enable l'horloge du GPIOA
LL_TIM_SetAutoReload(Timer, ARR); //On règle l'ARR
LL_TIM_SetPrescaler(Timer, PSC); //On règle le PSC
LL_GPIO_SetPinMode(GPIOA,LL_GPIO_PIN_8,LL_GPIO_MODE_ALTERNATE); //Pin en mode output alternate
LL_GPIO_SetPinOutputType(GPIOA,LL_GPIO_PIN_8,LL_GPIO_OUTPUT_PUSHPULL); //Pin en mode output pushpull
LL_TIM_OC_SetMode(Timer, channel, LL_TIM_OCMODE_PWM1); //On met le timer en mode PWM1 sur le channel choisi
Timer->CCER |= TIM_CCER_CC1E; //On enable le comptage dans le timer en output
Timer->BDTR |= 0x1 << 15; //Comme on utilise le Timer1, on met le bit MOE à 1
Timer->CCR1 = 1500; // par defaut tendu à 1ms
LL_TIM_EnableCounter(Timer); //On commence le comptage
}
int RecupTensionVoile(void){ int RecupTensionVoile(void){
return angleVoileActuel; return angleVoileActuel;
@ -49,7 +63,49 @@ int CalculerTension(int alpha){
void TendreVoile(int theta) void TendreVoile(int theta)
{ {
Timer->CCR1 = (int)(A_BETA_TO_GAMMA * (float)theta + B_BETA_TO_GAMMA) ; if (theta < 5){
Timer->CCR1 = POSITION_00;
angleVoileActuel = 0;
}
if (theta < 10){
Timer->CCR1 = POSITION_10;
angleVoileActuel = 10;
}
else if(theta < 20){
Timer->CCR1 = POSITION_20;
angleVoileActuel = 20;
}
else if(theta < 30){
Timer->CCR1 = POSITION_30;
angleVoileActuel = 30;
}
else if(theta < 40){
Timer->CCR1 = POSITION_40;
angleVoileActuel = 40;
}
else if(theta < 50){
Timer->CCR1 = POSITION_50;
angleVoileActuel = 50;
}
else if(theta < 60){
Timer->CCR1 = POSITION_60;
angleVoileActuel = 60;
}
else if(theta < 70){
Timer->CCR1 = POSITION_70;
angleVoileActuel = 70;
}
else if(theta < 80){
Timer->CCR1 = POSITION_80;
angleVoileActuel = 80;
}
else{
Timer->CCR1 = POSITION_90;
angleVoileActuel = 90;
}
//Timer->CCR1 = (int)(A_BETA_TO_GAMMA * (float)theta + B_BETA_TO_GAMMA) ;
} }
char * TensionVoileToString(int theta) { char * TensionVoileToString(int theta) {

View file

@ -1,18 +1,51 @@
#ifndef VOILE_H #ifndef VOILE_H
#define VOILE_H #define VOILE_H
/* PERSONNES QUI ONT TRAVAILLE SUR CE MODULE : ELIES, AURIANE */
/* RESOLUTION PWM SERVOMOTEUR : 10 POSITIONS POSSIBLES*/
/**
* @brief Configuration du Timer en mode PWM output
* @note Timer1 en thérie
* @param
* @retval None
*/
void ConfVoile(void); void ConfVoile(void);
/**
char * ToString(int theta) ; * @brief Retourne la valeur de l'angle de la voile actuel en degrés
* @note
* @param
* @retval Un angle compris entre 5 et 90 (en degrés) (10 valeurs possibles entre dans [5,10,20,30,40,50,60,70,80,90]
*/
int RecupTensionVoile(void); int RecupTensionVoile(void);
/**
* @brief Calcule à partir de l'angle alpha (allure), l'angle theta (de la voile) à avoir
* @note Si alpha < 45, on détend la voile (theta = 90)
* @param Un entier alpha compris entre 0 et 180
* @retval Un angle theta compris entre 0 et 90 degrés (en degrés)
*/
int CalculerTension(int alpha); int CalculerTension(int alpha);
/**
* @brief Met à jour le registre CCR1 pour tendre la voile selon theta
* @note 10 niveaus possibles pour la résolution PWM.
* @param Un entier theta entre 0 et 90
* @retval None
*/
void TendreVoile(int theta); void TendreVoile(int theta);
/**
* @brief Associe un chaine de caractère a une valeur d'angle de voile
* @note
* @param theta : un entier entre 10 valeurs possibles [5,10,20,30,40,50,60,70,80,90]
* @retval Une chaine de caractère représentant l'angle de voile
*/
char * TensionVoileToString(int theta); char * TensionVoileToString(int theta);
#endif #endif

View file

@ -9,6 +9,10 @@
#include "stm32f1xx_ll_utils.h" // utile dans la fonction SystemClock_Config #include "stm32f1xx_ll_utils.h" // utile dans la fonction SystemClock_Config
#include "stm32f1xx_ll_system.h" // utile dans la fonction SystemClock_Config #include "stm32f1xx_ll_system.h" // utile dans la fonction SystemClock_Config
/* PERSONNES QUI ONT TRAVAILLE SUR CE MODULE : PAUL, ELIES, AURIANE, ELIES */
void SystemClock_Config(void); void SystemClock_Config(void);
void ConfSysTick(void){ void ConfSysTick(void){
@ -53,7 +57,7 @@ void Envoi3s(){
*/ */
void Task100ms(){ void Task100ms(){
int dangerRoulis = 0; //Variable qui permet de ne pas tendre les voiles si il y a trop de roulis int dangerRoulis = 0; //Variable qui permet de ne pas tendre les voiles si il y a trop de roulis
//Anti-Chavirement //Anti-Chavirement
if(CalculerDangerChavirement(RecupRouli())){//renvoi boolean : int à 0 si faux et 1 si vrai if(CalculerDangerChavirement(RecupRouli())){//renvoi boolean : int à 0 si faux et 1 si vrai