Compare commits

..

6 commits

Author SHA1 Message Date
Arnaud Vergnet
be4e10b063 Merge remote-tracking branch 'origin/MB' 2020-11-06 10:22:18 +01:00
Arnaud Vergnet
47e1d3f4ff Merge remote-tracking branch 'origin/YA' 2020-11-06 10:18:51 +01:00
Arnaud Vergnet
6521fbb40f add basic functions definitions 2020-11-06 10:17:23 +01:00
Arnaud Vergnet
30a898b7cc add incremental encoder functions 2020-11-06 10:10:34 +01:00
Arnaud Vergnet
96a831ae9e add servo motor functions 2020-11-06 09:42:38 +01:00
Arnaud Vergnet
9b1fa9e113 add timer encoder functions 2020-11-06 09:06:28 +01:00
7 changed files with 263 additions and 65 deletions

View file

@ -8,7 +8,7 @@
***************************************************************************/ ***************************************************************************/
// variable pointeur de fonction permettant de mémoriser le callback à appeler depuis // variable pointeur de fonction permettant de m<EFBFBD>moriser le callback <20> appeler depuis
// le handler d'IT // le handler d'IT
void (*it_callback_TIM1)(void); void (*it_callback_TIM1)(void);
void (*it_callback_TIM2)(void); void (*it_callback_TIM2)(void);
@ -48,7 +48,7 @@ void TIM4_IRQHandler(void)
/** /**
* @brief Autorise les interruptions * @brief Autorise les interruptions
* @note * @note
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 * @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser par le chronom<EFBFBD>tre, TIM1, TIM2, TIM3 ou TIM4
* @retval None * @retval None
*/ */
void Timer_IT_enable(TIM_TypeDef * timer) void Timer_IT_enable(TIM_TypeDef * timer)
@ -60,7 +60,7 @@ void Timer_IT_enable(TIM_TypeDef * timer)
/** /**
* @brief Interdit les interruptions * @brief Interdit les interruptions
* @note * @note
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 * @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser par le chronom<EFBFBD>tre, TIM1, TIM2, TIM3 ou TIM4
* @retval None * @retval None
*/ */
void Timer_IT_disable(TIM_TypeDef * timer) void Timer_IT_disable(TIM_TypeDef * timer)
@ -69,11 +69,11 @@ void Timer_IT_disable(TIM_TypeDef * timer)
} }
/** /**
* @brief Configure le Timer considéré en interruption sur bordement. * @brief Configure le Timer consid<EFBFBD>r<EFBFBD> en interruption sur d<EFBFBD>bordement.
* @note A ce stade, les interruptions ne sont pas validés (voir MyTimer_IT_Enable ) * @note A ce stade, les interruptions ne sont pas valid<EFBFBD>s (voir MyTimer_IT_Enable )
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 * @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser par le chronom<EFBFBD>tre, TIM1, TIM2, TIM3 ou TIM4
* void (*IT_function) (void) : nom (adresse) de la fonction à lancer sur interruption * void (*IT_function) (void) : nom (adresse) de la fonction <EFBFBD> lancer sur interruption
* int Prio : priorité associée à l'interruption * int Prio : priorit<EFBFBD> associ<EFBFBD>e <EFBFBD> l'interruption
* @retval None * @retval None
*/ */
void Timer_IT_conf(TIM_TypeDef * timer, void (*it_callback) (void), int prio) void Timer_IT_conf(TIM_TypeDef * timer, void (*it_callback) (void), int prio)
@ -85,7 +85,7 @@ void Timer_IT_conf(TIM_TypeDef * timer, void (*it_callback) (void), int prio)
else it_callback_TIM4 = it_callback; else it_callback_TIM4 = it_callback;
// Blocage IT (il faudra la débloquer voir fct suivante) // Blocage IT (il faudra la d<EFBFBD>bloquer voir fct suivante)
LL_TIM_DisableIT_UPDATE(timer); LL_TIM_DisableIT_UPDATE(timer);
// validation du canal NVIC // validation du canal NVIC
@ -107,9 +107,9 @@ void Timer_IT_conf(TIM_TypeDef * timer, void (*it_callback) (void), int prio)
***************************************************************************/ ***************************************************************************/
/** /**
* @brief Démarre le timer considéré et active les interruptions * @brief D<EFBFBD>marre le timer consid<EFBFBD>r<EFBFBD> et active les interruptions
* @note * @note
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 * @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser par le chronom<EFBFBD>tre, TIM1, TIM2, TIM3 ou TIM4
* @retval None * @retval None
*/ */
void Timer_start(TIM_TypeDef * timer) void Timer_start(TIM_TypeDef * timer)
@ -118,9 +118,9 @@ void Timer_start(TIM_TypeDef * timer)
} }
/** /**
* @brief Arrêt le timer considéré et sactive les interruptions * @brief Arr<EFBFBD>t le timer consid<EFBFBD>r<EFBFBD> et d<EFBFBD>sactive les interruptions
* @note * @note
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 * @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser par le chronom<EFBFBD>tre, TIM1, TIM2, TIM3 ou TIM4
* @retval None * @retval None
*/ */
void Timer_stop(TIM_TypeDef * timer) void Timer_stop(TIM_TypeDef * timer)
@ -129,11 +129,11 @@ void Timer_stop(TIM_TypeDef * timer)
} }
/** /**
* @brief Active l'horloge et règle l'ARR et le PSC du timer visé. * @brief Active l'horloge et r<EFBFBD>gle l'ARR et le PSC du timer vis<EFBFBD>.
* @note Fonction à lancer avant toute autre. Le timer n'est pas encore lancé (voir Timer_start) * @note Fonction <EFBFBD> lancer avant toute autre. Le timer n'est pas encore lanc<EFBFBD> (voir Timer_start)
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 * @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser par le chronom<EFBFBD>tre, TIM1, TIM2, TIM3 ou TIM4
* int Arr : valeur à placer dans ARR * int Arr : valeur <EFBFBD> placer dans ARR
* int Psc : valeur à placer dans PSC * int Psc : valeur <EFBFBD> placer dans PSC
* @retval None * @retval None
*/ */
void Timer_conf(TIM_TypeDef * timer, int arr, int psc) void Timer_conf(TIM_TypeDef * timer, int arr, int psc)
@ -171,15 +171,15 @@ void Timer_conf(TIM_TypeDef * timer, int arr, int psc)
* PWM OUTPUT * PWM OUTPUT
***************************************************************************/ ***************************************************************************/
int getArrFromFreq(float freq_khz) int getArrFromFreq(float freq)
{ {
return (72000 / freq_khz) - 1; return (72000000 / freq) - 1;
} }
void Timer_pwmo_conf(TIM_TypeDef * timer, int channel, float freq_khz, float dutyCycle) void Timer_pwmo_conf(TIM_TypeDef * timer, int channel, float freq, float dutyCycle)
{ {
const int arr = getArrFromFreq(freq_khz); const int arr = getArrFromFreq(freq);
Timer_conf(timer, arr, 0); Timer_conf(timer, arr, 1000);
LL_TIM_OC_InitTypeDef init_struct; LL_TIM_OC_InitTypeDef init_struct;
LL_TIM_OC_StructInit(&init_struct); LL_TIM_OC_StructInit(&init_struct);
@ -190,15 +190,33 @@ void Timer_pwmo_conf(TIM_TypeDef * timer, int channel, float freq_khz, float dut
LL_TIM_OC_Init(timer, channel, &init_struct); LL_TIM_OC_Init(timer, channel, &init_struct);
} }
void Timer_pwmo_setDutyCycle(TIM_TypeDef * timer, int channel, float freq_khz, float dutyCycle) void Timer_pwmo_setFreq(TIM_TypeDef * timer, float freq)
{ {
int compare = dutyCycle * getArrFromFreq(freq_khz); const int arr = getArrFromFreq(freq);
LL_TIM_SetAutoReload(timer, arr);
}
void Timer_pwmo_setDutyCycle(TIM_TypeDef * timer, int channel, float dutyCycle)
{
const int arr = LL_TIM_GetAutoReload(timer);
int compare = dutyCycle * arr;
if (channel == LL_TIM_CHANNEL_CH1) LL_TIM_OC_SetCompareCH1(timer, compare); if (channel == LL_TIM_CHANNEL_CH1) LL_TIM_OC_SetCompareCH1(timer, compare);
else if (channel == LL_TIM_CHANNEL_CH2) LL_TIM_OC_SetCompareCH2(timer, compare); else if (channel == LL_TIM_CHANNEL_CH2) LL_TIM_OC_SetCompareCH2(timer, compare);
else if (channel == LL_TIM_CHANNEL_CH3) LL_TIM_OC_SetCompareCH3(timer, compare); else if (channel == LL_TIM_CHANNEL_CH3) LL_TIM_OC_SetCompareCH3(timer, compare);
else LL_TIM_OC_SetCompareCH4(timer, compare); else LL_TIM_OC_SetCompareCH4(timer, compare);
} }
float Timer_pwmo_getDutyCycle(TIM_TypeDef * timer, int channel)
{
int compare = 0;
const int arr = LL_TIM_GetAutoReload(timer);
if (channel == LL_TIM_CHANNEL_CH1) compare = LL_TIM_OC_GetCompareCH1(timer);
else if (channel == LL_TIM_CHANNEL_CH2) compare = LL_TIM_OC_GetCompareCH2(timer);
else if (channel == LL_TIM_CHANNEL_CH3) compare = LL_TIM_OC_GetCompareCH3(timer);
else compare = LL_TIM_OC_GetCompareCH4(timer);
return ((float) compare) / ((float) arr);
}
/**************************************************************************** /****************************************************************************
* ENCODER * ENCODER
***************************************************************************/ ***************************************************************************/
@ -219,7 +237,11 @@ int Timer_encoder_getAngle(TIM_TypeDef * timer)
return LL_TIM_GetCounter(timer); return LL_TIM_GetCounter(timer);
} }
int Timer_encoder_getDirection(TIM_TypeDef * timer) enum CounterDirection Timer_encoder_getDirection(TIM_TypeDef * timer)
{ {
return LL_TIM_GetDirection(timer); const int dir = LL_TIM_GetDirection(timer);
if (dir == LL_TIM_COUNTERDIRECTION_UP)
return CLOCKWISE;
else
return COUNTER_CLOCKWISE;
} }

View file

@ -2,6 +2,13 @@
#define TIMER_H #define TIMER_H
#include "stm32f103xb.h" #include "stm32f103xb.h"
#include "stm32f1xx_ll_tim.h" // Pour les timers
enum CounterDirection {
CLOCKWISE = LL_TIM_COUNTERDIRECTION_UP,
COUNTER_CLOCKWISE = LL_TIM_COUNTERDIRECTION_DOWN,
};
/**************************************************************************** /****************************************************************************
* INTERRUPTIONS * INTERRUPTIONS
@ -20,29 +27,29 @@ void Timer_IT_conf(TIM_TypeDef * timer, void (*it_callback) (void), int prio);
/** /**
* @brief Active l'horloge et règle l'ARR et le PSC du timer visé * @brief Active l'horloge et r<EFBFBD>gle l'ARR et le PSC du timer vis<EFBFBD>
* @note Fonction à lancer avant toute autre. Le timer n'est pas encore lancé (voir MyTimerStart) * @note Fonction <EFBFBD> lancer avant toute autre. Le timer n'est pas encore lanc<EFBFBD> (voir MyTimerStart)
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 * @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser par le chronom<EFBFBD>tre, TIM1, TIM2, TIM3 ou TIM4
* int Arr : valeur à placer dans ARR * int Arr : valeur <EFBFBD> placer dans ARR
* int Psc : valeur à placer dans PSC * int Psc : valeur <EFBFBD> placer dans PSC
* @retval None * @retval None
*/ */
void Timer_conf(TIM_TypeDef * timer, int arr, int psc); void Timer_conf(TIM_TypeDef * timer, int arr, int psc);
/** /**
* @brief Démarre le timer considéré * @brief D<EFBFBD>marre le timer consid<EFBFBD>r<EFBFBD>
* @note * @note
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 * @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser par le chronom<EFBFBD>tre, TIM1, TIM2, TIM3 ou TIM4
* @retval None * @retval None
*/ */
void Timer_start(TIM_TypeDef * timer); void Timer_start(TIM_TypeDef * timer);
/** /**
* @brief Arrêt le timer considéré * @brief Arr<EFBFBD>t le timer consid<EFBFBD>r<EFBFBD>
* @note * @note
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4 * @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser par le chronom<EFBFBD>tre, TIM1, TIM2, TIM3 ou TIM4
* @retval None * @retval None
*/ */
void Timer_stop(TIM_TypeDef * timer); void Timer_stop(TIM_TypeDef * timer);
@ -61,25 +68,43 @@ int PWMi_getDutyCycle(TIM_TypeDef * timer, int channel);
***************************************************************************/ ***************************************************************************/
/** /**
* @brief Configure le timer en mode PWM output à la fréquence donnée * @brief Configure le timer en mode PWM output <EFBFBD> la fr<EFBFBD>quence donn<EFBFBD>e
* @note * @note
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4 * @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser : TIM1, TIM2, TIM3 ou TIM4
* int channel : Le channel utilisé par la PWM * int channel : Le channel utilis<EFBFBD> par la PWM
* float freq_khz : Fréquence en KHz * float freq : Fr<EFBFBD>quence en Hz (entre 2Hz et pas trop grand svp)
* float dutyCycle : Valeur entre 0 et 1 * float dutyCycle : Valeur entre 0 et 1
* @retval None * @retval None
*/ */
void Timer_pwmo_conf(TIM_TypeDef * timer, int channel, float freq_khz, float dutyCycle); void Timer_pwmo_conf(TIM_TypeDef * timer, int channel, float freq, float dutyCycle);
/**
* @brief Modifie la fr<EFBFBD>quence des PWMs associ<EFBFBD>es au timer donn<EFBFBD>
* @note
* @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser : TIM1, TIM2, TIM3 ou TIM4
* float freq : Fr<EFBFBD>quence en Hz (entre 2Hz et pas trop grand svp)
* @retval None
*/
void Timer_pwmo_setFreq(TIM_TypeDef * timer, float freq);
/** /**
* @brief Modifie le duty cycle de la PWM * @brief Modifie le duty cycle de la PWM
* @note * @note
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4 * @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser : TIM1, TIM2, TIM3 ou TIM4
* int channel : Le channel utilisé par la PWM * int channel : Le channel utilis<EFBFBD> par la PWM
* float dutyCycle : Valeur entre 0 et 1 * float dutyCycle : Valeur entre 0 et 1
* @retval None * @retval None
*/ */
void Timer_pwmo_setDutyCycle(TIM_TypeDef * timer, int channel, float freq_khz, float dutyCycle); void Timer_pwmo_setDutyCycle(TIM_TypeDef * timer, int channel, float dutyCycle);
/**
* @brief R<EFBFBD>cup<EFBFBD>re le duty cycle de la PWM
* @note
* @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser : TIM1, TIM2, TIM3 ou TIM4
* int channel : Le channel utilis<EFBFBD> par la PWM
* @retval float dutyCycle
*/
float Timer_pwmo_getDutyCycle(TIM_TypeDef * timer, int channel);
/**************************************************************************** /****************************************************************************
* ENCODER * ENCODER
@ -88,25 +113,25 @@ void Timer_pwmo_setDutyCycle(TIM_TypeDef * timer, int channel, float freq_khz, f
/** /**
* @brief Configure le timer en mode encoder * @brief Configure le timer en mode encoder
* @note * @note
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4 * @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser : TIM1, TIM2, TIM3 ou TIM4
* @retval None * @retval None
*/ */
void Timer_encoder_conf(TIM_TypeDef * timer); void Timer_encoder_conf(TIM_TypeDef * timer);
/** /**
* @brief Récupère l'angle, en degrès * @brief R<EFBFBD>cup<EFBFBD>re l'angle, en degr<EFBFBD>s
* @note * @note
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4 * @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser : TIM1, TIM2, TIM3 ou TIM4
* @retval None * @retval None
*/ */
int Timer_encoder_getAngle(TIM_TypeDef * timer); int Timer_encoder_getAngle(TIM_TypeDef * timer);
/** /**
* @brief Récupère la direction * @brief R<EFBFBD>cup<EFBFBD>re la direction
* @note * @note
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4 * @param TIM_TypeDef Timer : indique le timer <EFBFBD> utiliser : TIM1, TIM2, TIM3 ou TIM4
* @retval None * @retval None
*/ */
int Timer_encoder_getDirection(TIM_TypeDef * timer); enum CounterDirection Timer_encoder_getDirection(TIM_TypeDef * timer);
#endif #endif

View file

@ -1 +1,24 @@
#include "IncrementalEncoder.h" #include "IncrementalEncoder.h"
#include "Timer.h"
void IncrementalEncoder_conf(TIM_TypeDef * timer)
{
Timer_encoder_conf(timer);
// TODO GPIO config
}
void IncrementalEncoder_start(TIM_TypeDef * timer)
{
Timer_start(timer);
}
int IncrementalEncoder_getAngle(TIM_TypeDef * timer)
{
return Timer_encoder_getAngle(timer);
}
enum CounterDirection IncrementalEncoder_getDirection(TIM_TypeDef * timer)
{
return Timer_encoder_getDirection(timer);
}

View file

@ -1,4 +1,38 @@
#ifndef INC_ENCODER_H #ifndef INC_ENCODER_H
#define INC_ENCODER_H #define INC_ENCODER_H
#include "stm32f103xb.h"
/**
* @brief Configure le codeur incrémental associé au timer donné
* @note
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
* @retval None
*/
void IncrementalEncoder_conf(TIM_TypeDef * timer);
/**
* @brief Démarre le codeur incrémental associé au timer donné
* @note
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
* @retval None
*/
void IncrementalEncoder_start(TIM_TypeDef * timer);
/**
* @brief Récupère l'angle du codeur incrémental associé au timer donné
* @note
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
* @retval int angle
*/
int IncrementalEncoder_getAngle(TIM_TypeDef * timer);
/**
* @brief Récupère la direction du codeur incrémental associé au timer donné
* @note
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
* @retval int dir
*/
enum CounterDirection IncrementalEncoder_getDirection(TIM_TypeDef * timer);
#endif #endif

View file

@ -1 +1,25 @@
#include "ServoMotor.h" #include "ServoMotor.h"
#include "Timer.h"
#define SERVO_MOTO_FREQ 50
void ServoMotor_conf(TIM_TypeDef * timer, int channel)
{
Timer_pwmo_conf(timer, channel, SERVO_MOTO_FREQ, 0);
}
void ServoMotor_start(TIM_TypeDef * timer)
{
Timer_start(timer);
}
void ServoMotor_setAngle(TIM_TypeDef * timer, int channel, int angle)
{
Timer_pwmo_setDutyCycle(timer, channel, ((float) angle) / 359.0);
}
int ServoMotor_getAngle(TIM_TypeDef * timer, int channel)
{
const float dutyCycle = Timer_pwmo_getDutyCycle(timer, channel);
return 359 * dutyCycle;
}

View file

@ -1,4 +1,42 @@
#ifndef SERVO_MOTOR_H #ifndef SERVO_MOTOR_H
#define SERVO_MOTOR_H #define SERVO_MOTOR_H
#include "stm32f103xb.h"
/**
* @brief Configure le servo moteur associé au timer donné
* @note
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
* int channel : Le channel utilisé par le servo moteur
* @retval None
*/
void ServoMotor_conf(TIM_TypeDef * timer, int channel);
/**
* @brief Démarre les servo moteurs associés au timer donné
* @note
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
* @retval None
*/
void ServoMotor_start(TIM_TypeDef * timer);
/**
* @brief Modifie l'angle du servo moteur
* @note
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
* int channel : Le channel utilisé par le servo moteur
* float angle : .En degrès (Valeur entre 0 et 359)
* @retval None
*/
void ServoMotor_setAngle(TIM_TypeDef * timer, int channel, int angle);
/**
* @brief Récupère l'angle du servo moteur
* @note
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
* int channel : Le channel utilisé par le servo moteur
* @retval int angle
*/
int ServoMotor_getAngle(TIM_TypeDef * timer, int channel);
#endif #endif

View file

@ -1,4 +1,36 @@
#ifndef SAIL_H #ifndef SAIL_H
#define SAIL_H #define SAIL_H
/**
* @brief Configure la voile
* @note
* @param None
* @retval None
*/
void Sail_conf();
/**
* @brief Execute la tache de fond des voiles en fonction des valeurs récupérées par les drivers
* @note
* @param None
* @retval None
*/
void Sail_background();
/**
* @brief Mets la voile à 90 degres
* @note
* @param None
* @retval None
*/
void Sail_reset();
/**
* @brief Réinitialise la voile à sa position initiale
* @note
* @param None
* @retval None
*/
void Sail_start();
#endif #endif