蓝桥杯输入检测方波频率以及占空比

这个有两种方式,第一种是最简单的,按照以下方法配置就可以了

这个表示使用了通道2作为PWM的输入通道,同时在这里有一个默认配置

可以根据自己需要调整这两个通道的触发中断的条件,并且 默认设置了CH2是间接得到PWM,CH1是直接得到PWM,这样可以让这两个通道得到同一个PWM的数据,然后可以更改他们的触发条件,可以是检测到上升沿也可以是检测到下降沿触发,后全部完成后可以进入keil

	HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
	HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);

启动中断,然后在定时器的输入捕获中断函数写以下代码

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)    //定时器3对应的输入捕获函数
{
	if(htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
	{
		Fall_count = TIM3->CCR1;
	}
	if(htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
	{
		Rising_count = TIM3->CCR2;
//		TIM3->CNT = 0;
	}
  UNUSED(htim);
}

运行后得到以下效果,我的通道二是上升沿开始计数,通道一是下降沿开始计数,它的原理很奇怪,默认刚开始是上升沿,然后再检测到上升沿就把CNT丢到CCR2同时会把CNT归零也就形成了周期,检测到下降沿的时候会把CNT的值丢进去CCR1也就形成了占空比,下面一种方法能更好帮你理解,先看成品效果图

 方法二

 

 重复上面操作,打开PWM输入捕获中断,写好输入捕获中断函数,然后发现CCR1和CCR2的值一直在变化,这个时候尝试加入CNT = 0;

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)    //定时器3对应的输入捕获函数
{
	if(htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
	{
		Fall_count = TIM3->CCR1;
	}
	if(htim->Instance == TIM3 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
	{
		Rising_count = TIM3->CCR2;
		TIM3->CNT = 0;
	}
  UNUSED(htim);
}

我们会有以下答案,与之前的值差了一点,这个可能是程序运行时间,但是我们丢进去在 ch1里面产生CNT = 0;

CNT = 0发生在CH1时我们发现CCR1和CCR2交换了值,这更验证了我们的猜想,CNT = 0发生在上升沿,并且默认刚开始是上升沿,然后第二次识别到上升沿才触发中断形成周期。 

 

当然Fall_count = HAL_TIM_ReadCapturedValue (&htim3,TIM_CHANNEL_1);和我的直接读取寄存器的效果是一样的

 这种方法并不准确,主要在于这个CNT = 0;存放位置,感谢各位大佬帮忙指正

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值