| 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);
|
| }
|