Comment. + début mise en commun (GPIO)
This commit is contained in:
parent
fc622094a9
commit
ebda31ee03
17 changed files with 884 additions and 153 deletions
|
@ -479,7 +479,7 @@
|
|||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>4</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\Services\MySequencer.c</PathWithFileName>
|
||||
|
@ -523,7 +523,7 @@
|
|||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>7</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\MyDrivers\MyUSART.c</PathWithFileName>
|
||||
|
@ -543,6 +543,18 @@
|
|||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</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>
|
||||
|
@ -553,7 +565,7 @@
|
|||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>9</FileNumber>
|
||||
<FileNumber>10</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -565,7 +577,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>10</FileNumber>
|
||||
<FileNumber>11</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -577,7 +589,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>11</FileNumber>
|
||||
<FileNumber>12</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -589,7 +601,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>12</FileNumber>
|
||||
<FileNumber>13</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -601,7 +613,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>13</FileNumber>
|
||||
<FileNumber>14</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -621,7 +633,7 @@
|
|||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>5</GroupNumber>
|
||||
<FileNumber>14</FileNumber>
|
||||
<FileNumber>15</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -641,7 +653,7 @@
|
|||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>15</FileNumber>
|
||||
<FileNumber>16</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
@ -661,7 +673,7 @@
|
|||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>16</FileNumber>
|
||||
<FileNumber>17</FileNumber>
|
||||
<FileType>2</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
|
@ -432,6 +432,11 @@
|
|||
<FileType>1</FileType>
|
||||
<FilePath>..\MyDrivers\MySysTick.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>GPIO.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\MyDrivers\GPIO.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
|
@ -925,6 +930,11 @@
|
|||
<FileType>1</FileType>
|
||||
<FilePath>..\MyDrivers\MySysTick.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>GPIO.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\MyDrivers\GPIO.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
|
|
168
MyDrivers/GPIO.c
Normal file
168
MyDrivers/GPIO.c
Normal 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
24
MyDrivers/GPIO.h
Normal 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
|
|
@ -1,15 +1,42 @@
|
|||
#ifndef MYPWM_H
|
||||
#define MYPWM_H
|
||||
|
||||
/*
|
||||
Driver pour la gestion de la PWM de Timers 1 à 4
|
||||
*/
|
||||
|
||||
#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);
|
||||
|
||||
/**
|
||||
* @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);
|
||||
|
||||
/**
|
||||
* @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);
|
||||
|
||||
/**
|
||||
* @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);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -3,12 +3,6 @@
|
|||
#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)
|
||||
{
|
||||
LL_USART_InitTypeDef My_LL_USART_Init_Struct;
|
||||
|
@ -34,38 +28,9 @@ void MyUSART_Conf(USART_TypeDef * USART, int TransferDir)
|
|||
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);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @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)
|
||||
void MyUSART_Transmit_Data_8b(USART_TypeDef * USART, char 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*/}
|
||||
}
|
||||
|
|
|
@ -3,42 +3,26 @@
|
|||
|
||||
/*
|
||||
Driver pour USART 1 à 3 du STM32F103RB
|
||||
|
||||
*/
|
||||
|
||||
#include "stm32f103xb.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
|
||||
* @note Fonction à lancer en début de pgm.
|
||||
* @param USART_TypeDef USART : indique l'usart à utiliser par le uC, USART1, USART2 ou USART3
|
||||
* @retval None
|
||||
*/
|
||||
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
|
||||
* @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
|
||||
*/
|
||||
void MyUSART_Transmit_Data_8b(USART_TypeDef * USART, int data);
|
||||
void MyUSART_Transmit_Data_8b(USART_TypeDef * USART, char data);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
101
Services/ADC_antichavirement.c
Normal file
101
Services/ADC_antichavirement.c
Normal 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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -14,31 +14,6 @@ void Moteur_Conf(void) {
|
|||
int Arr = 0x1C1F;
|
||||
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
|
||||
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM2);
|
||||
|
||||
|
@ -57,6 +32,7 @@ void Moteur_Conf(void) {
|
|||
void Moteur_Speed(int speedPercentage) {
|
||||
int Arr = 0x1C1F;
|
||||
|
||||
//Arrêt du Timer si pas de vitesse
|
||||
if(speedPercentage == 0) {
|
||||
MyTimer_Stop(TimerPWM);
|
||||
}
|
||||
|
|
|
@ -1,18 +1,47 @@
|
|||
#ifndef 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"
|
||||
|
||||
#define PinSens LL_GPIO_PIN_2
|
||||
#define PinPWM LL_GPIO_PIN_1
|
||||
#define GPIOPins GPIOA
|
||||
#define TimerPWM TIM2
|
||||
#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);
|
||||
|
||||
/**
|
||||
* @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);
|
||||
|
||||
/**
|
||||
* @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);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
#include "MyPWM.h"
|
||||
#include "MyUSART.h"
|
||||
|
||||
#include "stm32f1xx_ll_bus.h" // Pour l'activation des horloges
|
||||
#include "stm32f1xx_ll_tim.h"
|
||||
#include "stm32f1xx_ll_gpio.h"
|
||||
#include "stm32f1xx_ll_usart.h"
|
||||
|
@ -12,68 +11,58 @@
|
|||
void MyRF_Conf(void) {
|
||||
|
||||
//RX
|
||||
//Activation horloge du GPIO
|
||||
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
|
||||
//Configuration et lancement du Timer PWM Input
|
||||
MyTimer_Conf(TimerCC,0xFFAD,0x15);
|
||||
MyPWM_Conf_Input(TimerCC, channelCC1, channelCC2);
|
||||
MyTimer_Start(TimerCC);
|
||||
|
||||
//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
|
||||
MyUSART_Conf(USARTOut, TransferDirTX);
|
||||
|
||||
}
|
||||
|
||||
|
||||
int MyRF_Input_Duty_Cycle(void) {
|
||||
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) {
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
//Conversion : 50 à 100 => -100 à 100
|
||||
return (duty_cycle_RC - 75) * 4;
|
||||
}
|
||||
}
|
||||
|
||||
void MyRF_Transmit_3s(void) {
|
||||
void MyRF_Transmit_3s(int bordage_pc, int angle_vent) {
|
||||
|
||||
//Récupérer :
|
||||
char bordage[3] = "";
|
||||
char heure[2] = "xx";
|
||||
char min[2] = "xx";
|
||||
char sec[2] = "xx";
|
||||
int allure_ref = 3;
|
||||
//Conversion bordage int => chaîne de char
|
||||
char bordage[3] = {bordage_pc/100+48,(bordage_pc%100-bordage_pc%10)/10+48,bordage_pc%100+48};
|
||||
|
||||
//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.",
|
||||
"au plus près.",
|
||||
"au près.",
|
||||
|
@ -82,12 +71,16 @@ void MyRF_Transmit_3s(void) {
|
|||
"au grand largue.",
|
||||
"au vent arrière."
|
||||
};
|
||||
|
||||
char heure[2] = "xx";
|
||||
char min[2] = "xx";
|
||||
char sec[2] = "xx";
|
||||
|
||||
char data1[14] = "\" - Bordage : ";
|
||||
char data2[24] = " === Le voilier navigue ";
|
||||
|
||||
int i;
|
||||
|
||||
|
||||
|
||||
//Activation de l'émetteur RF
|
||||
LL_GPIO_SetOutputPin(GPIOOut ,PinTXEn);
|
||||
|
||||
|
|
|
@ -1,29 +1,68 @@
|
|||
#ifndef 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"
|
||||
|
||||
#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 PinTXEn LL_GPIO_PIN_11
|
||||
#define TimerCC TIM4
|
||||
#define channelCC1 LL_TIM_CHANNEL_CH1
|
||||
#define channelCC2 LL_TIM_CHANNEL_CH2
|
||||
#define USARTOut USART1
|
||||
#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);
|
||||
|
||||
/**
|
||||
* @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);
|
||||
|
||||
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);
|
||||
|
||||
/**
|
||||
* @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);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
#include "MySequencer.h"
|
||||
#include "MySysTick.h"
|
||||
#include "Moteur.h"
|
||||
#include "MyRF.h"
|
||||
#include "girouette.h"
|
||||
|
||||
|
||||
int cnt_3sec = 0;
|
||||
|
||||
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) {
|
||||
__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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -1,10 +1,20 @@
|
|||
#ifndef 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"
|
||||
|
||||
/**
|
||||
* @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_Task_10ms (void);
|
||||
|
||||
#endif
|
||||
|
|
248
Services/MyTimer.c
Normal file
248
Services/MyTimer.c
Normal 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
113
Services/girouette.c
Normal 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;
|
||||
}
|
|
@ -19,13 +19,12 @@
|
|||
#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_system.h" // utile dans la fonction SystemClock_Config
|
||||
#include "stm32f1xx_ll_gpio.h"
|
||||
#include "MyTimer.h"
|
||||
#include "MyPWM.h"
|
||||
|
||||
#include "MyRF.h"
|
||||
#include "Moteur.h"
|
||||
#include "MySysTick.h"
|
||||
#include "MySequencer.h"
|
||||
#include "girouette.h"
|
||||
|
||||
|
||||
void SystemClock_Config(void);
|
||||
|
||||
|
@ -44,6 +43,7 @@ int main(void)
|
|||
SystemClock_Config();
|
||||
|
||||
MyRF_Conf();
|
||||
Moteur_Conf();
|
||||
MySequencer_Conf();
|
||||
|
||||
/* Infinite loop */
|
||||
|
|
Loading…
Reference in a new issue