134 lines
2.9 KiB
C
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;
|
|
}
|