Merge remote-tracking branch 'origin/YA'
This commit is contained in:
commit
47e1d3f4ff
9 changed files with 466 additions and 186 deletions
|
@ -1,127 +1,48 @@
|
|||
// 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 "Timer.h"
|
||||
#include "stm32f1xx_ll_bus.h" // Pour l'activation des horloges
|
||||
#include "stm32f1xx_ll_tim.h"
|
||||
#include "stm32f1xx_ll_tim.h" // Pour les timers
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* INTERRUPTIONS
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
// 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);
|
||||
void (*it_callback_TIM1)(void);
|
||||
void (*it_callback_TIM2)(void);
|
||||
void (*it_callback_TIM3)(void);
|
||||
void (*it_callback_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)
|
||||
void TIM1_UP_IRQHandler(void)
|
||||
{
|
||||
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);
|
||||
|
||||
// rabaisser le flag d'IT
|
||||
LL_TIM_ClearFlag_UPDATE(TIM1);
|
||||
(*it_callback_TIM1)();
|
||||
}
|
||||
|
||||
// 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)
|
||||
void TIM2_IRQHandler(void)
|
||||
{
|
||||
LL_TIM_EnableCounter(Timer);
|
||||
}
|
||||
// rabaisser le flag d'IT
|
||||
LL_TIM_ClearFlag_UPDATE(TIM2);
|
||||
(*it_callback_TIM2)();
|
||||
}
|
||||
|
||||
/**
|
||||
* @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)
|
||||
void TIM3_IRQHandler(void)
|
||||
{
|
||||
LL_TIM_DisableCounter(Timer);
|
||||
}
|
||||
// rabaisser le flag d'IT
|
||||
LL_TIM_ClearFlag_UPDATE(TIM3);
|
||||
(*it_callback_TIM3)();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @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)
|
||||
void TIM4_IRQHandler(void)
|
||||
{
|
||||
// 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);
|
||||
|
||||
|
||||
}
|
||||
// rabaisser le flag d'IT
|
||||
LL_TIM_ClearFlag_UPDATE(TIM4);
|
||||
(*it_callback_TIM4)();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
|
@ -130,9 +51,9 @@ void MyTimer_IT_Conf(TIM_TypeDef * Timer, void (*IT_function) (void),int Prio)
|
|||
* @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)
|
||||
void Timer_IT_enable(TIM_TypeDef * timer)
|
||||
{
|
||||
LL_TIM_EnableIT_UPDATE(Timer);
|
||||
LL_TIM_EnableIT_UPDATE(timer);
|
||||
}
|
||||
|
||||
|
||||
|
@ -142,41 +63,185 @@ void MyTimer_IT_Enable(TIM_TypeDef * Timer)
|
|||
* @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)
|
||||
void Timer_IT_disable(TIM_TypeDef * timer)
|
||||
{
|
||||
LL_TIM_DisableIT_UPDATE(Timer);
|
||||
}
|
||||
LL_TIM_DisableIT_UPDATE(timer);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
============ LES INTERRUPTIONS =================================
|
||||
|
||||
*/
|
||||
|
||||
void TIM1_UP_IRQHandler(void)
|
||||
/**
|
||||
* @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 Timer_IT_conf(TIM_TypeDef * timer, void (*it_callback) (void), int prio)
|
||||
{
|
||||
// rabaisser le flag d'IT
|
||||
LL_TIM_ClearFlag_UPDATE(TIM1);
|
||||
(*Ptr_ItFct_TIM1)();
|
||||
}
|
||||
// affectation de la fonction
|
||||
if (timer == TIM1) it_callback_TIM1 = it_callback;
|
||||
else if (timer == TIM2) it_callback_TIM2 = it_callback;
|
||||
else if (timer == TIM3) it_callback_TIM3 = it_callback;
|
||||
else it_callback_TIM4 = it_callback;
|
||||
|
||||
void TIM2_IRQHandler(void)
|
||||
{
|
||||
// rabaisser le flag d'IT
|
||||
LL_TIM_ClearFlag_UPDATE(TIM2);
|
||||
(*Ptr_ItFct_TIM2)();
|
||||
}
|
||||
|
||||
// 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);
|
||||
|
||||
void TIM3_IRQHandler(void)
|
||||
{
|
||||
// rabaisser le flag d'IT
|
||||
LL_TIM_ClearFlag_UPDATE(TIM3);
|
||||
(*Ptr_ItFct_TIM3)();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void TIM4_IRQHandler(void)
|
||||
/****************************************************************************
|
||||
* TIMER
|
||||
***************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief Démarre le timer considéré et active les interruptions
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* @retval None
|
||||
*/
|
||||
void Timer_start(TIM_TypeDef * timer)
|
||||
{
|
||||
// rabaisser le flag d'IT
|
||||
LL_TIM_ClearFlag_UPDATE(TIM4);
|
||||
(*Ptr_ItFct_TIM4)();
|
||||
}
|
||||
LL_TIM_EnableCounter(timer);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Arrêt le timer considéré et désactive les interruptions
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser par le chronomètre, TIM1, TIM2, TIM3 ou TIM4
|
||||
* @retval None
|
||||
*/
|
||||
void Timer_stop(TIM_TypeDef * timer)
|
||||
{
|
||||
LL_TIM_DisableCounter(timer);
|
||||
}
|
||||
|
||||
/**
|
||||
* @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 Timer_start)
|
||||
* @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 Timer_conf(TIM_TypeDef * timer, int arr, int psc)
|
||||
{
|
||||
LL_TIM_InitTypeDef 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
|
||||
init_struct.Autoreload = arr;
|
||||
init_struct.Prescaler = psc;
|
||||
init_struct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
|
||||
init_struct.CounterMode = LL_TIM_COUNTERMODE_UP;
|
||||
init_struct.RepetitionCounter = 0;
|
||||
|
||||
LL_TIM_Init(timer,&init_struct);
|
||||
|
||||
// Blocage interruptions
|
||||
Timer_IT_disable(timer);
|
||||
|
||||
// Blocage Timer
|
||||
Timer_stop(timer);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* PWM INPUT
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* PWM OUTPUT
|
||||
***************************************************************************/
|
||||
|
||||
int getArrFromFreq(float freq)
|
||||
{
|
||||
return (72000000 / freq) - 1;
|
||||
}
|
||||
|
||||
void Timer_pwmo_conf(TIM_TypeDef * timer, int channel, float freq, float dutyCycle)
|
||||
{
|
||||
const int arr = getArrFromFreq(freq);
|
||||
Timer_conf(timer, arr, 1000);
|
||||
LL_TIM_OC_InitTypeDef init_struct;
|
||||
LL_TIM_OC_StructInit(&init_struct);
|
||||
|
||||
init_struct.OCMode = LL_TIM_OCMODE_PWM1;
|
||||
init_struct.OCState = LL_TIM_OCSTATE_ENABLE;
|
||||
init_struct.CompareValue= dutyCycle * arr;
|
||||
|
||||
LL_TIM_OC_Init(timer, channel, &init_struct);
|
||||
}
|
||||
|
||||
void Timer_pwmo_setFreq(TIM_TypeDef * timer, float freq)
|
||||
{
|
||||
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);
|
||||
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 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
|
||||
***************************************************************************/
|
||||
|
||||
void Timer_encoder_conf(TIM_TypeDef * timer)
|
||||
{
|
||||
Timer_conf(timer, 359, 0);
|
||||
LL_TIM_ENCODER_InitTypeDef init_struct;
|
||||
LL_TIM_ENCODER_StructInit(&init_struct);
|
||||
|
||||
init_struct.EncoderMode = LL_TIM_ENCODERMODE_X2_TI1;
|
||||
|
||||
LL_TIM_ENCODER_Init(timer, &init_struct);
|
||||
}
|
||||
|
||||
int Timer_encoder_getAngle(TIM_TypeDef * timer)
|
||||
{
|
||||
return LL_TIM_GetCounter(timer);
|
||||
}
|
||||
|
||||
enum CounterDirection Timer_encoder_getDirection(TIM_TypeDef * timer)
|
||||
{
|
||||
const int dir = LL_TIM_GetDirection(timer);
|
||||
if (dir == LL_TIM_COUNTERDIRECTION_UP)
|
||||
return CLOCKWISE;
|
||||
else
|
||||
return COUNTER_CLOCKWISE;
|
||||
}
|
||||
|
|
|
@ -1,14 +1,30 @@
|
|||
// RIEN A MODIFIER //
|
||||
|
||||
#ifndef TIMER_H
|
||||
#define TIMER_H
|
||||
|
||||
/*
|
||||
Driver pour Timer 1 à 4 du STM32F103RB
|
||||
|
||||
*/
|
||||
|
||||
#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
|
||||
***************************************************************************/
|
||||
|
||||
void Timer_IT_enable(TIM_TypeDef * timer);
|
||||
|
||||
void Timer_IT_disable(TIM_TypeDef * timer);
|
||||
|
||||
void Timer_IT_conf(TIM_TypeDef * timer, void (*it_callback) (void), int prio);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* TIMER
|
||||
***************************************************************************/
|
||||
|
||||
|
||||
/**
|
||||
* @brief Active l'horloge et règle l'ARR et le PSC du timer visé
|
||||
|
@ -18,7 +34,7 @@ Driver pour Timer 1
|
|||
* int Psc : valeur à placer dans PSC
|
||||
* @retval None
|
||||
*/
|
||||
void MyTimer_Conf(TIM_TypeDef * Timer,int Arr, int Psc);
|
||||
void Timer_conf(TIM_TypeDef * timer, int arr, int psc);
|
||||
|
||||
|
||||
/**
|
||||
|
@ -27,7 +43,7 @@ void MyTimer_Conf(TIM_TypeDef * Timer,int Arr, int Psc);
|
|||
* @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);
|
||||
void Timer_start(TIM_TypeDef * timer);
|
||||
|
||||
|
||||
/**
|
||||
|
@ -36,35 +52,86 @@ void MyTimer_Start(TIM_TypeDef * Timer);
|
|||
* @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);
|
||||
void Timer_stop(TIM_TypeDef * timer);
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
* PWM INPUT
|
||||
***************************************************************************/
|
||||
|
||||
void PWMi_conf(TIM_TypeDef * timer, int channel);
|
||||
|
||||
int PWMi_getDutyCycle(TIM_TypeDef * timer, int channel);
|
||||
|
||||
/****************************************************************************
|
||||
* PWM OUTPUT
|
||||
***************************************************************************/
|
||||
|
||||
/**
|
||||
* @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
|
||||
* @brief Configure le timer en mode PWM output à la fréquence donnée
|
||||
* @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 à utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* int channel : Le channel utilisé par la PWM
|
||||
* float freq : Fréquence en Hz (entre 2Hz et pas trop grand svp)
|
||||
* float dutyCycle : Valeur entre 0 et 1
|
||||
* @retval None
|
||||
*/
|
||||
void MyTimer_IT_Enable(TIM_TypeDef * Timer);
|
||||
|
||||
void Timer_pwmo_conf(TIM_TypeDef * timer, int channel, float freq, float dutyCycle);
|
||||
|
||||
/**
|
||||
* @brief Interdit les interruptions
|
||||
* @brief Modifie la fréquence des PWMs associées au timer donné
|
||||
* @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 à utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* float freq : Fréquence en Hz (entre 2Hz et pas trop grand svp)
|
||||
* @retval None
|
||||
*/
|
||||
void MyTimer_IT_Disable(TIM_TypeDef * Timer);
|
||||
void Timer_pwmo_setFreq(TIM_TypeDef * timer, float freq);
|
||||
|
||||
/**
|
||||
* @brief Modifie le duty cycle de la PWM
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* int channel : Le channel utilisé par la PWM
|
||||
* float dutyCycle : Valeur entre 0 et 1
|
||||
* @retval None
|
||||
*/
|
||||
void Timer_pwmo_setDutyCycle(TIM_TypeDef * timer, int channel, float dutyCycle);
|
||||
|
||||
/**
|
||||
* @brief Récupère le duty cycle de la PWM
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* int channel : Le channel utilisé par la PWM
|
||||
* @retval float dutyCycle
|
||||
*/
|
||||
float Timer_pwmo_getDutyCycle(TIM_TypeDef * timer, int channel);
|
||||
|
||||
/****************************************************************************
|
||||
* ENCODER
|
||||
***************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief Configure le timer en mode encoder
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* @retval None
|
||||
*/
|
||||
void Timer_encoder_conf(TIM_TypeDef * timer);
|
||||
|
||||
/**
|
||||
* @brief Récupère l'angle, en degrès
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* @retval None
|
||||
*/
|
||||
int Timer_encoder_getAngle(TIM_TypeDef * timer);
|
||||
|
||||
/**
|
||||
* @brief Récupère la direction
|
||||
* @note
|
||||
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
|
||||
* @retval None
|
||||
*/
|
||||
enum CounterDirection Timer_encoder_getDirection(TIM_TypeDef * timer);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -29,23 +29,19 @@ void Chrono_Task_10ms(void);
|
|||
void Chrono_Conf(TIM_TypeDef * Timer)
|
||||
{
|
||||
// Reset Time
|
||||
Chrono_Time.Hund=0;
|
||||
Chrono_Time.Sec=0;
|
||||
Chrono_Time.Min=0;
|
||||
Chrono_Time.Hund = 0;
|
||||
Chrono_Time.Sec = 0;
|
||||
Chrono_Time.Min = 0;
|
||||
|
||||
// Fixation du Timer
|
||||
Chrono_Timer=Timer;
|
||||
Chrono_Timer = Timer;
|
||||
|
||||
// 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);
|
||||
|
||||
Timer_conf(Chrono_Timer, 999, 719);
|
||||
|
||||
// Réglage des interruptions
|
||||
Timer_IT_conf(Chrono_Timer, Chrono_Task_10ms, 3);
|
||||
Timer_IT_enable(Chrono_Timer);
|
||||
}
|
||||
|
||||
|
||||
|
@ -57,7 +53,7 @@ void Chrono_Conf(TIM_TypeDef * Timer)
|
|||
*/
|
||||
void Chrono_Start(void)
|
||||
{
|
||||
MyTimer_Start(Chrono_Timer);
|
||||
Timer_start(Chrono_Timer);
|
||||
}
|
||||
|
||||
|
||||
|
@ -69,7 +65,7 @@ void Chrono_Start(void)
|
|||
*/
|
||||
void Chrono_Stop(void)
|
||||
{
|
||||
MyTimer_Stop(Chrono_Timer);
|
||||
Timer_stop(Chrono_Timer);
|
||||
}
|
||||
|
||||
|
||||
|
@ -82,7 +78,7 @@ void Chrono_Stop(void)
|
|||
void Chrono_Reset(void)
|
||||
{
|
||||
// Arrêt Chrono
|
||||
MyTimer_Stop(Chrono_Timer);
|
||||
Timer_stop(Chrono_Timer);
|
||||
|
||||
// Reset Time
|
||||
Chrono_Time.Hund=0;
|
||||
|
|
|
@ -1 +1,24 @@
|
|||
#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);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,38 @@
|
|||
#ifndef 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
|
||||
|
|
|
@ -1 +1,25 @@
|
|||
#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;
|
||||
}
|
||||
|
|
|
@ -1,4 +1,42 @@
|
|||
#ifndef 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
|
||||
|
|
32
Src/Sail.h
32
Src/Sail.h
|
@ -1,4 +1,36 @@
|
|||
#ifndef 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
|
||||
|
|
|
@ -32,6 +32,7 @@ void SystemClock_Config(void);
|
|||
* @retval None
|
||||
*/
|
||||
|
||||
Time * time;
|
||||
|
||||
int main(void)
|
||||
{
|
||||
|
@ -45,7 +46,7 @@ int main(void)
|
|||
// Lancement chronomètre
|
||||
Chrono_Start();
|
||||
|
||||
|
||||
time = Chrono_Read();
|
||||
|
||||
/* Infinite loop */
|
||||
while (1)
|
||||
|
|
Loading…
Reference in a new issue