一个定时器捕获不同PWM信号的中断函数 - 基于STM32

u16 TIM4CH1_CAPTURE_OLD;
u8  buhuo_diyige=0;
u8  shuju_num=0;
u8  shuju_start=0;
u16 jiange_shuzu[5];
u16 anjian[4];
u8  dangwei=0;

void TIM4_IRQHandler(void)
{
		if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)   //判断是否为更新中断
		{	
				buhuo_diyige=0;
				shuju_num=0;
		    shuju_start=0;
		}
 
		if (TIM_GetITStatus(TIM4, TIM_IT_CC3) != RESET) 		                    //捕获2发生捕获事件
		{
			  
			  if (shuju_start==0)                                                 //没有发现起始帧
				{
					if (buhuo_diyige==0 )		                                          //已经捕获到一个上升沿,且不是有用按键数据
					{
							TIM_SetCounter(TIM4, 0);
							buhuo_diyige=1;               		                            //标记已捕获到上升沿			
					}
					else                                                              //又捕获的是上升沿
					{
              u32 CH2_Time= TIM_GetCapture3(TIM4);
							
							if (CH2_Time>5000 && CH2_Time<15000)                          //5ms~10ms为第一个起始脉冲
							{
								   TIM4CH1_CAPTURE_OLD=TIM_GetCapture3(TIM4);               //记录当前值 这个一般是0左右,因为上面刚设置0
									 shuju_start=1;                                           //下面再捕获就是有用值
									 buhuo_diyige=0;     
                   shuju_num=0;								
							}
					}
			  }
				if(shuju_start==1)
				{
					  jiange_shuzu[shuju_num]=TIM_GetCapture3(TIM4);
				    shuju_num=shuju_num+1;//shuju_num++;

					  if(shuju_num>=5)
						{
									u8 i=0;
									for(i=0;i<4;i++)
									{
										  anjian[i]=jiange_shuzu[i+1]-jiange_shuzu[i];
									}
                  if(anjian[0]>1500&&anjian[1]>1500&&anjian[2]>1500&&anjian[3]>1500 &&anjian[0]<3500&&anjian[1]<3500&&anjian[2]<3500&&anjian[3]<3500)
						      {
											
											if(anjian[0]<2500 && anjian[1]<2500 && anjian[2]<2500 && anjian[3]>2500) //2 2 2 3
													dangwei=2;
											if(anjian[0]<2500 && anjian[1]<2500 && anjian[2]>2500 && anjian[3]>2500) //2 2 3 3
													dangwei=3;
											if(anjian[0]<2500 && anjian[1]<2500 && anjian[2]>2500 && anjian[3]<2500) //2 2 3 2
													dangwei=4;
											if(anjian[0]<2500 && anjian[1]>2500 && anjian[2]>2500 && anjian[3]<2500) //2 3 3 2
													dangwei=5;
											if(anjian[0]<2500 && anjian[1]>2500 && anjian[2]<2500 && anjian[3]<2500) //2 3 2 2
													dangwei=6;
											if(anjian[0]<2500 && anjian[1]>2500 && anjian[2]<2500 && anjian[3]>2500) //2 3 2 3
													dangwei=7;
											if(anjian[0]<2500 && anjian[1]>2500 && anjian[2]>2500 && anjian[3]>2500) //2 3 3 3
													dangwei=8;
											if(anjian[0]>2500 && anjian[1]>2500 && anjian[2]>2500 && anjian[3]>2500) //3 3 3 3
													dangwei=9;
											if(anjian[0]>2500 && anjian[1]>2500 && anjian[2]>2500 && anjian[3]<2500) //3 3 3 2
													dangwei=10;										
								 }
									buhuo_diyige=0;
									shuju_num=0;
									shuju_start=0;
									TIM_SetCounter(TIM4, 0);
						}
				}
		}
    TIM_ClearITPendingBit(TIM4, TIM_IT_CC3|TIM_IT_Update);//清除中断标志位		
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少侠出手了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值