来源B站江科大stm32入门教程
输入捕获模式测频率
根据输入捕获基本结构
void IC_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//GPIO
GPIO_InitTypeDef GPIO_Init_Structure;
//
GPIO_Init_Structure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init_Structure.GPIO_Pin=GPIO_Pin_6; //根据引脚对应表来查看,TIM3的通道1;
GPIO_Init_Structure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Init_Structure);
//TIMx internal Clock
TIM_InternalClockConfig(TIM3);
//时基单元,让CNT在内部时钟的驱动下自增
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period=65536-1; //ARR
TIM_TimeBaseInitStructure.TIM_Prescaler=72-1; //72M/PSC就是计数器自增的频率标准频率 :72M/72=1M
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
TIM_ICInitTypeDef TIM_ICInitStruct;
TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;
TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising; //上升沿
TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;
TIM_ICInit(TIM3,&TIM_ICInitStruct);
//Selects the Input Trigger source触发源
TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1);
//从模式
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset);
TIM_Cmd(TIM3,ENABLE);
}
uint32_t IC_GetFreq(void)
{
return 1000000/(TIM_GetCapture1(TIM3)+1); //fc/N
}
PWMI模式测频率占空比
配置好PWMI模式后,根据公式得到占空比
TIM_ICInitTypeDef TIM_ICInitStruct;
TIM_ICInitStruct.TIM_Channel=TIM_Channel_1;
TIM_ICInitStruct.TIM_ICFilter=0xF;
TIM_ICInitStruct.TIM_ICPolarity=TIM_ICPolarity_Rising;
TIM_ICInitStruct.TIM_ICPrescaler=TIM_ICPSC_DIV1;
TIM_ICInitStruct.TIM_ICSelection=TIM_ICSelection_DirectTI;
//可以快速的配置成PWMI结构。只需要传入一个通道的参数,会自动把剩下的一个通道初始化成相反的配置
//通道2,下降沿,交叉。
TIM_PWMIConfig(TIM3,&TIM_ICInitStruct);
//TIM_ICInit(TIM3,&TIM_ICInitStruct);
uint32_t IC_GetDuty(void)
{
return (TIM_GetCapture2(TIM3)+1)*100/TIM_GetCapture1(TIM3);
}