VF PROJET A ENVOYER

This commit is contained in:
leo 2025-12-04 12:47:34 +01:00
parent 0007c7e70b
commit 38722b033e
9 changed files with 122 additions and 42 deletions

View file

@ -14,24 +14,13 @@ void MyBatterie_Init(void){
MyADC_Init(ADC1,14); // Init ADC channel 14 pour convertir valeur
MyADC_ActiveIT(ADC1,15,&handler_ADC); // Init interruption quand conversion finie
//My_USART_Init(USART1); // Init USART pour envoyer batterie
start_conversion(ADC1); // Premiere conversion
}
void handler_ADC (void){
//last2++;
//if (tickms - last2 >= 2000) {
//last2 = tickms;
d = ADC1->DR &~ (0xF << 12); // Retourne valeur numérique
d = d*3.3/4096;
d = d*13*100/12;
//send_USART_String(USART1,"Batterie : ");
//send_USART(USART1,((int)d/10) + '0'); // Envoie le chiffre des dizaines
//send_USART(USART1,((int)d%10) + '0'); // Envoie le chiffre des unités
//send_USART_String(USART1,"%\n");
//}
//start_conversion(ADC1); // Recommence la conversion pour le prochain
}
void Gestion_Conversion_ADC(void){

View file

@ -3,9 +3,32 @@
#include <stm32f10x.h>
/**
* @brief Initialise la batterie avec : initialisation de ADC1 et de son interruption, et lance la première conversion
Configure l'IO
- Réception de la batterie: In_Analog (GPIOC,4);
* @param aucun
*/
void MyBatterie_Init(void);
/**
* @brief Callback ADC12 : calcul le pourcentage de la batterie
* @param aucun
*/
void handler_ADC(void);
/**
* @brief Gestion du lancement de la conversion de l'ADC : lance une conversion toutes les Xms avec systick
ATTENTION : initialisation requise du service systick préalable
* @param aucun
*/
void Gestion_Conversion_ADC(void);
/**
* @brief Retourne la valeur de la batterie
* @param aucun
* @sortie pourcentage de batterie
*/
int MyBatterie_val();
#endif

View file

@ -5,7 +5,7 @@
#include <USART.h>
void handler_USART1 (void) {
//Pour le projet : Lancer PWM en fonction de la valeur du curseur
// Lancement d'une PWM en fonction de la valeur reçue et du bit de sens
char data = USART1->DR;
char valabs;
if (data & (1<<7)) {

View file

@ -1,7 +1,20 @@
#ifndef MYPLATEAU_H
#define MYPLATEAU_H
/**
* @brief Initialise le plateau avec : PWM a 20kHz sur Timer 3 channel 3, interruption UART1
Configure les 2 IOs
- Timer 3 channel 3: AltOut_Ppull (GPIOB,0);
- Bit de sens : Out_Ppull (GPIOA,1);
* @param aucun
*/
void Plateau_Init (void);
/**
* @brief Définition du callback de l'UART1 : Set la PWM et le bit de sens
* @param : aucun
*/
void handler_USART1 (void);
#endif

View file

@ -1,6 +1,10 @@
#ifndef SYSTICK_H
#define SYSTICK_H
/**
* @brief Initialise le systick pour générer une interruption toutes les ms
* @param aucun
*/
void MySystick_Init(void);
#endif

View file

@ -8,19 +8,19 @@ uint32_t last3 = 0;
uint32_t last4 = 0;
void Transmission_Init(void){
My_USART_Init(USART1); //USART3
My_USART_Init(USART1);
}
void Transmission_allure(int angle_voiles){
if (tickms-last1 >= 5000){
last1 = tickms;
if (angle_voiles < 23) send_USART_String(USART1,"Le bateau navigue vent debout. \n"); //USART3
else if (angle_voiles < 27) send_USART_String(USART1,"Le bateau navigue au pres. \n"); //USART3
else if (angle_voiles < 38) send_USART_String(USART1,"Le bateau navigue au pres bon plein. \n"); //USART3
else if (angle_voiles < 53) send_USART_String(USART1,"Le bateau navigue au travers. \n"); //USART3
else if (angle_voiles < 71) send_USART_String(USART1,"Le bateau navigue au grand large. \n"); //USART3
else if (angle_voiles <= 90) send_USART_String(USART1,"Le bateau navigue vent arriere. \n"); //USART3
else send_USART_String(USART1,"ERREUR DANS L'ANGLE!! \n"); //USART3
if (angle_voiles < 23) send_USART_String(USART1,"Le bateau navigue vent debout. \n");
else if (angle_voiles < 27) send_USART_String(USART1,"Le bateau navigue au pres. \n");
else if (angle_voiles < 38) send_USART_String(USART1,"Le bateau navigue au pres bon plein. \n");
else if (angle_voiles < 53) send_USART_String(USART1,"Le bateau navigue au travers. \n");
else if (angle_voiles < 71) send_USART_String(USART1,"Le bateau navigue au grand large. \n");
else if (angle_voiles <= 90) send_USART_String(USART1,"Le bateau navigue vent arriere. \n");
else send_USART_String(USART1,"ERREUR DANS L'ANGLE!! \n");
}
}
@ -28,14 +28,14 @@ void Transmission_batterie(int batterie){
if (tickms-last3 >= 5000){
last3 = tickms;
if(batterie > 50){
send_USART_String(USART1,"Batterie : "); //USART3
send_USART_String(USART1,"Batterie : ");
}
else{
send_USART_String(USART1, "SEUIL DE BATTERIE ATTEINT : "); //USART3
send_USART_String(USART1, "SEUIL DE BATTERIE ATTEINT : ");
}
send_USART(USART1,(batterie/10) + '0'); // Envoie le chiffre des dizaines //USART3
send_USART(USART1,(batterie%10) + '0'); // Envoie le chiffre des unités //USART3
send_USART_String(USART1,"%\n"); //USART3
send_USART(USART1,(batterie/10) + '0'); // Envoie le chiffre des dizaines
send_USART(USART1,(batterie%10) + '0'); // Envoie le chiffre des unités
send_USART_String(USART1,"%\n");
}
}
@ -44,22 +44,22 @@ void Transmission_roulis(char roulis){
if (tickms-last4 >= 2000){
last4 = tickms;
if (roulis >= 40 && !(roulis & (1<<7))){
send_USART_String(USART1, "ANGLE DE ROULIS TROP ELEVE : DEBORDAGE!!! \n"); //USART3
send_USART(USART1,(roulis/10) + '0'); // Envoie le chiffre des dizaines //USART3
send_USART(USART1,(roulis%10) + '0'); // Envoie le chiffre des unités //USART3
send_USART_String(USART1, "ANGLE DE ROULIS TROP ELEVE : DEBORDAGE!!! \n");
send_USART(USART1,(roulis/10) + '0'); // Envoie le chiffre des dizaines
send_USART(USART1,(roulis%10) + '0'); // Envoie le chiffre des unités
}
else if (roulis & (1<<7)) {
angabs = (1<<7) - (roulis & 0x7F);
if (angabs >= 40) send_USART_String(USART1, "ANGLE DE ROULIS TROP ELEVE : DEBORDAGE!!! \n"); //USART3
if (angabs >= 40) send_USART_String(USART1, "ANGLE DE ROULIS TROP ELEVE : DEBORDAGE!!! \n");
else send_USART_String(USART1, "Angle de roulis : ");
send_USART(USART1,(angabs/10) + '0');
send_USART(USART1,(angabs%10) + '0');
}
else {
send_USART_String(USART1, "Angle de roulis : "); //USART3
send_USART(USART1,(roulis/10) + '0'); // Envoie le chiffre des dizaines //USART3
send_USART(USART1,(roulis%10) + '0'); // Envoie le chiffre des unités //USART3
send_USART_String(USART1, "Angle de roulis : ");
send_USART(USART1,(roulis/10) + '0'); // Envoie le chiffre des dizaines
send_USART(USART1,(roulis%10) + '0'); // Envoie le chiffre des unités
}
send_USART_String(USART1," degre(s)\n"); //USART3
send_USART_String(USART1," degre(s)\n");
}
}

View file

@ -1,9 +1,34 @@
#ifndef TRANSMISSION_H
#define TRANSMISSION_H
/**
* @brief Initialise la transmission sur UART1
* @param aucun
*/
void Transmission_Init(void);
/**
* @brief Permet de transmettre l'allure du voilier à la tablette, en fonction de l'angle de bordage des voiles, toutes les Xms
ATTENTION : initialisation requise du service systick préalable
* @param angle des voiles
*/
void Transmission_allure(int angle_voiles);
/**
* @brief Permet de transmettre la batterie du voilier à la tablette, toutes les Xms
ATTENTION : initialisation requise du service systick préalable
* @param pourcentage de batterie
*/
void Transmission_batterie(int batterie);
/**
* @brief Permet de transmettre l'angle de roulis à la tablette, toutes les Xms
ATTENTION : initialisation requise du service systick préalable
* @param angle de toulis en degrés
*/
void Transmission_roulis(char roulis);
#endif

View file

@ -2,10 +2,27 @@
#define BORDAGE_H
#include "stm32f10x.h"
/**
* @brief Initialise le bordage avec : PWM sur timer 1 channel 1 à 50Hz
Configure l'IO
- Timer 1 channel 1: AltOut_Ppull (GPIOA,8);
* @param aucun
*/
void Init_bordage();
/**
* @brief Fait le bordage des voiles en fonction de l'angle de la girouette et de l'angle de roulis
* @param Timer, channel utilisé (on pourrait enlever car ce n'est pas reconfigurable et laisser TIM1, channel 1 partout) et angle de roulis en degrés
*/
void Update_bordage (TIM_TypeDef *Timer, char channel, char roulis);
/**
* @brief Calcule l'angle des voiles à partir de l'angle de la girouette
* @param aucun
*/
int Calcul_Angle();
#endif

View file

@ -1,14 +1,23 @@
#ifndef MYROULIS_H
#define MYROULIS_H
/* Description des besoins au niveau service (ne pas oublier de gérer cs/NSS !!!)
- Fonction d'init de l'accéléromètre
- Fonction de calcul angle de roulis sur interruption externe GPIOA pin 6
Ou sinon sur interruption d'un timer a 100HZ
/**
* @brief Initialise le roulis avec : initialisation de l'accéléromètre, interruption sur Timer 2 à 100Hz
* @param aucun
*/
void MyRoulis_Init(void);
/**
* @brief callback du timer 3 : Récupère les données des axes y et z de l'accéléromètre
* @param aucun
*/
void MyRoulis_Data(void);
/**
* @brief Calcul la valeur de l'angle de roulis
* @param aucun
* @sortie angle de roulis en radiant
*/
float MyRoulis_Angle();
#endif