Projet_Voilier_4IR/Src/Allure.c

95 lines
3 KiB
C

#include "maths.h" //Pour la valeur absolue
#include "stm32f1xx_ll_gpio.h" // GPIO
#include "stm32f1xx_ll_bus.h" // RCC
#include "stm32f1xx_ll_tim.h" // TIMER
#include "stm32f1xx_ll_exti.h" // External Interrup
int initialized = 0;
/**
* @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
Configuration des deux channels du TIM3 pour le compteur incrementeur
Configuration du PA5 avec une interruption pour capter les tours de girouette
* @param None
* @retval None
*/
void ConfAllure(void) {
// Configuration des IO
// Liberation de la clock du port A
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
// Configuration des IO -> pin A6 et A7 en alternate imput, pin A5 en interruption
//LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_5, LL_GPIO_MODE_INPUT);
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_6, LL_GPIO_MODE_FLOATING);
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_7, LL_GPIO_MODE_FLOATING);
LL_GPIO_AF_SetEXTISource(LL_GPIO_AF_EXTI_PORTA, LL_GPIO_AF_EXTI_LINE5);
LL_EXTI_InitTypeDef ExtiInitializer;
LL_EXTI_StructInit(&ExtiInitializer);
ExtiInitializer.Line_0_31 = LL_EXTI_LINE_5;
ExtiInitializer.Mode = LL_EXTI_MODE_IT;
ExtiInitializer.Trigger = LL_EXTI_TRIGGER_RISING;
ExtiInitializer.LineCommand = ENABLE;
LL_EXTI_Init(&ExtiInitializer);
NVIC->IP[23] = 0x43;
NVIC->ISER[0] |= 0x01 <<23;
//Configuration du timer
// Libération de la clock du timer
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3);
// Configuration des canaux du timer -> TIM3 CH1 et 2 en alternate input
LL_TIM_ENCODER_InitTypeDef Tim3Initializer;
LL_TIM_ENCODER_StructInit(&Tim3Initializer);
Tim3Initializer.EncoderMode = LL_TIM_ENCODERMODE_X2_TI1;
Tim3Initializer.IC1ActiveInput = LL_TIM_ACTIVEINPUT_DIRECTTI;
Tim3Initializer.IC1Filter = LL_TIM_IC_FILTER_FDIV1 ;
Tim3Initializer.IC1Polarity = LL_TIM_IC_POLARITY_RISING;
Tim3Initializer.IC1Prescaler = LL_TIM_ICPSC_DIV1;
Tim3Initializer.IC2ActiveInput = LL_TIM_ACTIVEINPUT_DIRECTTI;
Tim3Initializer.IC2Filter = LL_TIM_IC_FILTER_FDIV1;
Tim3Initializer.IC2Polarity = LL_TIM_IC_POLARITY_RISING;
Tim3Initializer.IC2Prescaler = LL_TIM_ICPSC_DIV1;
LL_TIM_ENCODER_Init(TIM3, &Tim3Initializer);
LL_TIM_SetAutoReload(TIM3, 359);
LL_TIM_EnableCounter(TIM3);
}
int RecupAllure(void) {
if (!initialized) {
return 10000;
} else {
return ((int)LL_TIM_GetCounter(TIM3)) * 50;
}
}
char * ToString(int alpha) {
int alpha_abs = abs(alpha);
if (alpha_abs < 45) {
return "Vent debout";
} else if (alpha < 55) {
return "Près";
} else if (alpha < 65) {
return "Bon plein";
} else if (alpha < 80) {
return "Petit largue";
} else if (alpha < 100) {
return "Travers";
} else if (alpha < 115) {
return "Largue";
} else if (alpha < 155) {
return "Grand largue";
} else if (alpha < 180) {
return "Vent arrière";
} else {
return "ERROR";
}
}
void EXTI9_5_IRQHandler(void) {
LL_TIM_SetCounter(TIM3, 0);
initialized = 1;
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_5);
}