#define MAX_CNT 50000 float pw_s,frq_Hz; volatile uint16_t overflow_cnt,cntUpdate, temp_overflow_cnt; volatile int32_t inputCapture_A,inputCapture_B; volatile uint8_t update; int32_t zw_Erg; volatile int32_t capture_us; void MX_TIM4_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; TIM_IC_InitTypeDef sConfigIC; htim4.Instance = TIM4; htim4.Init.Prescaler = 71; htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.Period = 49999; htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim4) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } if (HAL_TIM_IC_Init(&htim4) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 15; if (HAL_TIM_IC_ConfigChannel(&htim4, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim == &htim4) { overflow_cnt++; } } void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { static uint16_t captureState=1; if(update==0) { switch (captureState) { case 0: //inputCapture_B temp_overflow_cnt = overflow_cnt; inputCapture_B = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); //1) update = 1; //2) captureState = 1; cntUpdate=0; break; case 1: // inputCapture_A inputCapture_A = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); //1) overflow_cnt = 0; update = 0; captureState = 0; cntUpdate=0; break; default: break; } } } int main(void) { MX_TIM4_Init(); while(1) { if (update == 1) { zw_Erg = inputCapture_B - inputCapture_A; if (zw_Erg >= 0) // Überlauf erkennung { capture_us = zw_Erg; // erg = (B-A) } else { capture_us = zw_Erg + MAX_CNT; // erg=(max-A)+B = (B-A)+max temp_overflow_cnt--; } capture_us = capture_us + (temp_overflow_cnt * MAX_CNT); if (capture_us >= 1) { pw_s = (double)capture_us / 1E6; frq_Hz = 1 / pw_s; // Frequenz in Hz frequenz_= (uint16_t)frq_Hz; if (frequenz_<20) { printf("\n\rpw_us= %li, Frequenz = %04.2f Hz OV=%i b=%li a=%li \r\n", capture_us,frq_Hz,temp_overflow_cnt,inputCapture_B,inputCapture_A); } //printf("\n\rpw_us= %li, Frequenz = %04.2f Hz OV=%i\r\n", pw_us,frq_Hz,overflow_cnt ); } else { printf("\n Alles scheiße"); } update = 0; } } }