Compare commits
3 commits
9b1fa9e113
...
6521fbb40f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6521fbb40f | ||
|
|
30a898b7cc | ||
|
|
96a831ae9e |
7 changed files with 211 additions and 13 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -65,11 +72,20 @@ int PWMi_getDutyCycle(TIM_TypeDef * timer, int channel);
|
||||||
* @note
|
* @note
|
||||||
* @param TIM_TypeDef Timer : indique le timer à utiliser : 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
|
* int channel : Le channel utilisé par la PWM
|
||||||
* float freq_khz : Fréquence en KHz
|
* float freq : Fré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équence des PWMs associées au timer donné
|
||||||
|
* @note
|
||||||
|
* @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 Timer_pwmo_setFreq(TIM_TypeDef * timer, float freq);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Modifie le duty cycle de la PWM
|
* @brief Modifie le duty cycle de la PWM
|
||||||
|
|
@ -79,7 +95,16 @@ void Timer_pwmo_conf(TIM_TypeDef * timer, int channel, float freq_khz, float dut
|
||||||
* 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é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
|
* ENCODER
|
||||||
|
|
@ -107,6 +132,6 @@ int Timer_encoder_getAngle(TIM_TypeDef * timer);
|
||||||
* @param TIM_TypeDef Timer : indique le timer à utiliser : TIM1, TIM2, TIM3 ou TIM4
|
* @param TIM_TypeDef Timer : indique le timer à 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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
32
Src/Sail.h
32
Src/Sail.h
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue