STM32定时器输入捕获测频率

芯片:STM32F407ZGT6
我想用定时器输入捕获来测量输入信号的频率和占空比,但是在输入信号峰峰值低于一定值之后测量就不准确了?
有人知道这是什么原因吗?如果我想测量的范围为0-3V,有什么办法可以解决吗(用输入捕获)?

这篇博客讲了你的问题:

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7536359
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:大家来造呼吸机_控制芯片STM32F407ZGT6_007_定时器中断仿真
  • 除此之外, 这篇博客: STM32F407ZGT6|定时器中断中的 6、主函数总代码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    #include "stm32f4xx.h"
    #include "delay.h"
    int main(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;//LED
    	NVIC_InitTypeDef  NVIC_InitStructure;//NVIC
    	TIM_TimeBaseInitTypeDef TIM_InitStructure;
    	
    	//使能定时器 及TIM3 外设时钟
    	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//ʹĜGPIOCʱ֓ 外设时钟使能
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能 定时器时钟TIM3
    	//设置TIM3_DIER允许更新中断
    	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//参数2:指明使能的定时器中断类型 更新(该项目为更新)、触发、输入捕获
    	
    	//LED 初始化 仅需设置前两个参数即可,后面三个均为默认
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Low_Speed;
    	GPIO_Init(GPIOC , &GPIO_InitStructure);
    	
    	//定时器初始化 通用定时器 四个参数即可
    //	TIM_InitStructure.TIM_Prescaler = 8400-1;//分频系数 500ms
    	TIM_InitStructure.TIM_Prescaler = 16800-1;//分频系数 用于对比 1000ms
    	TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
    	TIM_InitStructure.TIM_Period = 5000-1;//自动重载计数周期值
    	TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分频因子
    	TIM_TimeBaseInit(TIM3, &TIM_InitStructure);
    	
    	//中断优先级设计
    	//配置中断分组NVIC
    	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//定义的初始化中断
    	//	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//响应优先级
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_Init(&NVIC_InitStructure);
    	TIM_Cmd(TIM3,ENABLE);//使能TIM3
    	
    	//设置LED灯初始化熄灭 置高位
    	GPIO_SetBits(GPIOC, GPIO_Pin_13);//灯不亮
    	
    	while(1);
    }
    	//6、编写中断服务函数
    	//判断溢出中断是否发生
    	//清除某中断线的中断标志位
    void TIM3_IRQHandler(void)
    {
    	if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)//计数上溢
    	{
    		if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)==1)//灯不亮
    		{
    			GPIO_ResetBits(GPIOC, GPIO_Pin_13);//灯亮
    		}
    		else
    		{
    			GPIO_SetBits(GPIOC, GPIO_Pin_13);//灯不亮
    		}
    	}
    	TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除中断标志位
    }
    

    时间20221031
    友友们,后续我要开始利用定时器通过串口发送数据给上位机啦!


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^