STM32单片机测量方波频率方法总结一、测周法:通过一个方波的两个上升沿或下降沿触发中断,然后定时器计数,计数的总个数乘以计数单位时间即该方波的周期,具体可通过单片机输入捕获功能实现,以下为参考代码//输入捕获初始化函数voidinput_frequent_init(void)//采用TIM4的Channel_1通道作为输入捕获通道{//声明结构体变量,用来初始化定时器TIM_TimeBaseInitTypeDefTIM4_TimeBaseInitStructure;TIM_ICInitTypeDefTIM4_ICInitStructure;NVIC_InitTypeDefTIM4_NVIC_InitStructure;/*开启定时器4时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);TIM_ClearITPendingBit(TIM4,TIM_IT_Update|TIM_IT_CC1);//清除捕获和中断标志位TIM4_TimeBaseInitStructure.TIM_Period=0xffff;//设定计数器自动重装值(设置为最大)TIM4_TimeBaseInitStructure.TIM_Prescaler=1;//设置分频系数TIM4_TimeBaseInitStructure.TIM_ClockDivision=TIM_C//设置时钟分割:TDTS=Tck_timKD_DIV1;TIM4_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上计数模式TIM_TimeBaseInit(TIM4,&TIM4_TimeBaseInitStructure);//根据结构体参量初始化定时器TIM4_ICInitStructure.TIM_Channel=TIM_Channel_1;//选择输入捕获的输入端,IC1映射到TI1上TIM4_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//设置为上升沿捕获TIM4_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI;//映射到TI1上TIM4_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1;//配置输入分频,不分频TIM4_ICInitStructure.TIM_ICFilter=0x00;//IC1F=0000配置输入滤波器,此处不滤波TIM_ICInit(TIM4,&TIM4_ICInitStructure);//初始化TIM4通道1//中断分组初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);TIM4_NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;//打开TIM4的全局中断TIM4_NVIC_InitStructure.NVIC_IRQChannelPreemptionPri//抢占优先级配置为1ority=1;TIM4_NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级配置为1);TIM4_NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能NVIC_Init(&TIM4_NVIC_InitStructure);//初始化中断TIM_Cmd(TIM4,ENABLE);//使能中断TIM_ITConfig(TIM4,TIM_IT_Update|TIM_IT_CC1,ENABLE//使能捕获和更新中断}需要注意的是,如果所测信号中存在尖峰干扰信号,则TIM4_ICInitStructure.TIM_ICFilter=0x00;//IC1F=0000配置输入滤波器,此处不滤波这一行应根据干扰信号的高电平时间来赋予合适的滤波器的值,具体计算方法参考芯片手册或自行百度。voidTIM4_IRQHandler(){staticu8state;//存储捕获状态,state=0表示未捕获到//输入捕获中断函数第一个上升沿,state=1表示已经捕获到第一个上升沿次数u32timecount;//存储总的计数次数if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET)staticu32TIM4CH1_CAPTURE;//存储TIM4计数寄存器溢出//发生计数器溢出更新中断{TIM_ClearITPendingBit(TIM4,TIM_IT_CC1|TIM_IT_Update);//清除中断标志位}if(TIM_GetITStatus(TIM4,TIM_IT_CC1)!=RESET)//产生if(state==1)//在捕获到第一个上升沿后TIM4CH1_CAPTURE++;//溢出次数加一输入捕获中断{TIM_ClearITPendingBit(TIM4,TIM_IT_CC1|TIM_IT_Update);//清除中断标志位if(state==0)//未捕获到第一个上升沿}elseif(state==1)//已经捕获到第一个上升沿{state=1;//置1TIM_SetCounter(TIM4,0);//将计数器清零{state=0;//置0timecount=TIM_GetCapture1(TIM4)+TIM4CH1_CAPTURE*65536;//计算两个上升沿之间的总计数TIM4CH1_CAPTURE=0;//清零溢出次数TIM_SetCounter(TIM4,0);//清零计数器frequent_input=36000000.0/timecount;//计算频率}}注意:根据所测频率大致范围来配置定时器(可提高测量精度)该方法可精确测量较低频率,本人测试1k以下精确度高达0.1%,但随着频率的增加,误差也越来越大,故测低频时推荐此方法接下来的程序还可测量占空比,思路是先设置为上升沿捕获,然后设置为下降沿捕获,在设置为上升沿捕获,根据两次捕获中计数次数算出占空比duty=捕获高电平时...