【蓝桥杯嵌入式国赛】单通道输入捕获PWMI

前言:蓝桥杯嵌入式扩展板中,PWM1与PWM2分别为TIM3_CH1和TIM3_CH2,双通道的PWMI模式冲突,而两者又均有测量占空比的需求,故需使用单通道进行极性转换来同时测量占空比。

一、CubeMX配置:

由于是单通道的PWMI,故与输入捕获配置相同,不要忘记打开NVIC中断控制。

二、代码部分:

初始化开启定时器输入捕获:

	HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);

处理中断函数:

int ccr[2]={0};   //ccr[0]为高电平计数值,ccr[1]为一个周期的计数值
float fre=0;
float duty=0;
uint8_t flag=0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){
	if(htim->Instance == htim3.Instance){
		if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){    //TIM3 通道1
			if(flag == 0){	
				__HAL_TIM_SetCounter(htim,0); //清0计数器
				__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING); //设置成下降沿触发
				flag = 1;
			} 
			else if (flag == 1){
				ccr[0] = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);   //读取CCR寄存器数值,此时为高电平计数值
				__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING); //设置成上升沿触发
				flag = 2;
			}
			else if (flag == 2){
				ccr[1] = HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);   //读取CCR寄存器数值,此时为一个周期的计数值
				fre = (float)1000000  / (float)(ccr[1]+1); //计算频率
				duty = (float)(ccr[0]+1)  / (float)(ccr[1]+1); //计算占空比
				flag = 0;
			}                  
		}
	}
}

注意:务必不要在中断函数里做一些耗时操作(如串口打印,控制LCD等),耗时任务会导致紧接着来的中断信号无法进入新的中断服务,最终呈现出结果跳变!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值