Periph-Voilier/MyDrivers/girouette.c
2020-11-24 22:56:56 +01:00

134 lines
2.9 KiB
C

#include "stm32f1xx_ll_gpio.h"
#include "girouette.h"
#include "MyTimer.h"
#include "MyPWM.h"
#include "stm32f1xx_ll_tim.h"
/**
* @brief Configuration de l'interruption exterieure
* @note
* @param None
* @retval None
*/
void exti_ref(void){
LL_GPIO_AF_SetEXTISource(LL_GPIO_AF_EXTI_PORTA, LL_GPIO_AF_EXTI_LINE5);
AFIO->EXTICR[2] |= AFIO_EXTICR2_EXTI5_PA;
EXTI->IMR |= EXTI_IMR_MR5_Msk;
EXTI->RTSR |= EXTI_RTSR_TR5_Msk;
}
/**
* @brief Configuration de l'interruption du NVIC
* @note
* @param None
* @retval None
*/
void nvic_exti_conf(void){
NVIC->IP[23]=2<<4;
NVIC->ISER[0]=1<<23;
}
/**
* @brief redirection de l'interruption
* @note
* @param None
* @retval None
*/
void EXTI9_5_IRQHandler(void){
//CNT A ZERO
LL_TIM_SetCounter(TIM3, 0);
//enlever le pin de pending en le mettant a 1
EXTI->PR |= EXTI_PR_PR5_Msk;
}
/**
* @brief Configuration des interruptions et des timers
* @note
* @param None
* @retval None
*/
void conf_girouette(void){
//Configuration des interruptions
exti_ref();
nvic_exti_conf();
//Configuration timer en mode encodeur
MyTimer_girouette_Conf();
//Configuration timer en mode PWM
MyPWM_girouette_Conf_Output(TIM1,LL_TIM_CHANNEL_CH1);
//Activation Timer 1
LL_TIM_EnableAllOutputs(TIM1);
}
/**
* @brief Calcul position-angle à partir de l'encodeur
* @note
* @param None
* @retval Pourcentage "Temps haut/Période" de la PWM [5 10]% (180 valeurs)
*/
//Initialisation des variables
float pos_Min=90;
float pos_Max=270;
float pos_actuelle;
float duree_Min=1;
float duree_Max=2;
float duree_calc;
float Periode=20;
float Pourcentage_Min;
float Pourcentage_Max;
float Pourcentage_calc;
float Calcul_pourcentage_duree (void){
pos_actuelle=LL_TIM_GetCounter(TIM3);//Récupération de la valeur du compteur
//Calcul pourcentage min et max
Pourcentage_Min=duree_Min/Periode;
Pourcentage_Max=duree_Max/Periode;
//Calcul fonction affine "durée Temps haut" en fonction de la valeur du compteur
if (pos_actuelle <= 360){
if (pos_actuelle > 90 && pos_actuelle <= 270) {
duree_calc=((duree_Max-duree_Min)/(pos_Max-pos_Min))*pos_actuelle+duree_Min/duree_Max;
}
else if (pos_actuelle > 270){
duree_calc=duree_Max;
}
else {
duree_calc=duree_Min;
}
}
//Calcul fonction affine "durée Temps haut" en fonction de la valeur du compteur
//Si la girouette dépasse 180° ?
if (pos_actuelle > 360 && pos_actuelle < 720){
if (pos_actuelle > 450 && pos_actuelle < 630) {
duree_calc=((duree_Max-duree_Min)/(pos_Max-pos_Min))*(720-pos_actuelle)+duree_Min/duree_Max;
}
else if (pos_actuelle < 450){
duree_calc=duree_Max;
}
else {
duree_calc=duree_Min;
}
}
//Calcul du pourcentage en fonction de la "durée Temps haut"
Pourcentage_calc=((Pourcentage_Max-Pourcentage_Min)/(duree_Max-duree_Min))*duree_calc;
return Pourcentage_calc;
}
float Angle_Vent(void) {
return pos_actuelle/2.0;
}