This commit is contained in:
Morgane Foussats 2020-11-15 16:53:43 +01:00
commit ae29b5de4a
18 changed files with 269 additions and 900 deletions

View file

@ -568,42 +568,6 @@
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>2</FileNumber> <FileNumber>2</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Services\Chrono.c</PathWithFileName>
<FilenameWithoutPath>Chrono.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>3</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Services\alimentation.c</PathWithFileName>
<FilenameWithoutPath>alimentation.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>4</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Services\accelerometer.c</PathWithFileName>
<FilenameWithoutPath>accelerometer.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>5</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2> <bDave2>0</bDave2>
@ -614,19 +578,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>6</FileNumber> <FileNumber>3</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Services\emetteur_rf.c</PathWithFileName>
<FilenameWithoutPath>emetteur_rf.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>7</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -638,7 +590,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>8</FileNumber> <FileNumber>4</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -650,7 +602,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>9</FileNumber> <FileNumber>5</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -662,7 +614,7 @@
</File> </File>
<File> <File>
<GroupNumber>2</GroupNumber> <GroupNumber>2</GroupNumber>
<FileNumber>10</FileNumber> <FileNumber>6</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -672,6 +624,42 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<bShared>0</bShared> <bShared>0</bShared>
</File> </File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>7</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Services\Accelerometer.c</PathWithFileName>
<FilenameWithoutPath>Accelerometer.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>8</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Services\Alimentation.c</PathWithFileName>
<FilenameWithoutPath>Alimentation.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>9</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Services\RFOutput.c</PathWithFileName>
<FilenameWithoutPath>RFOutput.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group> </Group>
<Group> <Group>
@ -680,18 +668,6 @@
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel> <cbSel>0</cbSel>
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>11</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\MyDrivers\MyTimer.c</PathWithFileName>
<FilenameWithoutPath>MyTimer.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group> </Group>
<Group> <Group>
@ -702,7 +678,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>12</FileNumber> <FileNumber>10</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -714,7 +690,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>13</FileNumber> <FileNumber>11</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -726,7 +702,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>14</FileNumber> <FileNumber>12</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -738,7 +714,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>15</FileNumber> <FileNumber>13</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -750,7 +726,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>16</FileNumber> <FileNumber>14</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -762,7 +738,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>17</FileNumber> <FileNumber>15</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -774,7 +750,7 @@
</File> </File>
<File> <File>
<GroupNumber>4</GroupNumber> <GroupNumber>4</GroupNumber>
<FileNumber>18</FileNumber> <FileNumber>16</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -794,7 +770,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>5</GroupNumber> <GroupNumber>5</GroupNumber>
<FileNumber>19</FileNumber> <FileNumber>17</FileNumber>
<FileType>5</FileType> <FileType>5</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -814,7 +790,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>20</FileNumber> <FileNumber>18</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -834,7 +810,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>7</GroupNumber> <GroupNumber>7</GroupNumber>
<FileNumber>21</FileNumber> <FileNumber>19</FileNumber>
<FileType>2</FileType> <FileType>2</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>

View file

@ -185,6 +185,7 @@
<uocXRam>0</uocXRam> <uocXRam>0</uocXRam>
<RvdsVP>0</RvdsVP> <RvdsVP>0</RvdsVP>
<RvdsMve>0</RvdsMve> <RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp>
<hadIRAM2>0</hadIRAM2> <hadIRAM2>0</hadIRAM2>
<hadIROM2>0</hadIROM2> <hadIROM2>0</hadIROM2>
<StupSel>8</StupSel> <StupSel>8</StupSel>
@ -351,7 +352,7 @@
<NoWarn>0</NoWarn> <NoWarn>0</NoWarn>
<uSurpInc>0</uSurpInc> <uSurpInc>0</uSurpInc>
<useXO>0</useXO> <useXO>0</useXO>
<uClangAs>0</uClangAs> <ClangAsOpt>4</ClangAsOpt>
<VariousControls> <VariousControls>
<MiscControls></MiscControls> <MiscControls></MiscControls>
<Define></Define> <Define></Define>
@ -392,31 +393,11 @@
<Group> <Group>
<GroupName>User Services</GroupName> <GroupName>User Services</GroupName>
<Files> <Files>
<File>
<FileName>Chrono.c</FileName>
<FileType>1</FileType>
<FilePath>..\Services\Chrono.c</FilePath>
</File>
<File>
<FileName>alimentation.c</FileName>
<FileType>1</FileType>
<FilePath>..\Services\alimentation.c</FilePath>
</File>
<File>
<FileName>accelerometer.c</FileName>
<FileType>1</FileType>
<FilePath>..\Services\accelerometer.c</FilePath>
</File>
<File> <File>
<FileName>DcMotor.c</FileName> <FileName>DcMotor.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\Services\DcMotor.c</FilePath> <FilePath>..\Services\DcMotor.c</FilePath>
</File> </File>
<File>
<FileName>emetteur_rf.c</FileName>
<FileType>1</FileType>
<FilePath>..\Services\emetteur_rf.c</FilePath>
</File>
<File> <File>
<FileName>IncrEncoder.c</FileName> <FileName>IncrEncoder.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
@ -437,17 +418,25 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\Services\Servo.c</FilePath> <FilePath>..\Services\Servo.c</FilePath>
</File> </File>
<File>
<FileName>Accelerometer.c</FileName>
<FileType>1</FileType>
<FilePath>..\Services\Accelerometer.c</FilePath>
</File>
<File>
<FileName>Alimentation.c</FileName>
<FileType>1</FileType>
<FilePath>..\Services\Alimentation.c</FilePath>
</File>
<File>
<FileName>RFOutput.c</FileName>
<FileType>1</FileType>
<FilePath>..\Services\RFOutput.c</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>
<GroupName>MyDrivers</GroupName> <GroupName>MyDrivers</GroupName>
<Files>
<File>
<FileName>MyTimer.c</FileName>
<FileType>1</FileType>
<FilePath>..\MyDrivers\MyTimer.c</FilePath>
</File>
</Files>
</Group> </Group>
<Group> <Group>
<GroupName>Drivers/STM32f1xx_LL_Driver</GroupName> <GroupName>Drivers/STM32f1xx_LL_Driver</GroupName>
@ -703,6 +692,7 @@
<uocXRam>0</uocXRam> <uocXRam>0</uocXRam>
<RvdsVP>0</RvdsVP> <RvdsVP>0</RvdsVP>
<RvdsMve>0</RvdsMve> <RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp>
<hadIRAM2>0</hadIRAM2> <hadIRAM2>0</hadIRAM2>
<hadIROM2>0</hadIROM2> <hadIROM2>0</hadIROM2>
<StupSel>8</StupSel> <StupSel>8</StupSel>
@ -869,7 +859,7 @@
<NoWarn>0</NoWarn> <NoWarn>0</NoWarn>
<uSurpInc>0</uSurpInc> <uSurpInc>0</uSurpInc>
<useXO>0</useXO> <useXO>0</useXO>
<uClangAs>0</uClangAs> <ClangAsOpt>4</ClangAsOpt>
<VariousControls> <VariousControls>
<MiscControls></MiscControls> <MiscControls></MiscControls>
<Define></Define> <Define></Define>
@ -910,31 +900,11 @@
<Group> <Group>
<GroupName>User Services</GroupName> <GroupName>User Services</GroupName>
<Files> <Files>
<File>
<FileName>Chrono.c</FileName>
<FileType>1</FileType>
<FilePath>..\Services\Chrono.c</FilePath>
</File>
<File>
<FileName>alimentation.c</FileName>
<FileType>1</FileType>
<FilePath>..\Services\alimentation.c</FilePath>
</File>
<File>
<FileName>accelerometer.c</FileName>
<FileType>1</FileType>
<FilePath>..\Services\accelerometer.c</FilePath>
</File>
<File> <File>
<FileName>DcMotor.c</FileName> <FileName>DcMotor.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\Services\DcMotor.c</FilePath> <FilePath>..\Services\DcMotor.c</FilePath>
</File> </File>
<File>
<FileName>emetteur_rf.c</FileName>
<FileType>1</FileType>
<FilePath>..\Services\emetteur_rf.c</FilePath>
</File>
<File> <File>
<FileName>IncrEncoder.c</FileName> <FileName>IncrEncoder.c</FileName>
<FileType>1</FileType> <FileType>1</FileType>
@ -955,17 +925,25 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\Services\Servo.c</FilePath> <FilePath>..\Services\Servo.c</FilePath>
</File> </File>
<File>
<FileName>Accelerometer.c</FileName>
<FileType>1</FileType>
<FilePath>..\Services\Accelerometer.c</FilePath>
</File>
<File>
<FileName>Alimentation.c</FileName>
<FileType>1</FileType>
<FilePath>..\Services\Alimentation.c</FilePath>
</File>
<File>
<FileName>RFOutput.c</FileName>
<FileType>1</FileType>
<FilePath>..\Services\RFOutput.c</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>
<GroupName>MyDrivers</GroupName> <GroupName>MyDrivers</GroupName>
<Files>
<File>
<FileName>MyTimer.c</FileName>
<FileType>1</FileType>
<FilePath>..\MyDrivers\MyTimer.c</FilePath>
</File>
</Files>
</Group> </Group>
<Group> <Group>
<GroupName>Drivers/STM32f1xx_LL_Driver</GroupName> <GroupName>Drivers/STM32f1xx_LL_Driver</GroupName>
@ -1058,4 +1036,19 @@
<files/> <files/>
</RTE> </RTE>
<LayerInfo>
<Layers>
<Layer>
<LayName>&lt;Project Info&gt;</LayName>
<LayDesc></LayDesc>
<LayUrl></LayUrl>
<LayKeys></LayKeys>
<LayCat></LayCat>
<LayLic></LayLic>
<LayTarg>0</LayTarg>
<LayPrjMark>1</LayPrjMark>
</Layer>
</Layers>
</LayerInfo>
</Project> </Project>

View file

@ -1,182 +0,0 @@
// 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,int Arr, int Psc)
{
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=Arr;
My_LL_Tim_Init_Struct.Prescaler=Psc;
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);
}
/**
* @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)();
}

View file

@ -1,70 +0,0 @@
// RIEN A MODIFIER //
#ifndef MY_TIMER_H
#define MY_TIMER_H
/*
Driver pour Timer 1 à 4 du STM32F103RB
*/
#include "stm32f103xb.h"
/**
* @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,int Arr, int Psc);
/**
* @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);
/**
* @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);
/**
* @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);
/**
* @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);
/**
* @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);
#endif

View file

@ -1,67 +0,0 @@
#include "MyUart.h"
#include "stm32f1xx_ll_bus.h"
#include "stm32f1xx_ll_usart.h"
#include "stm32f1xx_ll_gpio.h"
void MyUart_Conf(USART_TypeDef * uart_port, int baudrate){
LL_USART_InitTypeDef My_LL_Usart_Init_Struct;
if (uart_port==USART1) {
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
LL_GPIO_InitTypeDef tx;
tx.Mode = LL_GPIO_MODE_ALTERNATE;
tx.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
tx.Speed = LL_GPIO_SPEED_FREQ_LOW;
tx.Pin = LL_GPIO_PIN_9;
LL_GPIO_Init(GPIOA, &tx);
}
if (uart_port==USART2){
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART2);
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
LL_GPIO_InitTypeDef tx;
tx.Mode = LL_GPIO_MODE_ALTERNATE;
tx.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
tx.Pull = LL_GPIO_PULL_UP;
tx.Speed = LL_GPIO_SPEED_FREQ_LOW;
tx.Pin = LL_GPIO_PIN_2;
LL_GPIO_Init(GPIOA, &tx);
}
if (uart_port==USART3){
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART3);
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC);
LL_GPIO_InitTypeDef tx;
tx.Mode = LL_GPIO_MODE_ALTERNATE;
tx.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
tx.Pull = LL_GPIO_PULL_UP;
tx.Speed = LL_GPIO_SPEED_FREQ_LOW;
tx.Pin = LL_GPIO_PIN_10;
LL_GPIO_Init(GPIOC, &tx);
}
My_LL_Usart_Init_Struct.BaudRate = baudrate;
My_LL_Usart_Init_Struct.DataWidth = LL_USART_DATAWIDTH_8B ;
My_LL_Usart_Init_Struct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
My_LL_Usart_Init_Struct.OverSampling = LL_USART_OVERSAMPLING_16;
My_LL_Usart_Init_Struct.Parity = LL_USART_PARITY_NONE;
My_LL_Usart_Init_Struct.StopBits = LL_USART_STOPBITS_1;
My_LL_Usart_Init_Struct.TransferDirection = LL_USART_DIRECTION_TX_RX ;
LL_USART_Init(uart_port,&My_LL_Usart_Init_Struct);
LL_USART_Enable(uart_port);
/*int periph_speed;
if (uart_port==USART1) periph_speed = 36000000;
if (uart_port==USART2) periph_speed = 72000000;
if (uart_port==USART3) periph_speed = 72000000;
LL_USART_SetBaudRate(uart_port, periph_speed, baudrate);
*/}
void MyUart_send_bytes(USART_TypeDef * uart_port,char* buf, int len){
for(int i = 0; i < len; i++){
LL_USART_TransmitData8(uart_port, buf[i]);
while(!LL_USART_IsActiveFlag_TXE(uart_port));
}
}

View file

@ -1,10 +0,0 @@
#ifndef MYUART_H
#define MYUART_H
#include "stm32f1xx_ll_usart.h"
void MyUart_Conf(USART_TypeDef * uart_port, int baudrate);
void MyUart_send_bytes(USART_TypeDef * uart_port,char* buf, int len);
#endif

View file

@ -1,9 +1,6 @@
#include "accelerometer.h" #include "Accelerometer.h"
double x;
double y;
double angle;
void accelero_init(void){ void ACCELEROMETER_Init(void){
RCC -> CFGR |= (0x1<<15); RCC -> CFGR |= (0x1<<15);
RCC-> CFGR &= ~ (0x1<<14); RCC-> CFGR &= ~ (0x1<<14);
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC1); LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC1);
@ -24,7 +21,6 @@ void accelero_init(void){
LL_GPIO_Init(GPIOA, &pc1); LL_GPIO_Init(GPIOA, &pc1);
adc.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT; adc.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;
adc.SequencersScanMode = LL_ADC_SEQ_SCAN_DISABLE; adc.SequencersScanMode = LL_ADC_SEQ_SCAN_DISABLE;
LL_ADC_Init(ADC1, &adc); LL_ADC_Init(ADC1, &adc);
@ -35,55 +31,37 @@ void accelero_init(void){
adcReg.ContinuousMode = LL_ADC_REG_CONV_SINGLE; adcReg.ContinuousMode = LL_ADC_REG_CONV_SINGLE;
adcReg.DMATransfer = LL_ADC_REG_DMA_TRANSFER_NONE; adcReg.DMATransfer = LL_ADC_REG_DMA_TRANSFER_NONE;
LL_ADC_REG_Init(ADC1, &adcReg); LL_ADC_REG_Init(ADC1, &adcReg);
/*LL_ADC_SetChannelSamplingTime(ADC2, LL_ADC_CHANNEL_10, LL_ADC_SAMPLINGTIME_1CYCLE_5);
LL_ADC_SetChannelSamplingTime(ADC2, LL_ADC_CHANNEL_11, LL_ADC_SAMPLINGTIME_1CYCLE_5);
*/
LL_ADC_Enable(ADC1); LL_ADC_Enable(ADC1);
//LL_ADC_EnableIT_EOS(ADC1);
//wait 0,2 µs, calibration is advised
//LL_ADC_StartCalibration(ADC1);
} }
double ACCELEROMETER_GetX(void){
double accelero_get_x(void){
LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_1); LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_1);
LL_ADC_REG_StartConversionSWStart(ADC1); LL_ADC_REG_StartConversionSWStart(ADC1);
while (LL_ADC_IsActiveFlag_EOS(ADC1) != 1){ while (LL_ADC_IsActiveFlag_EOS(ADC1) != 1);
//__asm__"nope";
}
double x= LL_ADC_REG_ReadConversionData12(ADC1); double x= LL_ADC_REG_ReadConversionData12(ADC1);
return x; return x;
} }
double accelero_get_y(void){ double ACCELEROMETER_GetY(void){
LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_11); LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_11);
LL_ADC_REG_StartConversionSWStart(ADC1); LL_ADC_REG_StartConversionSWStart(ADC1);
while (LL_ADC_IsActiveFlag_EOS(ADC1) != 1){ while (LL_ADC_IsActiveFlag_EOS(ADC1) != 1);
//__asm__"nope";
}
double y = LL_ADC_REG_ReadConversionData12(ADC1); double y = LL_ADC_REG_ReadConversionData12(ADC1);
return y; return y;
} }
int ACCELEROMETER_AngleGood(void){
int accelero_angle_bon(void){ double x = ACCELEROMETER_GetX();
x = accelero_get_x(); double y = ACCELEROMETER_GetY();
y = accelero_get_y(); double angle = x/y;
angle = x/y;
if (angle>tan(0.698132)){ if (angle>tan(0.698132)){
return 0; return 0;
}else { }else {
return 1; return 1;
} }
//le flag EOC n'est jamais mis à un .... //le flag EOC n'est jamais mis à un ....
// Soit la conversion est mal faite soit on n'utilise pas bien la simulation // Soit la conversion est mal faite soit on n'utilise pas bien la simulation
//soit on n'utilise pas bien isActiveFlag dans la boucle //soit on n'utilise pas bien isActiveFlag dans la boucle
} }

View file

@ -18,13 +18,13 @@
Les fonctions qui gèrent les IO (ajout par rapport à l'activité 1) Les fonctions qui gèrent les IO (ajout par rapport à l'activité 1)
=======================================================================================*/ =======================================================================================*/
void accelero_init(void); void ACCELEROMETER_Init(void);
double accelero_get_x(void); double ACCELEROMETER_GetX(void);
double accelero_get_y(void); double ACCELEROMETER_GetY(void);
int accelero_angle_bon(void); int ACCELEROMETER_AngleGood(void);
#endif #endif

View file

@ -0,0 +1,53 @@
#include "Alimentation.h"
void ALIMENTATION_Init(void){
RCC -> CFGR |= (0x1<<15);
RCC-> CFGR &= ~ (0x1<<14);
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC1);
LL_APB1_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC);
LL_GPIO_InitTypeDef pc2;
LL_ADC_InitTypeDef adc;
LL_ADC_REG_InitTypeDef adcReg;
LL_GPIO_StructInit(&pc2);
pc2.Pin = LL_GPIO_PIN_0;
pc2.Mode = LL_GPIO_MODE_ANALOG;
LL_GPIO_Init(GPIOC, &pc2);
adc.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;
adc.SequencersScanMode = LL_ADC_SEQ_SCAN_DISABLE;
LL_ADC_Init(ADC1, &adc);
adcReg.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE ;
adcReg.SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE;
adcReg.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;
adcReg.ContinuousMode = LL_ADC_REG_CONV_SINGLE;
adcReg.DMATransfer = LL_ADC_REG_DMA_TRANSFER_NONE;
LL_ADC_REG_Init(ADC1, &adcReg);
LL_ADC_Enable(ADC1);
}
float ALIMENTATION_GetBatteryLevel(void){
float u2;
float battery_level;
LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_12);
LL_ADC_REG_StartConversionSWStart(ADC1);
while (LL_ADC_IsActiveFlag_EOS(ADC1) != 1);
battery_level = LL_ADC_REG_ReadConversionData12(ADC1);
u2 = (battery_level*3.3)/4095.0;
float level = u2*13.0;
return level;
}
int ALIMENTATION_IsLevelEnough(void){
if (ALIMENTATION_GetBatteryLevel()<(0.8*12)){
return 0;
}else{
return 1;
}
}

View file

@ -18,9 +18,9 @@
Les fonctions qui gèrent les IO (ajout par rapport à l'activité 1) Les fonctions qui gèrent les IO (ajout par rapport à l'activité 1)
=======================================================================================*/ =======================================================================================*/
void alimentation_init(void); void ALIMENTATION_Init(void);
float get_battery_level(void); float ALIMENTATION_GetBatteryLevel(void);
int is_level_enough(void); int ALIMENTATION_IsLevelEnough(void);
#endif #endif

View file

@ -1,182 +0,0 @@
// A COMPLETER
/*
Service permettant de chornométrer jusqu'à 59mn 59s 99 1/100
Utilise un timer au choix (TIMER1 à TIMER4).
Utilise la lib MyTimers.h /.c
*/
#include "Chrono.h"
#include "MyTimer.h"
#include "stm32f1xx_ll_gpio.h"
#include "stm32f1xx_ll_bus.h"
// variable privée de type Time qui mémorise la durée mesurée
static Time Chrono_Time; // rem : static rend la visibilité de la variable Chrono_Time limitée à ce fichier
// variable privée qui mémorise pour le module le timer utilisé par le module
static TIM_TypeDef * Chrono_Timer=TIM1; // init par défaut au cas où l'utilisateur ne lance pas Chrono_Conf avant toute autre fct.
// déclaration callback appelé toute les 10ms
void Chrono_Task_10ms(void);
int running = 0;
/**
* @brief Configure le chronomètre.
* @note A lancer avant toute autre fonction.
* @param Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
* @retval None
*/
void Chrono_Conf(TIM_TypeDef * Timer)
{
// Reset Time
Chrono_Time.Hund=0;
Chrono_Time.Sec=0;
Chrono_Time.Min=0;
// Fixation du Timer
Chrono_Timer=Timer;
Chrono_Conf_io();
// Réglage Timer pour un débordement à 10ms
MyTimer_Conf(Chrono_Timer,999, 719);
// Réglage interruption du Timer avec callback : Chrono_Task_10ms()
MyTimer_IT_Conf(Chrono_Timer, Chrono_Task_10ms,3);
// Validation IT
MyTimer_IT_Enable(Chrono_Timer);
}
/**
* @brief Démarre le chronomètre.
* @note si la durée dépasse 59mn 59sec 99 Hund, elle est remise à zéro et repart
* @param Aucun
* @retval Aucun
*/
void Chrono_Start(void)
{
MyTimer_Start(Chrono_Timer);
running = 1;
}
/**
* @brief Arrête le chronomètre.
* @note
* @param Aucun
* @retval Aucun
*/
void Chrono_Stop(void)
{
MyTimer_Stop(Chrono_Timer);
running = 0;
}
/**
* @brief Remet le chronomètre à 0
* @note
* @param Aucun
* @retval Aucun
*/
void Chrono_Reset(void)
{
// Arrêt Chrono
MyTimer_Stop(Chrono_Timer);
// Reset Time
Chrono_Time.Hund=0;
Chrono_Time.Sec=0;
Chrono_Time.Min=0;
}
/**
* @brief Renvoie l'adresse de la variable Time privée gérée dans le module Chrono.c
* @note
* @param Aucun
* @retval adresse de la variable Time
*/
Time * Chrono_Read(void)
{
return &Chrono_Time;
}
/**
* @brief incrémente la variable privée Chron_Time modulo 60mn
* @note
* @param Aucun
* @retval Aucun
*/
void Chrono_Task_10ms(void)
{
Chrono_Time.Hund++;
if (Chrono_Time.Hund==100)
{
Chrono_Time.Sec++;
Chrono_Time.Hund=0;
}
if (Chrono_Time.Sec==60)
{
Chrono_Time.Min++;
Chrono_Time.Sec=0;
}
if (Chrono_Time.Min==60)
{
Chrono_Time.Hund=0;
}
if ( Chrono_Time.Sec % 2) {
LL_GPIO_SetOutputPin(GPIOC,LL_GPIO_PIN_10);
} else {
LL_GPIO_ResetOutputPin(GPIOC,LL_GPIO_PIN_10);
}
}
/**
* @brief configurer les 3 IO pour recevoir les 2 BP et la LED
*/
void Chrono_Conf_io(void) {
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC);
LL_GPIO_InitTypeDef button_rouge_conf;
button_rouge_conf.Mode = LL_GPIO_MODE_FLOATING;
button_rouge_conf.Pin = LL_GPIO_PIN_8;
LL_GPIO_Init(GPIOC, &button_rouge_conf);
LL_GPIO_InitTypeDef button_bleu_conf;
button_bleu_conf.Mode = LL_GPIO_MODE_FLOATING;
button_bleu_conf.Pin = LL_GPIO_PIN_13;
LL_GPIO_Init(GPIOC, &button_bleu_conf);
LL_GPIO_InitTypeDef led;
led.Mode = LL_GPIO_MODE_OUTPUT;
led.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
led.Speed = LL_GPIO_SPEED_FREQ_LOW;
led.Pin = LL_GPIO_PIN_10;
LL_GPIO_Init(GPIOC, &led);
}
void Chrono_Background(void){
if(LL_GPIO_IsInputPinSet(GPIOC, LL_GPIO_PIN_8)) {
if(running) {
Chrono_Stop();
} else {
Chrono_Start();
}
}
if(!(LL_GPIO_IsInputPinSet(GPIOC, LL_GPIO_PIN_13))) { // negative logic for blue button
Chrono_Reset();
}
}

View file

@ -1,107 +0,0 @@
// RIEN A MODIFIER //
#ifndef CHRONO_H
#define CHRONO_H
/*
Service permettant de chornométrer jusqu'à 59mn 59s 99 1/100
Utilise un timer au choix (TIMER1 à TIMER4).
Utilise la lib MyTimers.h /.c
*/
#include "stm32f103xb.h"
/* =====================================================================================
Les fonctions qui gèrent les IO (ajout par rapport à l'activité 1)
=======================================================================================*/
#define PinStart LL_GPIO_PIN_8
#define PinStop LL_GPIO_PIN_6
// à compléter pour la pin reset du chronometre
#define PinLED LL_GPIO_PIN_10
#define GPIO_Pin GPIOC
#define GPIO_LED GPIOC
/**
* @brief polle les 3 entrées et gènère les actions à faire
* @note Fct à lancer en tâche de fond (non bloquante)
* @param None
* @retval None
*/
void Chrono_Background(void);
//=======================================================================================//
// Type de donnée utilisé dans le module
typedef struct {
char Hund;
char Sec;
char Min;
} Time;
/**
* @brief Configure le chronomètre.
* @note A lancer avant toute autre fonction.
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
* @retval None
*/
void Chrono_Conf(TIM_TypeDef * Timer);
/**
* @brief Démarre le chronomètre.
* @note si la durée dépasse 59mn 59sec 99 cent, elle est remise à zéro et repart
* @param Aucun
* @retval Aucun
*/
void Chrono_Start(void);
/**
* @brief Arrête le chronomètre.
* @note
* @param Aucun
* @retval Aucun
*/
void Chrono_Stop(void);
/**
* @brief Remet le chronomètre à 0
* @note
* @param Aucun
* @retval Aucun
*/
void Chrono_Reset(void);
/**
* @brief Renvoie l'adresse de la variable Time privée gérée dans le module Chrono.c
* @note
* @param Aucun
* @retval adresse de la variable Time
*/
Time * Chrono_Read(void);
void Chrono_Conf_io(void);
void Chrono_Background(void);
#endif

View file

@ -1,9 +1,17 @@
#include <stdlib.h>
#include <math.h>
#include "IncrEncoder.h" #include "IncrEncoder.h"
#include "stm32f1xx_ll_gpio.h" #include "stm32f1xx_ll_gpio.h"
#include "stm32f1xx_ll_bus.h" #include "stm32f1xx_ll_bus.h"
#include "stm32f1xx_ll_exti.h" #include "stm32f1xx_ll_exti.h"
#include "stm32f1xx_ll_tim.h" #include "stm32f1xx_ll_tim.h"
#define RESOLUTION 1
#define ANGLE_DEBUT 45
#define INCR_ENCODER_MID_VALUE 719
int index_passed = 0; int index_passed = 0;
int counts_per_revolution = 360; int counts_per_revolution = 360;
@ -78,6 +86,7 @@ void INCR_ENCODER_Init(void){
} }
void EXTI9_5_IRQHandler(void){ void EXTI9_5_IRQHandler(void){
index_passed = 1; index_passed = 1;
// reset counter = encoder position to 0 position // reset counter = encoder position to 0 position
LL_TIM_WriteReg(TIM3,CNT,0); LL_TIM_WriteReg(TIM3,CNT,0);
@ -94,5 +103,15 @@ int INCR_ENCODER_IsAbsolute(void)
int INCR_ENCODER_GetAngle(void) int INCR_ENCODER_GetAngle(void)
{ {
return LL_TIM_ReadReg(TIM3,CNT); int counter_value = LL_TIM_ReadReg(TIM3, CNT);
float vabs = abs(counter_value-INCR_ENCODER_MID_VALUE);
float vIEAngleDebut = INCR_ENCODER_MID_VALUE -(ANGLE_DEBUT*4);
float nbIncrements = 90/RESOLUTION;
if(vabs > vIEAngleDebut)
{
return 0;
}else{
return 90 - RESOLUTION*floor(vabs/(vIEAngleDebut/nbIncrements) ) ;
}
}; };

View file

@ -1,5 +1,5 @@
#ifndef INCR_ENCODER #ifndef INCR_ENCODER
//codé par Kévin Cavailles et Jasper Güldenstein
/** /**
*/ */
void INCR_ENCODER_Init(void); void INCR_ENCODER_Init(void);

View file

@ -1,6 +1,9 @@
#include "emetteur_rf.h" #include "RFOutput.h"
#include <stdio.h>
void emetteur_rf_init(void){ char RF_OUTPUT_buf[100];
void RF_OUTPUT_Init(void){
LL_USART_InitTypeDef My_LL_Usart_Init_Struct; LL_USART_InitTypeDef My_LL_Usart_Init_Struct;
@ -34,19 +37,19 @@ void emetteur_rf_init(void){
LL_USART_Init(USART1,&My_LL_Usart_Init_Struct); LL_USART_Init(USART1,&My_LL_Usart_Init_Struct);
LL_USART_Enable(USART1); LL_USART_Enable(USART1);
/*int periph_speed;
if (uart_port==USART1) periph_speed = 36000000;
if (uart_port==USART2) periph_speed = 72000000;
if (uart_port==USART3) periph_speed = 72000000;
LL_USART_SetBaudRate(uart_port, periph_speed, baudrate);
*/}
void emetteur_send_bytes(USART_TypeDef * uart_port,char* buf, int len){
for(int i = 0; i < len; i++){
LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_11);
LL_USART_TransmitData8(uart_port, buf[i]);
while(!LL_USART_IsActiveFlag_TXE(uart_port));
LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_11);
} }
void RF_OUTPUT_SendBytes(char* buf, int len){
LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_11);
for(int i = 0; i < len; i++){
LL_USART_TransmitData8(USART1, buf[i]);
while(!LL_USART_IsActiveFlag_TXE(USART1));
}
LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_11);
}
void RF_OUTPUT_SendMessage(int rouli_bon, int alimentation_bon, float angle_voile){
int len = sprintf(RF_OUTPUT_buf, "Alim bon: %d, Rouli bon: %d, Angle de voile: %2f\r\n", alimentation_bon, rouli_bon, angle_voile);
RF_OUTPUT_SendBytes(RF_OUTPUT_buf, len);
} }

View file

@ -7,8 +7,9 @@
#include "stm32f1xx_ll_usart.h" #include "stm32f1xx_ll_usart.h"
#include "stm32f1xx_ll_gpio.h" #include "stm32f1xx_ll_gpio.h"
void emetteur_rf_init(void); void RF_OUTPUT_Init(void);
void emetteur_send_bytes(USART_TypeDef * uart_port,char* buf, int len); void RF_OUTPUT_SendBytes(char* buf, int len);
void RF_OUTPUT_SendMessage(int rouli_bon, int alimentation_bon, float angle_voile);

View file

@ -1,63 +0,0 @@
#include "alimentation.h"
void alimentation_init(void){
RCC -> CFGR |= (0x1<<15);
RCC-> CFGR &= ~ (0x1<<14);
LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC1);
LL_APB1_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC);
LL_GPIO_InitTypeDef pc2;
LL_ADC_InitTypeDef adc;
LL_ADC_REG_InitTypeDef adcReg;
LL_GPIO_StructInit(&pc2);
pc2.Pin = LL_GPIO_PIN_0;
pc2.Mode = LL_GPIO_MODE_ANALOG;
LL_GPIO_Init(GPIOC, &pc2);
adc.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;
adc.SequencersScanMode = LL_ADC_SEQ_SCAN_DISABLE;
LL_ADC_Init(ADC1, &adc);
adcReg.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE ;
adcReg.SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE;
adcReg.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;
adcReg.ContinuousMode = LL_ADC_REG_CONV_SINGLE;
adcReg.DMATransfer = LL_ADC_REG_DMA_TRANSFER_NONE;
LL_ADC_REG_Init(ADC1, &adcReg);
/*LL_ADC_SetChannelSamplingTime(ADC2, LL_ADC_CHANNEL_10, LL_ADC_SAMPLINGTIME_1CYCLE_5);
LL_ADC_SetChannelSamplingTime(ADC2, LL_ADC_CHANNEL_11, LL_ADC_SAMPLINGTIME_1CYCLE_5);
*/
LL_ADC_Enable(ADC1);
//LL_ADC_EnableIT_EOS(ADC1);
//wait 0,2 µs, calibration is advised
//LL_ADC_StartCalibration(ADC1);
}
float u2;
unsigned int niv_batterie;
float battery_level;
float get_battery_level(void){
LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_12);
LL_ADC_REG_StartConversionSWStart(ADC1);
while (LL_ADC_IsActiveFlag_EOS(ADC1) != 1);
battery_level = LL_ADC_REG_ReadConversionData12(ADC1);
u2 = (battery_level*3.3)/4095.0;
float level = u2*13.0;
return level;
}
int is_level_enough(void){
if (get_battery_level()<(0.8*12)){
return 0;
}else{
return 1;
}
}

View file

@ -21,62 +21,89 @@
#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_bus.h" #include "stm32f1xx_ll_bus.h"
#include "RFInput.h" #include "RFInput.h"
#include "IncrEncoder.h" #include "IncrEncoder.h"
#include "DcMotor.h" #include "DcMotor.h"
#include "Sail.h" #include "Sail.h"
#include "alimentation.h" #include "Alimentation.h"
#include "accelerometer.h" #include "Accelerometer.h"
#include "RFOutput.h"
#define CONTROL_LOOP_PERIOD 250
#define MSG_TRANSFER_PERIOD 3000
void SystemClock_Config(void); void SystemClock_Config(void);
/* Private functions ---------------------------------------------------------*/ /* Private functions ---------------------------------------------------------*/
// global variables for monitoring in keil
int counter = 0;
int battery_level_good = 0;
int angle_roulis_good = 0;
int angle_sail = 0;
int RF_Input_Duty = 0;
int TX_Flag = 0, CONTROL_LOOP_Flag = 0;
char wait_for_girouette[] = "En attente d'initialisation de la girouette\r\n";
/** /**
* @brief Main program * @brief Main program
* @param None * @param None
* @retval None * @retval None
*/ */
int val = 0;
int val2 = 0;
int counter = 0;
float level;
int level_enough;
double xx,yy;
int bon;
int main(void) int main(void)
{ {
/* Configure the system clock to 72 MHz */ /* Configure the system clock to 72 MHz */
SystemClock_Config(); SystemClock_Config();
ALIMENTATION_Init();
//alimentation_init(); ACCELEROMETER_Init();
RF_INPUT_Init(); RF_INPUT_Init();
DC_MOTOR_Init(); DC_MOTOR_Init();
SAIL_Init(); SAIL_Init();
accelero_init(); RF_OUTPUT_Init();
while(!INCR_ENCODER_IsAbsolute())
{
RF_OUTPUT_SendBytes(wait_for_girouette, sizeof(wait_for_girouette));
LL_mDelay(500);
}
/* Infinite loop */
while (1) while (1)
{ {
LL_mDelay(100); if(CONTROL_LOOP_Flag){
//counter = (counter + 1) % 100; battery_level_good = ALIMENTATION_IsLevelEnough();
//DC_MOTOR_SetSpeed(counter); angle_roulis_good = ACCELEROMETER_AngleGood();
//val = RF_INPUT_GetPeriodUs();
//val2 = RF_INPUT_GetDutyTimeUs(); if(!angle_roulis_good){
//SAIL_SetAngle(counter); SAIL_SetAngle(90);
//level = get_battery_level(); DC_MOTOR_SetSpeed(0);
//level_enough = is_level_enough(); }else{
xx = accelero_get_x(); angle_sail = INCR_ENCODER_GetAngle();
//yy = accelero_get_y(); SAIL_SetAngle(angle_sail/2);
//bon = accelero_angle_bon(); RF_Input_Duty = RF_INPUT_GetDutyTimeRelative();
DC_MOTOR_SetSpeed(RF_Input_Duty);
}
CONTROL_LOOP_Flag = 0;
}
if(TX_Flag){
RF_OUTPUT_SendMessage(angle_roulis_good, battery_level_good, angle_sail);
TX_Flag = 0;
}
} }
} }
void SysTick_Handler(void)
{
if(counter % CONTROL_LOOP_PERIOD == 0){
CONTROL_LOOP_Flag = 1;
}
if(counter % MSG_TRANSFER_PERIOD == 0){
TX_Flag = 1;
}
counter = (counter+1) % (CONTROL_LOOP_PERIOD*MSG_TRANSFER_PERIOD) ;
}
/** /**