New paste Repaste Download
volatile float roueAvRatio = 1.00;
volatile uint32_t roue_AvD_Timer = 0; <=== set in a timer capture interrupt
volatile uint32_t roue_Ar_Timer = 0; <=== set in a timer capture interrupt
void calcRoues() {
roueAvRatio = 0.5;
}
void main() {
calcRoues();
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
if (htim->Instance == TIM15) {
// Sortie roue avant
doRoueAvant();
    }
}
void doRoueAvant() {
uint32_t primask;
float periode;
uint16_t prescaler;
uint16_t diviseur;
uint16_t prescalertimer2 = TIM2->PSC + 1;
enterCritical(&primask);
// Verifie si les deux roues a une nouvelle impulsions de dispo.
if ((!roue_AvG_Nouveau) || (!roue_AvD_Nouveau)) {
// non, on répète l'impulsion?
if (roue_Av_Impulsion_Repetition < roue_Av_Impulsion_Repetition_Max) {
// oui
HAL_GPIO_TogglePin(ECU_ROUE_AV_GPIO_Port, ECU_ROUE_AV_Pin);
roue_Av_Impulsion_Repetition++;
}
// et on quitte
exitCritical(&primask);
return;
}
// remettre nouvelle impulsion à non
roue_AvG_Nouveau = 0;
roue_AvD_Nouveau = 0;
// et on reset le compteur de répétitions
roue_Av_Impulsion_Repetition = 0;
// Calcule la nouvelle période
// Moyenne des 2 roues transformé en impulsion d'horloge et ratio
periode = ((roue_AvG_Timer + roue_AvD_Timer) / 2) * prescalertimer2 * roueAvRatio;
// prescaller dynamique
diviseur = (periode / 65536) + 1;
if (diviseur > 2048) {
diviseur = 2048;
}
prescaler = diviseur - 1;
periode = periode / diviseur;
if (periode >= 65535) {
periode = 65535;
}
// timer update
// déactive les interrupt pour le timer
__HAL_TIM_DISABLE_IT(&htim15, TIM_IT_UPDATE);
//reset a 0
__HAL_TIM_SET_COUNTER(&htim15, 0);
// prescaler
__HAL_TIM_SET_PRESCALER(&htim15,prescaler);
// nouveau max
__HAL_TIM_SET_AUTORELOAD(&htim15, (uint16_t)periode);
// force l'update du prescaller
htim15.Instance->EGR = TIM_EGR_UG;
// enleve l'interrupt généré par l'update
__HAL_TIM_CLEAR_FLAG(&htim15, TIM_FLAG_UPDATE);
// réactive l'interrupt
__HAL_TIM_ENABLE_IT(&htim15, TIM_IT_UPDATE);
// toggle la sortie
HAL_GPIO_TogglePin(ECU_ROUE_AV_GPIO_Port, ECU_ROUE_AV_Pin);
exitCritical(&primask);
}
Filename: None. Size: 2kb. View raw, , hex, or download this file.

This paste expires on 2026-04-01 16:25:42.505748+00:00. Pasted through web.