频率和占空比测量
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2)
{
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//上升沿
{
cap_val_rise_PA15 = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1) + 1;
frequency_PA15 = 1000000 / (cap_val_rise_PA15*1.0);
duty_PA15=(capval_fall_PA15*1.0/cap_val_rise_PA15)*100;
__HAL_TIM_SET_COUNTER(&htim2, 0);
}
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)//下降沿
{
capval_fall_PA15 = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2) + 1;
}
}
if (htim->Instance == TIM3)
{
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)//上升沿
{
cap_val_rise_PB4 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1) + 1;
frequency_PB4 = 1000000 / (cap_val_rise_PB4*1.0);
duty_PB4=(capval_fall_PB4*1.0/cap_val_rise_PB4)*100;
__HAL_TIM_SET_COUNTER(&htim3, 0);
}
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)//下降沿
{
capval_fall_PB4 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_2) + 1;
}
}
}
倍频输出
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint8_t PA6_Flag = 0;
static uint8_t PA7_Flag = 0;
if(htim->Instance == TIM16)
{
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
uint32_t ARR_Val_PA6 = 1000000/frequency_PB4*N_PA6;
__HAL_TIM_SET_AUTORELOAD(&htim16,ARR_Val_PA6);
uint32_t capture = __HAL_TIM_GET_COUNTER(&htim16);
if(PA6_Flag == 0)
{
PA6_Flag = 1;
__HAL_TIM_SET_COMPARE(&htim16, TIM_CHANNEL_1, capture + ARR_Val_PA6*duty_PA15);
}
else if(PA6_Flag == 1)
{
PA6_Flag = 0;
__HAL_TIM_SET_COMPARE(&htim16, TIM_CHANNEL_1, capture + ARR_Val_PA6*(1 - duty_PA15));
}
}
}
if(htim->Instance == TIM17)
{
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
uint32_t ARR_Val_PA7 = 1000000/frequency_PB4*N_PA7;
__HAL_TIM_SET_AUTORELOAD(&htim17,ARR_Val_PA7);
uint32_t capture = __HAL_TIM_GET_COUNTER(&htim17);
if(PA7_Flag == 0)
{
PA7_Flag = 1;
__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, capture + ARR_Val_PA7*duty_PB4);
}
else if(PA7_Flag == 1)
{
PA7_Flag = 0;
__HAL_TIM_SET_COMPARE(&htim17, TIM_CHANNEL_1, capture + ARR_Val_PA7*(1 - duty_PB4));
}
}
}
}