mirror of
https://github.com/yoboujon/dumber.git
synced 2025-06-08 13:50:49 +02:00
216 lines
5.1 KiB
C
216 lines
5.1 KiB
C
/*
|
|
* moteurs.c
|
|
*
|
|
* Created on: Sep 12, 2022
|
|
* Author: dimercur
|
|
*/
|
|
|
|
#include "moteurs.h"
|
|
|
|
//extern LPTIM_HandleTypeDef hlptim1;
|
|
|
|
extern TIM_HandleTypeDef htim2;
|
|
extern TIM_HandleTypeDef htim21;
|
|
|
|
int16_t MOTEUR_CmdMoteurG;
|
|
int16_t MOTEUR_CmdMoteurD;
|
|
int16_t MOTEUR_ConsigneMoteurG;
|
|
int16_t MOTEUR_ConsigneMoteurD;
|
|
|
|
int16_t MOTEUR_NBImpulsionsG;
|
|
int16_t MOTEUR_NBImpulsionsD;
|
|
|
|
uint16_t MOTEUR_DerniereValEncodeursG;
|
|
uint16_t MOTEUR_DerniereValEncodeursD;
|
|
|
|
#define MOTEUR_GAUCHE 0
|
|
#define MOTEUR_DROIT 1
|
|
|
|
#define MOTEUR_Kp 15
|
|
#define MOTEUR_DELAY 3
|
|
|
|
/*
|
|
* Global informations
|
|
* Main clock: 6 Mhz
|
|
* Tim2 PWM range: 0 - 255 (freq: 23437,5 Mhz)
|
|
* TIM21: encodeur gauche (0 - 65535)
|
|
* LPTIM: encodeur droit (0 - 65535)
|
|
*/
|
|
|
|
/**
|
|
*
|
|
*/
|
|
void MOTEURS_DesactiveAlim(void) {
|
|
HAL_GPIO_WritePin(GPIOB, SHUTDOWN_ENCODERS_Pin, GPIO_PIN_SET);
|
|
HAL_GPIO_WritePin(GPIOB, SHUTDOWN_5V_Pin, GPIO_PIN_RESET);
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
void MOTEURS_ActiveAlim(void) {
|
|
HAL_GPIO_WritePin(GPIOB, SHUTDOWN_ENCODERS_Pin, GPIO_PIN_RESET);
|
|
HAL_GPIO_WritePin(GPIOB, SHUTDOWN_5V_Pin, GPIO_PIN_SET);
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
GPIO_PinState MOTEURS_EtatAlim(void) {
|
|
return HAL_GPIO_ReadPin(GPIOB, SHUTDOWN_5V_Pin);
|
|
}
|
|
|
|
int16_t MOTEUR_LireEncodeursGauche(void) {
|
|
uint16_t loc_val= htim21.Instance->CNT;
|
|
uint16_t overflow = htim21.Instance->SR;
|
|
int16_t val_end;
|
|
|
|
htim21.Instance->SR = htim21.Instance->SR & ~(TIM_SR_UIF);
|
|
|
|
if (overflow & TIM_SR_UIF) {
|
|
val_end = 0xFFFF-loc_val + MOTEUR_DerniereValEncodeursG;
|
|
} else {
|
|
val_end = MOTEUR_DerniereValEncodeursG-loc_val;
|
|
}
|
|
|
|
MOTEUR_DerniereValEncodeursG = loc_val;
|
|
return val_end;
|
|
}
|
|
|
|
int16_t MOTEUR_LireEncodeursDroit(void) {
|
|
// uint16_t loc_val= hlptim1.Instance->CNT;
|
|
// uint32_t status = hlptim1.Instance->ISR;
|
|
// int16_t val_end;
|
|
//
|
|
// hlptim1.Instance->ICR=0xFF; // refait descendre les flags ISR
|
|
//
|
|
// if (status & LPTIM_ISR_ARRM) {
|
|
// val_end = 0xFFFF-loc_val + MOTEUR_DerniereValEncodeursD;
|
|
// } else {
|
|
// val_end = MOTEUR_DerniereValEncodeursD-loc_val;
|
|
// }
|
|
//
|
|
// val_end= -val_end;
|
|
//
|
|
// MOTEUR_DerniereValEncodeursD = loc_val;
|
|
// return val_end;
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
void MOTEURS_Init(void) {
|
|
/* Desactive les alimentations des moteurs */
|
|
MOTEURS_DesactiveAlim();
|
|
|
|
// /* Lance les timers (timers PWM + timers encodeurs) et regle tout à zero*/
|
|
// hlptim1.Instance->CR = LPTIM_CR_ENABLE;
|
|
// hlptim1.Instance->CR = LPTIM_CR_ENABLE | LPTIM_CR_CNTSTRT;
|
|
// hlptim1.Instance->ARR = 65535;
|
|
// hlptim1.Instance->CFGR = LPTIM_CFGR_ENC;
|
|
//
|
|
// hlptim1.Instance->CNT = 0;
|
|
|
|
htim21.Instance->ARR = 65535;
|
|
htim21.Instance->CR1 = htim21.Instance->CR1 | TIM_CR1_CEN| TIM_CR1_URS;
|
|
htim21.Instance->CNT = 0;
|
|
|
|
htim2.Instance->ARR = 255;
|
|
htim2.Instance->CNT = 0;
|
|
htim2.Instance->CCR1 = 0;
|
|
htim2.Instance->CCR2 = 0;
|
|
htim2.Instance->CCR3 = 0;
|
|
htim2.Instance->CCR4 = 0;
|
|
htim2.Instance->CR1 = htim2.Instance->CR1 | TIM_CR1_CEN;
|
|
htim2.Instance->CCER = TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E;
|
|
|
|
MOTEUR_CmdMoteurG =0;
|
|
MOTEUR_CmdMoteurD =0;
|
|
MOTEUR_ConsigneMoteurG =0;
|
|
MOTEUR_ConsigneMoteurD =0;
|
|
}
|
|
|
|
/**
|
|
* @brief Active les encodeurs et le regulateur des moteur si necessaire et
|
|
* regle la commande du moteur (entre -255 et +255)
|
|
*/
|
|
void MOTEURS_Set(uint8_t mot, int16_t val) {
|
|
uint8_t loc_val;
|
|
|
|
if (val>=0) {
|
|
if (val>255) loc_val = 255;
|
|
else loc_val =(uint8_t)val;
|
|
} else {
|
|
if (val < -255) loc_val = 255;
|
|
else loc_val =(uint8_t)(-val);
|
|
}
|
|
|
|
if (MOTEURS_EtatAlim()==GPIO_PIN_RESET)
|
|
MOTEURS_ActiveAlim();
|
|
|
|
if (mot == MOTEUR_DROIT) {
|
|
if (val >=0) {
|
|
htim2.Instance->CCR1 = (uint16_t)loc_val;
|
|
htim2.Instance->CCR2 = 0;
|
|
} else {
|
|
htim2.Instance->CCR2 = (uint16_t)loc_val;
|
|
htim2.Instance->CCR1 = 0;
|
|
}
|
|
} else {
|
|
if (val >=0) {
|
|
htim2.Instance->CCR4 = (uint16_t)loc_val;
|
|
htim2.Instance->CCR3 = 0;
|
|
} else {
|
|
htim2.Instance->CCR3 = (uint16_t)loc_val;
|
|
htim2.Instance->CCR4 = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
void MOTEURS_Test (void) {
|
|
int16_t deltaG, deltaD =0;
|
|
|
|
MOTEUR_LireEncodeursGauche();
|
|
MOTEUR_LireEncodeursDroit();
|
|
|
|
while (1) {
|
|
HAL_Delay(MOTEUR_DELAY);
|
|
|
|
MOTEUR_NBImpulsionsG = MOTEUR_LireEncodeursGauche();
|
|
MOTEUR_NBImpulsionsD = MOTEUR_LireEncodeursDroit();
|
|
|
|
deltaG = MOTEUR_ConsigneMoteurG - MOTEUR_NBImpulsionsG;
|
|
deltaD = MOTEUR_ConsigneMoteurD - MOTEUR_NBImpulsionsD;
|
|
|
|
if (((MOTEUR_ConsigneMoteurD ==0) && (MOTEUR_ConsigneMoteurG ==0)) &&
|
|
((deltaD==0) && (deltaG==0))) MOTEURS_DesactiveAlim();
|
|
else MOTEURS_ActiveAlim();
|
|
|
|
if (deltaG !=0) {
|
|
MOTEUR_CmdMoteurG = MOTEUR_CmdMoteurG + MOTEUR_Kp*deltaG;
|
|
if (MOTEUR_ConsigneMoteurG>=0) {
|
|
if (MOTEUR_CmdMoteurG>255) MOTEUR_CmdMoteurG=255;
|
|
if (MOTEUR_CmdMoteurG<0) MOTEUR_CmdMoteurG=0;
|
|
} else {
|
|
if (MOTEUR_CmdMoteurG>0) MOTEUR_CmdMoteurG=0;
|
|
if (MOTEUR_CmdMoteurG<-255) MOTEUR_CmdMoteurG=-255;
|
|
}
|
|
|
|
MOTEURS_Set(MOTEUR_GAUCHE, MOTEUR_CmdMoteurG);
|
|
}
|
|
|
|
if (deltaD !=0) {
|
|
MOTEUR_CmdMoteurD = MOTEUR_CmdMoteurD + MOTEUR_Kp*deltaD;
|
|
if (MOTEUR_ConsigneMoteurD>=0) {
|
|
if (MOTEUR_CmdMoteurD>255) MOTEUR_CmdMoteurD=255;
|
|
if (MOTEUR_CmdMoteurD<0) MOTEUR_CmdMoteurD=0;
|
|
} else {
|
|
if (MOTEUR_CmdMoteurD>0) MOTEUR_CmdMoteurD=0;
|
|
if (MOTEUR_CmdMoteurD<-255) MOTEUR_CmdMoteurD=-255;
|
|
}
|
|
|
|
MOTEURS_Set(MOTEUR_DROIT, MOTEUR_CmdMoteurD);
|
|
}
|
|
}
|
|
}
|