|

楼主 |
发表于 2021-10-20 19:10:32
|
显示全部楼层
捕获中断
if((FL_ATIM_IsActiveFlag_Update(ATIM)) == 1)
{
FL_ATIM_ClearFlag_Update(ATIM);
TIM3_Update_Cnt++;
}
if(FL_ATIM_IsActiveFlag_CCOverflow(ATIM, FL_ATIM_CHANNEL_1) == 1)
{
FL_ATIM_ClearFlag_CCOverflow(ATIM, FL_ATIM_CHANNEL_1); //清除CC1捕捉标志
if(CaptureNumber == 0)
{
FL_ATIM_WriteCounter(ATIM, 0);
TIM3_Update_Cnt = 0; // 需要特别注意,一定要在第一次捕获到的时候清零
CaptureNumber = 1;
FL_ATIM_OC_SetReverseChannelPolarity(ATIM,FL_ATIM_IC_POLARITY_NORMAL, FL_ATIM_CHANNEL_1); // 配置为下降沿
}
else if(CaptureNumber == 1)
{
IC3ReadValue1 = FL_ATIM_ReadCompareCH1(ATIM) + 65536*TIM3_Update_Cnt;
CaptureNumber = 2;
FL_ATIM_OC_SetReverseChannelPolarity(ATIM,FL_ATIM_IC_POLARITY_INVERT, FL_ATIM_CHANNEL_1); // 配置为上降沿
}
else if(CaptureNumber == 2)
{
IC3ReadValue2 = FL_ATIM_ReadCompareCH1(ATIM) + 65536*TIM3_Update_Cnt;
// Frequency = (uint32_t) (SystemCoreClock * 1.0 / IC3ReadValue2 + 0.5);
Frequency = (uint32_t) (1000000 / IC3ReadValue2); //频率 主时钟为8MHZ、8分频的计算公式
TIM3Duty = (uint32_t) (IC3ReadValue1 * 100.0 / IC3ReadValue2 + 0.5);
CaptureNumber = 0;
}
}
捕获初始化
void ATIM_CAPTURE_Init(void) //PWM输入捕获
{
FL_ATIM_InitTypeDef InitStructer1;
FL_ATIM_IC_InitTypeDef InitStructer2;
FL_ATIM_SlaveInitTypeDef InitStructer3;
FL_GPIO_InitTypeDef GPIO_InitStruct = {0};
/*-----------------------------------GPIO初始化---------------------------------------GPIOB FL_GPIO_PIN_4*/
GPIO_InitStruct.pin = FL_GPIO_PIN_4;
GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.pull = FL_DISABLE;
GPIO_InitStruct.remapPin = FL_ENABLE;
FL_GPIO_Init(GPIOB, &GPIO_InitStruct); //CH1
FL_GPIO_ResetOutputPin(GPIOB, FL_GPIO_PIN_4);
/*-----------------------------时基结构体初始化----------------------------------------*/
InitStructer1.clockSource = FL_CMU_ATIM_CLK_SOURCE_APBCLK;//时钟源 APB2
InitStructer1.prescaler = 7; //分频8000
InitStructer1.counterMode = FL_ATIM_COUNTER_DIR_UP; //向上计数
InitStructer1.autoReload = 65535; //自动装载值65536
InitStructer1.clockDivision = FL_ATIM_CLK_DIVISION_DIV1; // 死区和数字滤波分频
InitStructer1.repetitionCounter = 0; //重复计数0
InitStructer1.autoReloadState = FL_ENABLE; //自动重装载ARPE使能
FL_ATIM_Init(ATIM, &InitStructer1);
/*----------------------------从模式结构体初始化--------------------------------------*/
InitStructer3.slaveMode = FL_ATIM_SLAVE_MODE_TRGI_RISE_RST; //从机复位模式,用于配制PWM输入捕获
InitStructer3.triggerSrc = FL_ATIM_TRGI_TI1FP1; //触发源选择 TI1FP1
InitStructer3.triggerDelay = FL_DISABLE; //TRGI延迟禁止
FL_ATIM_SlaveMode_Init(ATIM, &InitStructer3);
/*---------------------------输入捕获结构体初始化-------------------------------------*/
InitStructer2.ICPolarity = FL_ATIM_IC_POLARITY_NORMAL ; //上升沿捕获
InitStructer2.ICActiveInput = FL_ATIM_CHANNEL_MODE_INPUT_NORMAL; //CC1配置为输入,IC1映射到TI1
InitStructer2.ICPrescaler = FL_ATIM_IC_PSC_DIV1; //输入捕捉分频 捕捉到一个跳变沿即进入捕获中断
InitStructer2.ICFilter = FL_ATIM_IC_FILTER_DIV1; //输入捕捉滤波配置
InitStructer2.captureState = FL_ENABLE; //使能CC1通道
FL_ATIM_IC_Init(ATIM, FL_ATIM_CHANNEL_1, &InitStructer2);
//InitStructer2.ICPolarity = FL_ATIM_IC_POLARITY_INVERT; //下降沿捕获
//InitStructer2.ICActiveInput = FL_ATIM_CHANNEL_MODE_INPUT_CROSSOVER; //CC2配置为输入,IC1映射到TI1
//FL_ATIM_IC_Init(ATIM, FL_ATIM_CHANNEL_2, &InitStructer2);
NVIC_DisableIRQ(ATIM_IRQn);
NVIC_SetPriority(ATIM_IRQn, 1); //中断优先级配置
NVIC_EnableIRQ(ATIM_IRQn);
FL_ATIM_ClearFlag_CC(ATIM, FL_ATIM_CHANNEL_1); //清除CC1捕捉标志
FL_ATIM_EnableIT_CC(ATIM, FL_ATIM_CHANNEL_1); //使能CC1捕捉中断
//FL_ATIM_ClearFlag_CC(ATIM, FL_ATIM_CHANNEL_2); //清除CC2捕捉标志
// FL_ATIM_EnableIT_CC(ATIM, FL_ATIM_CHANNEL_2); //使能CC2捕捉中断
//FL_ATIM_EnableIT_Update(ATIM);
FL_ATIM_Enable(ATIM); //使能定时器
} |
|