BE_VOILIER/Pilotes/Source/Girouette.c

48 lines
No EOL
1.7 KiB
C

#include "stm32f10x.h"
#include "MyTimer.h"
#include "Nucleo.h"
#include "Timer.h"
#include "DriverGPIO.h"
#include "Girouette.h"
#include "PWM.h"
#include <stdlib.h> // Pour abs()
#define POSITIONS 4*360
void configEncoder(TIM_TypeDef * Timer){
Timer -> CCMR1 |= TIM_CCMR1_CC1S; // TI1FP1 mapped on TI1
Timer -> CCMR1 |= TIM_CCMR1_CC2S; // TI1FP2 mapped on TI2
Timer -> CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP); // TI1FP1 output non-inverted
Timer -> CCMR1 &= ~(TIM_CCMR1_IC1F); // Input capture 1 filter, no filter
Timer -> CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP); // TI1FP2 output non-inverted
Timer -> CCMR2 &= ~(TIM_CCMR1_IC2F); // Input capture 2 filter, no filter
Timer -> SMCR &= ~TIM_SMCR_SMS; // Reset SMS-bits
Timer -> SMCR |= TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1;// SMS = "011"
Timer -> CR1 |= TIM_CR1_CEN; // Enable counter
Timer -> ARR = 0xFD20; // Setting ARR as 1440*45
}
void configChannel(){
MyGPIO_Init(GPIOA,0,In_Floating ); // GPIOA pin 0 in mode floating TIM2_CH1
MyGPIO_Init(GPIOA,1,In_Floating ); // GPIOA pin 1 in mode floating TIM2_CH2
MyGPIO_Init(GPIOA,2,In_Floating);
MyGPIO_Init(GPIOA,8,In_PullDown ); // GPIOA pin 7 in mode floating Index
}
int returnAngle (TIM_TypeDef * Timer){
return((Timer -> CNT % POSITIONS)/POSITIONS * 360);
}
// Reste à coder une fonction de reset des degrés et une fonction qui retourne correctement l'angle
int vent2voile(int angle){ // Conversion angle vent à angle voile
if(abs(angle) < 90){
return 0;
}
else{
return(abs(angle)-90);
}
}
void Servo_Moteur(int angle, TIM_TypeDef * Timer, int Channel){ // Controle du moteur
int dutyCycle = (5* angle + 5*90)/90;
MyTimer_Set_DutyCycle(Timer, Channel, dutyCycle);
}