Comment. + début mise en commun (GPIO)

This commit is contained in:
Neluji 2020-11-24 19:52:32 +01:00
parent fc622094a9
commit ebda31ee03
17 changed files with 884 additions and 153 deletions

View file

@ -479,7 +479,7 @@
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>4</FileNumber> <FileNumber>4</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>1</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2> <bDave2>0</bDave2>
<PathWithFileName>..\Services\MySequencer.c</PathWithFileName> <PathWithFileName>..\Services\MySequencer.c</PathWithFileName>
@ -523,7 +523,7 @@
<GroupNumber>3</GroupNumber> <GroupNumber>3</GroupNumber>
<FileNumber>7</FileNumber> <FileNumber>7</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>..\MyDrivers\MyUSART.c</PathWithFileName> <PathWithFileName>..\MyDrivers\MyUSART.c</PathWithFileName>
@ -543,6 +543,18 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<bShared>0</bShared> <bShared>0</bShared>
</File> </File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>9</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\MyDrivers\GPIO.c</PathWithFileName>
<FilenameWithoutPath>GPIO.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group> </Group>
<Group> <Group>
@ -553,7 +565,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>9</FileNumber> <FileNumber>10</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -565,7 +577,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>10</FileNumber> <FileNumber>11</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -577,7 +589,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>11</FileNumber> <FileNumber>12</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -589,7 +601,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>12</FileNumber> <FileNumber>13</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -601,7 +613,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>13</FileNumber> <FileNumber>14</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -621,7 +633,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>5</GroupNumber> <GroupNumber>5</GroupNumber>
<FileNumber>14</FileNumber> <FileNumber>15</FileNumber>
<FileType>5</FileType> <FileType>5</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -641,7 +653,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>15</FileNumber> <FileNumber>16</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -661,7 +673,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>7</GroupNumber> <GroupNumber>7</GroupNumber>
<FileNumber>16</FileNumber> <FileNumber>17</FileNumber>
<FileType>2</FileType> <FileType>2</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>

View file

@ -432,6 +432,11 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\MyDrivers\MySysTick.c</FilePath> <FilePath>..\MyDrivers\MySysTick.c</FilePath>
</File> </File>
<File>
<FileName>GPIO.c</FileName>
<FileType>1</FileType>
<FilePath>..\MyDrivers\GPIO.c</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>
@ -925,6 +930,11 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\MyDrivers\MySysTick.c</FilePath> <FilePath>..\MyDrivers\MySysTick.c</FilePath>
</File> </File>
<File>
<FileName>GPIO.c</FileName>
<FileType>1</FileType>
<FilePath>..\MyDrivers\GPIO.c</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>

168
MyDrivers/GPIO.c Normal file
View file

@ -0,0 +1,168 @@
#include "stm32f1xx_ll_gpio.h"
#include "stm32f1xx_ll_bus.h" // Pour l'activation des horloges
#include "GPIO.h"
void conf_GPIO_girouette(void){
//PA5,6,7
//Définition
LL_GPIO_InitTypeDef My_LL_GPIO_Init_Struct;
//Initialisation
LL_GPIO_StructInit(&My_LL_GPIO_Init_Struct);
//GPIOA - PIN 5 (INDEX)
My_LL_GPIO_Init_Struct.Mode=LL_GPIO_MODE_INPUT;
My_LL_GPIO_Init_Struct.Pin=LL_GPIO_PIN_5;
My_LL_GPIO_Init_Struct.Pull=LL_GPIO_PULL_DOWN;
LL_GPIO_Init(GPIOA,&My_LL_GPIO_Init_Struct);
//Initialisation
LL_GPIO_StructInit(&My_LL_GPIO_Init_Struct);
//GIOA - PIN 6 (CHA)
My_LL_GPIO_Init_Struct.Mode=LL_GPIO_MODE_INPUT;
My_LL_GPIO_Init_Struct.Pin=LL_GPIO_PIN_6;
My_LL_GPIO_Init_Struct.Pull=LL_GPIO_PULL_DOWN;
LL_GPIO_Init(GPIOA,&My_LL_GPIO_Init_Struct);
//Initialisation
LL_GPIO_StructInit(&My_LL_GPIO_Init_Struct);
//GPIOA - PIN 7 (CHB)
My_LL_GPIO_Init_Struct.Mode=LL_GPIO_MODE_INPUT;
My_LL_GPIO_Init_Struct.Pin=LL_GPIO_PIN_7;
My_LL_GPIO_Init_Struct.Pull=LL_GPIO_PULL_DOWN;
LL_GPIO_Init(GPIOA,&My_LL_GPIO_Init_Struct);
//Initialisation
LL_GPIO_StructInit(&My_LL_GPIO_Init_Struct);
//GPIOA - PIN 8 (PWM)
My_LL_GPIO_Init_Struct.Mode=LL_GPIO_MODE_ALTERNATE;
My_LL_GPIO_Init_Struct.Pin=LL_GPIO_PIN_8;
My_LL_GPIO_Init_Struct.OutputType=LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(GPIOA,&My_LL_GPIO_Init_Struct);
}
void conf_GPIO_roulis(void){
//PC 0,1
//Définition
LL_GPIO_InitTypeDef My_LL_GPIO_Init_Struct;
//Initialisation
LL_GPIO_StructInit(&My_LL_GPIO_Init_Struct);
//GPIOC - PIN 0
My_LL_GPIO_Init_Struct.Mode=LL_GPIO_MODE_ANALOG;
My_LL_GPIO_Init_Struct.Pin=LL_GPIO_PIN_0;
My_LL_GPIO_Init_Struct.Pull=LL_GPIO_PULL_DOWN;
LL_GPIO_Init(GPIOC,&My_LL_GPIO_Init_Struct);
//Initialisation
LL_GPIO_StructInit(&My_LL_GPIO_Init_Struct);
//GPIOC - PIN 1
My_LL_GPIO_Init_Struct.Mode=LL_GPIO_MODE_ANALOG;
My_LL_GPIO_Init_Struct.Pin=LL_GPIO_PIN_1;
My_LL_GPIO_Init_Struct.Pull=LL_GPIO_PULL_DOWN;
LL_GPIO_Init(GPIOC,&My_LL_GPIO_Init_Struct);
};
void conf_GPIO_RF (void) {
LL_GPIO_InitTypeDef My_GPIO_Init_Struct;
LL_GPIO_StructInit(&My_GPIO_Init_Struct);
//RX : TIM4_CH1/2 (PWM In)
//PB.6 en floating input
My_GPIO_Init_Struct.Pin = LL_GPIO_PIN_6;
LL_GPIO_Init(GPIOB, &My_GPIO_Init_Struct);
//PB.7 en floating input
My_GPIO_Init_Struct.Pin = LL_GPIO_PIN_7;
LL_GPIO_Init(GPIOB, &My_GPIO_Init_Struct);
LL_GPIO_StructInit(&My_GPIO_Init_Struct);
//TX : USART1 & Pin EN
//PA.9 en alternate output pp
My_GPIO_Init_Struct.Pin = LL_GPIO_PIN_9;
My_GPIO_Init_Struct.Mode = LL_GPIO_MODE_ALTERNATE;
My_GPIO_Init_Struct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(GPIOA, &My_GPIO_Init_Struct);
//PA.11 en output pp
My_GPIO_Init_Struct.Pin = LL_GPIO_PIN_11;
My_GPIO_Init_Struct.Mode = LL_GPIO_MODE_OUTPUT;
My_GPIO_Init_Struct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(GPIOA, &My_GPIO_Init_Struct);
}
void conf_GPIO_Moteur (void) {
LL_GPIO_InitTypeDef My_GPIO_Init_Struct;
LL_GPIO_StructInit(&My_GPIO_Init_Struct);
//Pin Sens
//PA.2 en output pp
My_GPIO_Init_Struct.Pin = LL_GPIO_PIN_2;
My_GPIO_Init_Struct.Mode = LL_GPIO_MODE_OUTPUT;
My_GPIO_Init_Struct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(GPIOA, &My_GPIO_Init_Struct);
LL_GPIO_StructInit(&My_GPIO_Init_Struct);
//Vitesse : TIM2_CH2 (PWM)
//PA.1 en alternate pp
My_GPIO_Init_Struct.Pin = LL_GPIO_PIN_1;
My_GPIO_Init_Struct.Mode = LL_GPIO_MODE_ALTERNATE;
My_GPIO_Init_Struct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(GPIOA, &My_GPIO_Init_Struct);
}
void conf_GPIO(void){
//Activation des horloges des GPIOS
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC);
conf_GPIO_girouette();
conf_GPIO_roulis();
conf_GPIO_Moteur();
conf_GPIO_RF();
}

24
MyDrivers/GPIO.h Normal file
View file

@ -0,0 +1,24 @@
#ifndef GPIO_H
#define GPIO_H
/*
Configuration de toutes les broches utilisées par les différentes fonctions :
- Moteur : PA.1 et PA.2
- RF : PB.6, PB.7, PA.9 et PA.11
- Accéléromètre : PC.0 et PC.1
- Servo : PA.8
- Girouette : PA.5, PA.6 et PA.7
Manque PC.2 = adc batterie
*/
#include "stm32f103xb.h"
/**
* @brief Configure les broches selon leurs utilisations
* @note Fonction à lancer en début de pgm.
* @param None
* @retval None
*/
void conf_GPIO(void);
#endif

View file

@ -1,15 +1,42 @@
#ifndef MYPWM_H #ifndef MYPWM_H
#define MYPWM_H #define MYPWM_H
/*
Driver pour la gestion de la PWM de Timers 1 à 4
*/
#include "stm32f103xb.h" #include "stm32f103xb.h"
/**
* @brief Configure un signal PWM en mode Output
* @note Penser à appeler Timer_Conf() de Timer.h avant !
* @param 1 timer, 1 channel
* @retval None
*/
void MyPWM_Conf_Output(TIM_TypeDef * Timer, int channel); void MyPWM_Conf_Output(TIM_TypeDef * Timer, int channel);
/**
* @brief Configure un timer en mode PWM Input
* @note Penser à appeler Timer_Conf() de Timer.h avant !
* @param 1 timer, 2 channels associés (1&2 ou 3&4)
* @retval None
*/
void MyPWM_Conf_Input(TIM_TypeDef * Timer, int channel1, int channel2); void MyPWM_Conf_Input(TIM_TypeDef * Timer, int channel1, int channel2);
/**
* @brief Définit la durée de l'impulsion à l'état haut
* @note Fct utilisée en émission
* @param 1 timer, la valeur de changement de la PWM, 1 channel associé au timer
* @retval None
*/
void MyPWM_Set_Impulse_Duration(TIM_TypeDef * Timer, uint32_t CompareValue, int channel); void MyPWM_Set_Impulse_Duration(TIM_TypeDef * Timer, uint32_t CompareValue, int channel);
/**
* @brief Renvoie le duty cycle de la PWM en entrée
* @note Fct utilisée en réception
* @param 1 timer et 2 channels associés (1&2 ou 3&4)
* @retval renvoie le duty cycle en pour mille pour améliorer la résolution
*/
int MyPWM_Duty_Cycle_Permilles(TIM_TypeDef * Timer, int channel1, int channel2); int MyPWM_Duty_Cycle_Permilles(TIM_TypeDef * Timer, int channel1, int channel2);
#endif #endif

View file

@ -3,12 +3,6 @@
#include "stm32f1xx_ll_usart.h" #include "stm32f1xx_ll_usart.h"
/**
* @brief Active l'horloge et règle les paramètres de transmission
* @note Fonction à lancer avant toute autre.
* @param USART_TypeDef UsDollar : indique le usart à utiliser par le uC, USART1, USART2 ou USART3
* @retval None
*/
void MyUSART_Conf(USART_TypeDef * USART, int TransferDir) void MyUSART_Conf(USART_TypeDef * USART, int TransferDir)
{ {
LL_USART_InitTypeDef My_LL_USART_Init_Struct; LL_USART_InitTypeDef My_LL_USART_Init_Struct;
@ -34,38 +28,9 @@ void MyUSART_Conf(USART_TypeDef * USART, int TransferDir)
LL_USART_Enable(USART); LL_USART_Enable(USART);
} }
/**
* @brief Autorise les interruptions de TXE
* @note
* @param USART_TypeDef UsDollar : indique le usart à utiliser par le uC, USART1, USART2 ou USART3
* @retval None
*/
void MyUSART_IT_Enable(USART_TypeDef * USART)
{
LL_USART_EnableIT_TXE(USART);
}
void MyUSART_Transmit_Data_8b(USART_TypeDef * USART, char data)
/**
* @brief Interdit les interruptions de TXE
* @note
* @param USART_TypeDef UsDollar : indique le usart à utiliser par le uC, USART1, USART2 ou USART3
* @retval None
*/
void MyUSART_IT_Disable(USART_TypeDef * USART)
{
LL_USART_DisableIT_TXE(USART);
}
/**
* @brief Transmet 8bits de donnée
* @note
* @param USART_TypeDef UsDollar : indique le usart à utiliser par le uC, USART1, USART2 ou USART3
* @retval None
*/
void MyUSART_Transmit_Data_8b(USART_TypeDef * USART, int data)
{ {
LL_USART_TransmitData8(USART, data); LL_USART_TransmitData8(USART, data);
while (LL_USART_IsActiveFlag_TC(USART) != 1){} while (LL_USART_IsActiveFlag_TC(USART) != 1){/*Attendre la fin de l'envoi*/}
} }

View file

@ -3,42 +3,26 @@
/* /*
Driver pour USART 1 à 3 du STM32F103RB Driver pour USART 1 à 3 du STM32F103RB
*/ */
#include "stm32f103xb.h" #include "stm32f103xb.h"
/** /**
* @brief Active l'horloge et règle les paramètres de transmission * @brief Active l'horloge et règle les paramètres de transmission
* @note Fonction à lancer avant toute autre. * @note Fonction à lancer en début de pgm.
* @param USART_TypeDef UsDollar : indique le usart à utiliser par le uC, USART1, USART2 ou USART3 * @param USART_TypeDef USART : indique l'usart à utiliser par le uC, USART1, USART2 ou USART3
* @retval None * @retval None
*/ */
void MyUSART_Conf(USART_TypeDef * USART, int TransferDir); void MyUSART_Conf(USART_TypeDef * USART, int TransferDir);
/**
* @brief Autorise les interruptions de TXE
* @note
* @param USART_TypeDef UsDollar : indique le usart à utiliser par le uC, USART1, USART2 ou USART3
* @retval None
*/
void MyUSART_IT_Enable(USART_TypeDef * USART);
/**
* @brief Interdit les interruptions de TXE
* @note
* @param USART_TypeDef UsDollar : indique le usart à utiliser par le uC, USART1, USART2 ou USART3
* @retval None
*/
void MyUSART_IT_Disable(USART_TypeDef * USART);
/** /**
* @brief Transmet 8bits de donnée * @brief Transmet 8bits de donnée
* @note * @note
* @param USART_TypeDef UsDollar : indique le usart à utiliser par le uC, USART1, USART2 ou USART3 * @param USART_TypeDef USART : indique l'usart à utiliser par le uC, USART1, USART2 ou USART3
* @param char data : la donnée sur 8bits à transmettre
* @retval None * @retval None
*/ */
void MyUSART_Transmit_Data_8b(USART_TypeDef * USART, int data); void MyUSART_Transmit_Data_8b(USART_TypeDef * USART, char data);
#endif #endif

View file

@ -0,0 +1,101 @@
#include "ADC_antichavirement.h"
#include "Chrono.h"
#include "MyTimer.h"
#include "stm32f1xx_ll_bus.h"
#include "stm32f1xx_ll_tim.h"
#include "stm32f1xx_ll_adc.h"
#include "stm32f1xx_ll_rcc.h"
#define seuil_g_pos 1.0
#define seuil_g_neg -1.0
void conf_ADC (void) {
//ADC_REG
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC1);
//Division pour etre < 14 MHz
LL_RCC_SetADCClockSource(LL_RCC_ADC_CLKSRC_PCLK2_DIV_6);
//Bit ADON à 1
LL_ADC_Enable(ADC1);
//Définition
LL_ADC_REG_InitTypeDef My_LL_ADC_REG_Init_Struct;
//Initialisation
LL_ADC_REG_StructInit(&My_LL_ADC_REG_Init_Struct);
My_LL_ADC_REG_Init_Struct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_1RANK ;
LL_ADC_StartCalibration(ADC1);
//Application a l'ADC1
LL_ADC_REG_Init(ADC1,&My_LL_ADC_REG_Init_Struct);
//ADC Sampling Time
LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_10, LL_ADC_SAMPLINGTIME_239CYCLES_5);
LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_11, LL_ADC_SAMPLINGTIME_239CYCLES_5);
}
uint32_t X;
uint32_t Y;
float rapport;
float start_ADC (void) {
//Conversion X
LL_ADC_REG_SetSequencerRanks(ADC1,LL_ADC_REG_RANK_1,LL_ADC_CHANNEL_10);
LL_ADC_Enable(ADC1);
LL_ADC_REG_StartConversionSWStart(ADC1);
while ( LL_ADC_IsActiveFlag_EOS(ADC1) == 0);
X=LL_ADC_REG_ReadConversionData32(ADC1);
//Conversion Y
LL_ADC_REG_SetSequencerRanks(ADC1,LL_ADC_REG_RANK_1,LL_ADC_CHANNEL_11);
LL_ADC_Enable(ADC1);
LL_ADC_REG_StartConversionSWStart(ADC1);
while ( LL_ADC_IsActiveFlag_EOS(ADC1) == 0);
Y=LL_ADC_REG_ReadConversionData32(ADC1);
//Calcul rapport
rapport = X/Y;
return rapport;
}
void antichavirement (float rapport) {
if (rapport >= seuil_g_pos || rapport <= seuil_g_neg){
//Voiles à 90°
MyPWM_Set_Impulse_Duration(TIM1,10000*10/100,LL_TIM_CHANNEL_CH1);
}
}

View file

@ -14,31 +14,6 @@ void Moteur_Conf(void) {
int Arr = 0x1C1F; int Arr = 0x1C1F;
int Psc = 0x0; int Psc = 0x0;
//Activation horloge GPIO
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
//Config broche PA2 -> Sens
LL_GPIO_InitTypeDef My_GPIO_Init_Struct;
LL_GPIO_StructInit(&My_GPIO_Init_Struct);
My_GPIO_Init_Struct.Pin = PinSens;
My_GPIO_Init_Struct.Mode = LL_GPIO_MODE_OUTPUT;
My_GPIO_Init_Struct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(GPIOPins, &My_GPIO_Init_Struct);
//Config broche PA1 -> PWM
LL_GPIO_StructInit(&My_GPIO_Init_Struct);
My_GPIO_Init_Struct.Pin = LL_GPIO_PIN_1;
My_GPIO_Init_Struct.Mode = LL_GPIO_MODE_ALTERNATE;
My_GPIO_Init_Struct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(GPIOA, &My_GPIO_Init_Struct);
//Activation horloge Timer //Activation horloge Timer
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM2); LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM2);
@ -57,6 +32,7 @@ void Moteur_Conf(void) {
void Moteur_Speed(int speedPercentage) { void Moteur_Speed(int speedPercentage) {
int Arr = 0x1C1F; int Arr = 0x1C1F;
//Arrêt du Timer si pas de vitesse
if(speedPercentage == 0) { if(speedPercentage == 0) {
MyTimer_Stop(TimerPWM); MyTimer_Stop(TimerPWM);
} }

View file

@ -1,18 +1,47 @@
#ifndef MOTEUR_H #ifndef MOTEUR_H
#define MOTEUR_H #define MOTEUR_H
/*
Driver permettant de contrôler le moteur CC qui fait tourner le plateau
La définition des pins utilisées est faites dans un autre fichier (GPIO.c)
Vitesse :
- Timer 2
- Channel 2
- Broche PA.1
Sens :
- Broche PA.2
*/
#include "stm32f103xb.h" #include "stm32f103xb.h"
#define PinSens LL_GPIO_PIN_2 #define PinSens LL_GPIO_PIN_2
#define PinPWM LL_GPIO_PIN_1
#define GPIOPins GPIOA #define GPIOPins GPIOA
#define TimerPWM TIM2 #define TimerPWM TIM2
#define channelPWM LL_TIM_CHANNEL_CH2 #define channelPWM LL_TIM_CHANNEL_CH2
/**
* @brief Configure le moteur
* @note À lancer en début de pgm
* @param None
* @retval None
*/
void Moteur_Conf(void); void Moteur_Conf(void);
/**
* @brief Définit la vitesse de rotation du plateau
* @note
* @param int speedPercentage : [0; 100] (%) de la vitesse max
* @retval None
*/
void Moteur_Speed(int speedPercentage); void Moteur_Speed(int speedPercentage);
/**
* @brief définit le sens de rotation du plateau
* @note
* @param int sens : 0 pour un sens, un int non nul pour l'autre ({0;1} attendu)
* @retval None
*/
void Moteur_Sens(int sens); void Moteur_Sens(int sens);
#endif #endif

View file

@ -3,7 +3,6 @@
#include "MyPWM.h" #include "MyPWM.h"
#include "MyUSART.h" #include "MyUSART.h"
#include "stm32f1xx_ll_bus.h" // Pour l'activation des horloges
#include "stm32f1xx_ll_tim.h" #include "stm32f1xx_ll_tim.h"
#include "stm32f1xx_ll_gpio.h" #include "stm32f1xx_ll_gpio.h"
#include "stm32f1xx_ll_usart.h" #include "stm32f1xx_ll_usart.h"
@ -12,68 +11,58 @@
void MyRF_Conf(void) { void MyRF_Conf(void) {
//RX //RX
//Activation horloge du GPIO //Configuration et lancement du Timer PWM Input
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);
LL_GPIO_InitTypeDef My_GPIO_Init_Struct;
LL_GPIO_StructInit(&My_GPIO_Init_Struct);
//PB.6 en floating input
My_GPIO_Init_Struct.Pin = PinCH1;
LL_GPIO_Init(GPIOIn, &My_GPIO_Init_Struct);
//PB.7 en floating input
My_GPIO_Init_Struct.Pin = PinCH2;
LL_GPIO_Init(GPIOIn, &My_GPIO_Init_Struct);
//Configuration et lancment du Timer PWM Input
MyTimer_Conf(TimerCC,0xFFAD,0x15); MyTimer_Conf(TimerCC,0xFFAD,0x15);
MyPWM_Conf_Input(TimerCC, channelCC1, channelCC2); MyPWM_Conf_Input(TimerCC, channelCC1, channelCC2);
MyTimer_Start(TimerCC); MyTimer_Start(TimerCC);
//TX //TX
//Activation horloge du GPIO
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
LL_GPIO_StructInit(&My_GPIO_Init_Struct);
//PA.9 en alternate output pp
My_GPIO_Init_Struct.Pin = PinOut;
My_GPIO_Init_Struct.Mode = LL_GPIO_MODE_ALTERNATE;
My_GPIO_Init_Struct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(GPIOOut, &My_GPIO_Init_Struct);
//PA.11 en output pp
My_GPIO_Init_Struct.Pin = PinTXEn;
My_GPIO_Init_Struct.Mode = LL_GPIO_MODE_OUTPUT;
My_GPIO_Init_Struct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(GPIOOut, &My_GPIO_Init_Struct);
//Configuration de l'USART //Configuration de l'USART
MyUSART_Conf(USARTOut, TransferDirTX); MyUSART_Conf(USARTOut, TransferDirTX);
} }
int MyRF_Input_Duty_Cycle(void) { int MyRF_Input_Duty_Cycle(void) {
int duty_cycle_RC = MyPWM_Duty_Cycle_Permilles(TimerCC, channelCC1, channelCC2); int duty_cycle_RC = MyPWM_Duty_Cycle_Permilles(TimerCC, channelCC1, channelCC2);
//Seuil de +-10% autour de la valeur centrale
if (74<duty_cycle_RC && duty_cycle_RC<77) { if (74<duty_cycle_RC && duty_cycle_RC<77) {
return 0; return 0;
} }
else { else {
//Conversion : 50 à 100 => -100 à 100
return (duty_cycle_RC - 75) * 4; return (duty_cycle_RC - 75) * 4;
} }
} }
void MyRF_Transmit_3s(void) { void MyRF_Transmit_3s(int bordage_pc, int angle_vent) {
//Récupérer : //Conversion bordage int => chaîne de char
char bordage[3] = ""; char bordage[3] = {bordage_pc/100+48,(bordage_pc%100-bordage_pc%10)/10+48,bordage_pc%100+48};
char heure[2] = "xx";
char min[2] = "xx";
char sec[2] = "xx";
int allure_ref = 3;
//Conversion angle du vent int => dénomination de l'allure
int allure_ref;
if(angle_vent <45) {
allure_ref = 0;
}
else if (angle_vent == 45) {
allure_ref = 1;
}
else if (angle_vent < 60) {
allure_ref = 2;
}
else if (angle_vent < 90) {
allure_ref = 3;
}
else if (angle_vent < 120) {
allure_ref = 4;
}
else if (angle_vent < 160) {
allure_ref = 5;
}
else {
allure_ref = 6;
}
char allure[7][16]= {"vent debout.", char allure[7][16]= {"vent debout.",
"au plus près.", "au plus près.",
"au près.", "au près.",
@ -82,12 +71,16 @@ void MyRF_Transmit_3s(void) {
"au grand largue.", "au grand largue.",
"au vent arrière." "au vent arrière."
}; };
char heure[2] = "xx";
char min[2] = "xx";
char sec[2] = "xx";
char data1[14] = "\" - Bordage : "; char data1[14] = "\" - Bordage : ";
char data2[24] = " === Le voilier navigue "; char data2[24] = " === Le voilier navigue ";
int i; int i;
//Activation de l'émetteur RF //Activation de l'émetteur RF
LL_GPIO_SetOutputPin(GPIOOut ,PinTXEn); LL_GPIO_SetOutputPin(GPIOOut ,PinTXEn);

View file

@ -1,29 +1,68 @@
#ifndef MYRF_H #ifndef MYRF_H
#define MYRF_H #define MYRF_H
/*
Driver permettant de communiquer via le module RF
La définition des pins utilisées est faites dans un autre fichier (GPIO.c)
RX :
- Timer 4
- Channels 1 et 2
- Broches PB.6 et PB.7
TX :
- USART1
- Broche PA.9 (Données) et PA.11 (Enable)
*/
#include "stm32f103xb.h" #include "stm32f103xb.h"
#define PinCH1 LL_GPIO_PIN_6
#define PinCH2 LL_GPIO_PIN_7
#define PinOut LL_GPIO_PIN_9
#define PinTXEn LL_GPIO_PIN_11
#define GPIOIn GPIOB
#define GPIOOut GPIOA #define GPIOOut GPIOA
#define PinTXEn LL_GPIO_PIN_11
#define TimerCC TIM4 #define TimerCC TIM4
#define channelCC1 LL_TIM_CHANNEL_CH1 #define channelCC1 LL_TIM_CHANNEL_CH1
#define channelCC2 LL_TIM_CHANNEL_CH2 #define channelCC2 LL_TIM_CHANNEL_CH2
#define USARTOut USART1 #define USARTOut USART1
#define TransferDirTX LL_USART_DIRECTION_TX #define TransferDirTX LL_USART_DIRECTION_TX
/**
* @brief Configure le module RF pour la RX et la TX (Timer4 en PWM In sur CH1/2 et USART1)
* @note À lancer en début de pgm
* @note Période TIM4 = 20ms, Transfer Dir USART = TX
* @param None
* @retval None
*/
void MyRF_Conf(void); void MyRF_Conf(void);
/**
* @brief Retourne le rapport cyclique de la PWM en provenance du récepteur RF
* @note Seuil de détection de +-10% autour du 0
* @param None
* @retval int : [-100; 100] pour correspondre à la plage du moteur
*/
int MyRF_Duty_Cycle_Moteur(void); int MyRF_Duty_Cycle_Moteur(void);
void MyRF_Transmit_3s(void); /**
* @brief Transmet un message via l'USART vers l'émetteur RF
* @note Message : "<h>h<min>'<sec>" - Bordage : <bordage>% === Le voilier navigue <allure>."
* @param int bordage_pc : pourcentage du bordage des voiles [0; 100]
* @param int angle_vent : angle du vent par rapport au bateau [0; 180]
* @retval None
*/
void MyRF_Transmit_3s(int bordage_pc, int angle_vent);
/**
* @brief Transmet un message via l'USART vers l'émetteur RF
* @note Message : "/!\ BATTERIE FAIBLE /!\"
* @param None
* @retval None
*/
void MyRF_Transmit_Batterie_Faible(void); void MyRF_Transmit_Batterie_Faible(void);
/**
* @brief Transmet un message via l'USART vers l'émetteur RF
* @note Message : "/!\ RISQUE DE CHAVIREMENT /!\"
* @param None
* @retval None
*/
void MyRF_Transmit_Limite_Roulis(void); void MyRF_Transmit_Limite_Roulis(void);
#endif #endif

View file

@ -1,7 +1,10 @@
#include "MySequencer.h" #include "MySequencer.h"
#include "MySysTick.h" #include "MySysTick.h"
#include "Moteur.h"
#include "MyRF.h"
#include "girouette.h"
int cnt_3sec = 0;
void MySequencer_Conf(void) { void MySequencer_Conf(void) {
@ -11,6 +14,35 @@ void MySequencer_Conf(void) {
} }
/**
* @brief Tâche à lancer toutes les 10ms
* @note None
* @param None
* @retval None
*/
void MySequencer_Task_10ms (void) { void MySequencer_Task_10ms (void) {
__nop();
//Incrémentation du compteur pour envoi toutes les 3 secondes
cnt_3sec++;
//Transmission données toutes les 3 secondes
if(cnt_3sec == 300) {
MyRF_Transmit_3s((int)((Calcul_pourcentage_duree()-5.0)*20.0), (int)(Angle_Vent()));
cnt_3sec = 0;
}
//Réglage sens et vitesse moteur
int Duty_Cycle = MyRF_Duty_Cycle_Moteur();
if (Duty_Cycle >= 0) {
Moteur_Speed(Duty_Cycle);
Moteur_Sens(1);
}
else {
Moteur_Speed(-Duty_Cycle);
Moteur_Sens(0);
}
} }

View file

@ -1,10 +1,20 @@
#ifndef MY_SEQ_H #ifndef MY_SEQ_H
#define MY_SEQ_H #define MY_SEQ_H
/*
Service qui gère le séquenceur principal du pgm
Permet la mise à jour des différentes données du pgm
S'appuie sur le SysTick, réglé pour interruption toutes les 10ms
*/
#include "stm32f103xb.h" #include "stm32f103xb.h"
/**
* @brief configure un séquenceur qui s'exécute toutes les 10ms
* @note Fct à lancer en début de programme
* @param None
* @retval None
*/
void MySequencer_Conf(void); void MySequencer_Conf(void);
void MySequencer_Task_10ms (void);
#endif #endif

248
Services/MyTimer.c Normal file
View file

@ -0,0 +1,248 @@
// TOUT A FAIRE !! //
/*
indispensable pour pouvoir adresser les registres des périphériques.
Rem : OBLIGATION d'utiliser les définitions utiles contenues dans ce fichier (ex : TIM_CR1_CEN, RCC_APB1ENR_TIM2EN ...)
pour une meilleure lisibilité du code.
Pour les masques, utiliser également les définitions proposée
Rappel : pour mettre à 1 , reg = reg | Mask (ou Mask est le représente le ou les bits à positionner à 1)
pour mettre à 0 , reg = reg&~ Mask (ou Mask est le représente le ou les bits à positionner à 0)
*/
#include "MyTimer.h"
#include "stm32f1xx_ll_bus.h" // Pour l'activation des horloges
#include "stm32f1xx_ll_tim.h"
// variable pointeur de fonction permettant de mémoriser le callback à appeler depuis
// le handler d'IT
void (*Ptr_ItFct_TIM1)(void);
void (*Ptr_ItFct_TIM2)(void);
void (*Ptr_ItFct_TIM3)(void);
void (*Ptr_ItFct_TIM4)(void);
/**
* @brief Active l'horloge et règle l'ARR et le PSC du timer visé
* @note Fonction à lancer avant toute autre. Le timer n'est pas encore lancé (voir MyTimerStart)
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
* int Arr : valeur à placer dans ARR
* int Psc : valeur à placer dans PSC
* @retval None
*/
void MyTimer_Conf(TIM_TypeDef * Timer)
{
LL_TIM_InitTypeDef My_LL_Tim_Init_Struct;
// Validation horloge locale
if (Timer==TIM1) LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_TIM1);
else if (Timer==TIM2) LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM2);
else if (Timer==TIM3) LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3);
else LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM4);
// chargement structure Arr, Psc, Up Count
My_LL_Tim_Init_Struct.Autoreload=0xFFFF;
My_LL_Tim_Init_Struct.Prescaler=0;
My_LL_Tim_Init_Struct.ClockDivision=LL_TIM_CLOCKDIVISION_DIV1;
My_LL_Tim_Init_Struct.CounterMode=LL_TIM_COUNTERMODE_UP;
My_LL_Tim_Init_Struct.RepetitionCounter=0;
LL_TIM_Init(Timer,&My_LL_Tim_Init_Struct);
// Blocage IT
LL_TIM_DisableIT_UPDATE(Timer);
// Blocage Timer
LL_TIM_DisableCounter(Timer);
}
//CONFIG Timer en compteur
void MyTimer_girouette_Conf(void)
{
LL_TIM_ENCODER_InitTypeDef My_LL_Tim_Init_Struct;
// Validation horloge locale
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM3);
LL_TIM_ENCODER_StructInit(&My_LL_Tim_Init_Struct);
LL_TIM_ENCODER_Init(TIM3, &My_LL_Tim_Init_Struct);
// Réglage Timer 3
LL_TIM_SetAutoReload(TIM3,0xFFFF);
LL_TIM_SetPrescaler(TIM3,0);
}
//CONFIG Timer en PWM
void MyPWM_Conf_Output(TIM_TypeDef *TIMx, uint32_t Channel)
{
LL_TIM_OC_InitTypeDef My_LL_Tim_OC_Init_Struct;
//Configuration du output channel en PWM
LL_TIM_OC_StructInit(&My_LL_Tim_OC_Init_Struct);
My_LL_Tim_OC_Init_Struct.OCMode = LL_TIM_OCMODE_PWM1;
LL_TIM_OC_Init(TIMx,Channel,&My_LL_Tim_OC_Init_Struct);
// Réglage Timer
LL_TIM_SetAutoReload(TIMx,0x707F);
LL_TIM_SetPrescaler(TIMx,0x31);
//Activation du channel (CH3) pour le timer considéré
LL_TIM_CC_EnableChannel(TIMx, Channel);
}
void MyPWM_Set_Impulse_Duration(TIM_TypeDef * Timer, int Percentage, int channel)
{
static uint32_t Val_ARR;
static uint32_t CompareValue;
Val_ARR = LL_TIM_GetAutoReload(Timer);
CompareValue = (Val_ARR * Percentage)/10000;
if (channel==LL_TIM_CHANNEL_CH1) LL_TIM_OC_SetCompareCH1(Timer, CompareValue);
else if (channel==LL_TIM_CHANNEL_CH2) LL_TIM_OC_SetCompareCH2(Timer, CompareValue);
else if (channel==LL_TIM_CHANNEL_CH3) LL_TIM_OC_SetCompareCH3(Timer, CompareValue);
else LL_TIM_OC_SetCompareCH4(Timer, CompareValue);
}
/**
* @brief PWM servo moteur
* @note
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
* @retval None
*/
void MyTimer_PWMservo_Conf(void)
{
MyPWM_Conf_Output(TIM4, LL_TIM_CHANNEL_CH3);
}
/**
* @brief Démarre le timer considéré
* @note
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
* @retval None
*/
void MyTimer_Start(TIM_TypeDef * Timer)
{
LL_TIM_EnableCounter(Timer);
}
/**
* @brief Arrêt le timer considéré
* @note
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
* @retval None
*/
void MyTimer_Stop(TIM_TypeDef * Timer)
{
LL_TIM_DisableCounter(Timer);
}
/**
* @brief Configure le Timer considéré en interruption sur débordement.
* @note A ce stade, les interruptions ne sont pas validés (voir MyTimer_IT_Enable )
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
* void (*IT_function) (void) : nom (adresse) de la fonction à lancer sur interruption
* int Prio : priorité associée à l'interruption
* @retval None
*/
void MyTimer_IT_Conf(TIM_TypeDef * Timer, void (*IT_function) (void),int Prio)
{
// affectation de la fonction
if (Timer==TIM1) Ptr_ItFct_TIM1=IT_function;
else if (Timer==TIM2) Ptr_ItFct_TIM2=IT_function;
else if (Timer==TIM3) Ptr_ItFct_TIM3=IT_function;
else Ptr_ItFct_TIM4=IT_function;
// Blocage IT (il faudra la débloquer voir fct suivante)
LL_TIM_DisableIT_UPDATE(Timer);
// validation du canal NVIC
IRQn_Type TIM_irq;
if (Timer==TIM1) TIM_irq=TIM1_UP_IRQn;
else if (Timer==TIM2) TIM_irq=TIM2_IRQn;
else if (Timer==TIM3) TIM_irq=TIM3_IRQn;
else TIM_irq=TIM4_IRQn;
NVIC_SetPriority(TIM_irq, Prio);
NVIC_EnableIRQ(TIM_irq);
}
/**
* @brief Autorise les interruptions
* @note
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
* @retval None
*/
void MyTimer_IT_Enable(TIM_TypeDef * Timer)
{
LL_TIM_EnableIT_UPDATE(Timer);
}
/**
* @brief Interdit les interruptions
* @note
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
* @retval None
*/
void MyTimer_IT_Disable(TIM_TypeDef * Timer)
{
LL_TIM_DisableIT_UPDATE(Timer);
}
/*
============ LES INTERRUPTIONS =================================
*/
void TIM1_UP_IRQHandler(void)
{
// rabaisser le flag d'IT
LL_TIM_ClearFlag_UPDATE(TIM1);
(*Ptr_ItFct_TIM1)();
}
void TIM2_IRQHandler(void)
{
// rabaisser le flag d'IT
LL_TIM_ClearFlag_UPDATE(TIM2);
(*Ptr_ItFct_TIM2)();
}
void TIM3_IRQHandler(void)
{
// rabaisser le flag d'IT
LL_TIM_ClearFlag_UPDATE(TIM3);
(*Ptr_ItFct_TIM3)();
}
void TIM4_IRQHandler(void)
{
// rabaisser le flag d'IT
LL_TIM_ClearFlag_UPDATE(TIM4);
(*Ptr_ItFct_TIM4)();
}

113
Services/girouette.c Normal file
View file

@ -0,0 +1,113 @@
#include "stm32f1xx_ll_gpio.h"
#include "girouette.h"
#include "MyTimer.h"
#include "stm32f1xx_ll_bus.h"
#include "stm32f1xx_ll_tim.h"
#include "stm32f1xx_ll_adc.h"
#include "stm32f1xx_ll_rcc.h"
//Configuration de l'interruption exterieure
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;
}
//Configuration de l'interruption du NVIC
void nvic_exti_conf(void){
NVIC->IP[23]=2<<4;
NVIC->ISER[0]=1<<23;
}
//redirection de l'interruption
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;
}
//configuration interruption + timer 3 en mode encodeur et 4 en mode PWM
void conf_girouette(void){
//interruption
exti_ref();
nvic_exti_conf();
//Timer en mode encodeur
MyTimer_girouette_Conf();
//Timer en mode PWM
MyPWM_Conf_Output(TIM1,LL_TIM_CHANNEL_CH1);
//Activation Timer 1
LL_TIM_EnableAllOutputs(TIM1);
}
//Calcul position-angle
float pos_Min=0;
float pos_Max=135;
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);
//Calcul pourcentage min et max
Pourcentage_Min=duree_Min/Periode;
Pourcentage_Max=duree_Max/Periode;
//Calcul fctn affine
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;
}
else if (pos_actuelle > 270){
duree_calc=duree_Max;
}
else {
duree_calc=duree_Min;
}
}
/*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;
}
else if (pos_actuelle < 450){
duree_calc=duree_Max;
}
else {
duree_calc=duree_Min;
}
}*/
//Calcul pourcentage
Pourcentage_calc=((Pourcentage_Max-Pourcentage_Min)/(duree_Max-duree_Min))*duree_calc;
return Pourcentage_calc;
}
float Angle_Vent(void) {
return pos_actuelle/2.0;
}

View file

@ -19,13 +19,12 @@
#include "stm32f1xx_ll_rcc.h" // utile dans la fonction SystemClock_Config #include "stm32f1xx_ll_rcc.h" // utile dans la fonction SystemClock_Config
#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
#include "stm32f1xx_ll_gpio.h"
#include "MyTimer.h"
#include "MyPWM.h"
#include "MyRF.h" #include "MyRF.h"
#include "Moteur.h" #include "Moteur.h"
#include "MySysTick.h"
#include "MySequencer.h" #include "MySequencer.h"
#include "girouette.h"
void SystemClock_Config(void); void SystemClock_Config(void);
@ -44,6 +43,7 @@ int main(void)
SystemClock_Config(); SystemClock_Config();
MyRF_Conf(); MyRF_Conf();
Moteur_Conf();
MySequencer_Conf(); MySequencer_Conf();
/* Infinite loop */ /* Infinite loop */