黑洞飞控代码分析(四)------遥控的接收

对于遥控器的接收,首先想到的是TIM2和TIM3虽然进行了初始化,但是并没有发挥什么作用

查看他们的中断函数,两个中断函数在同一文件里,以TIM2为例

u8 	Rc_Capture_Sta[6] = {0};//6个通道的捕获状态
u16 Rc_Channel_Val[6] = {0};//6个通道的捕获值

/*
 * 函数名:TIM2_IRQHandler
 * 描述  :定时器2输入捕获中断函数
 * 输入  :无
 * 输出  :无
 */ 
void TIM2_IRQHandler(void)
{
//**************************捕获1发生捕获事件**************************	
	if (TIM_GetITStatus(TIM2, TIM_IT_CC1)	!= RESET)
		{	
			if(Rc_Capture_Sta[0])																				//捕获到下降沿 		
			{	  			
				Rc_Channel_Val[0]	=	TIM_GetCapture1(TIM2);								//读取捕获值,这里为PWM高电平时间
			 	Rc_Capture_Sta[0]	=	0;																		//标记捕获到下升沿
				TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); 				//设置为上升沿捕获
			}
			else  																											//捕获到上升沿
			{
				TIM_SetCounter(TIM2,0);																		//计数器立刻清零计数
				Rc_Capture_Sta[0]	=	1;																		//标记捕获到了上升沿
				TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);				//设置为下降沿捕获
			}	
      TIM_ClearITPendingBit(TIM2, TIM_IT_CC1	|	TIM_IT_Update ); 	//清除通道1中断标志位			
		}			     	   
	
//**************************捕获2发生捕获事件**************************			
	if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
	{	
		if(Rc_Capture_Sta[1])																					//捕获到下降沿 		
		{	  			
			Rc_Channel_Val[1]	=	TIM_GetCapture2(TIM2);									//读取捕获值,这里为PWM高电平时间	
			Rc_Capture_Sta[1]	=	0;																			//标记捕获到下升沿 		
			TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Rising); 					//设置为上升沿捕获 
		}
		else																													//捕获到上升沿
		{
			Rc_Capture_Sta[1]	=	1;																			//计数器立刻清零计数
			TIM_SetCounter(TIM2,0);																			//标记捕获到了上升沿
			TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Falling);					//设置为下降沿捕获
		}		 
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC2 ); 			 							//清除通道2中断标志位	
	}			 	
		
//**************************捕获3发生捕获事件**************************			
	if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
	{	
		if(Rc_Capture_Sta[2])																					//捕获到下降沿 				 		
		{	  			
			Rc_Channel_Val[2]=TIM_GetCapture3(TIM2);										//读取捕获值,这里为PWM高电平时间
			Rc_Capture_Sta[2]=0;																				//标记捕获到下升沿
		  TIM_OC3PolarityConfig(TIM2,TIM_ICPolarity_Rising); 					//设置为上升沿捕获  
		}
		else  																												//捕获到上升沿
		{
			Rc_Capture_Sta[2]=1;																				//计数器立刻清零计数
	 		TIM_SetCounter(TIM2,0);																			//标记捕获到了上升沿
			TIM_OC3PolarityConfig(TIM2,TIM_ICPolarity_Falling);					//设置为下降沿捕获
		}		 
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC3 ); 			 							//清除通道3中断标志位	
	}			 

	
//**************************捕获4发生捕获事件**************************	
	if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET)
	{	
		if(Rc_Capture_Sta[3])																					//捕获到下降沿 		
		{	  			
			Rc_Channel_Val[3]=TIM_GetCapture4(TIM2);										//读取捕获值,这里为PWM高电平时间
			Rc_Capture_Sta[3]=0;																				//标记捕获到下升沿
			TIM_OC4PolarityConfig(TIM2,TIM_ICPolarity_Rising);  				//设置为上升沿捕获
		}
		else  																												//捕获到上升沿
		{
			Rc_Capture_Sta[3]=1;																				//计数器立刻清零计数
	 		TIM_SetCounter(TIM2,0);																			//标记捕获到了上升沿
	 		TIM_OC4PolarityConfig(TIM2,TIM_ICPolarity_Falling);					//设置为下降沿捕获
		}	
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC4 ); 			     					//清除通道4中断标志位	
	}			 
}

/*
 * 函数名:TIM3_IRQHandler
 * 描述  :定时器3输入捕获中断函数
 * 输入  :无
 * 输出  :无
 */ 
void TIM3_IRQHandler(void)
{
	//**************************捕获1发生捕获事件**************************	
	if (TIM_GetITStatus(TIM3, TIM_IT_CC1)	!= RESET)
		{	
			if(Rc_Capture_Sta[4])																				//捕获到下降沿 		
			{	  			
				Rc_Channel_Val[4]	=	TIM_GetCapture1(TIM3);								//读取捕获值,这里为PWM高电平时间
			 	Rc_Capture_Sta[4]	=	0;																		//标记捕获到下升沿
				TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Rising); 				//设置为上升沿捕获
			}
			else  																											//捕获到上升沿
			{
				TIM_SetCounter(TIM3,0);																		//计数器立刻清零计数
				Rc_Capture_Sta[4]	=	1;																		//标记捕获到了上升沿
				TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Falling);				//设置为下降沿捕获
			}	
      TIM_ClearITPendingBit(TIM3, TIM_IT_CC1	|	TIM_IT_Update ); 	//清除通道1中断标志位			
		}			     	   
	
//**************************捕获2发生捕获事件**************************			
	if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
	{	
		if(Rc_Capture_Sta[5])																					//捕获到下降沿 		
		{	  			
			Rc_Channel_Val[5]	=	TIM_GetCapture2(TIM3);									//读取捕获值,这里为PWM高电平时间	
			Rc_Capture_Sta[5]	=	0;																			//标记捕获到下升沿 		
			TIM_OC2PolarityConfig(TIM3,TIM_ICPolarity_Rising); 					//设置为上升沿捕获 
		}
		else																													//捕获到上升沿
		{
			Rc_Capture_Sta[5]	=	1;																			//计数器立刻清零计数
			TIM_SetCounter(TIM3,0);																			//标记捕获到了上升沿
			TIM_OC2PolarityConfig(TIM3,TIM_ICPolarity_Falling);					//设置为下降沿捕获
		}		 
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC2 ); 			 							//清除通道2中断标志位	
	}		
}


其实这些是我在看姿态控制的时候偶然发现的

这里的TIM2的4个通道加TIM3的2个通道,共6个通道,

在这里TIM2的4个通道中断函数类似,这里以1通道为例;

	if (TIM_GetITStatus(TIM2, TIM_IT_CC1)	!= RESET)
		{	
			if(Rc_Capture_Sta[0])			//捕获到下降沿 		
			{	  			
				Rc_Channel_Val[0]=TIM_GetCapture1(TIM2);	//读取捕获值,这里为PWM高电平时间
			 	Rc_Capture_Sta[0]=0;				//标记捕获到下升沿
				TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); //设置为上升沿捕获
			}
			else  							//捕获到上升沿
			{
				TIM_SetCounter(TIM2,0);			//计数器立刻清零计数
				Rc_Capture_Sta[0]=1;			//标记捕获到了上升沿
				TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);//设置为下降沿捕获
			}	
      TIM_ClearITPendingBit(TIM2, TIM_IT_CC1	|	TIM_IT_Update ); 	//清除通道1中断标志位			
		}			     	   
	
在初始化的时候
  TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;	
上升沿触发中断,首先捕获中断,计数器清零,标记捕获了上升沿,将中断设置成下降沿触发,清除道1中断标志位,然后再次触发的时候,下降沿触发,获得TIMx输入捕获1的值即通道1的遥控输入,将中断设置成上升沿触发,清除道1中断标志位,这里的设置不是很清楚,可能是为了消抖,具体是为什么再查查。

但是在清除清除通道1中断标志位的时候同时清除了TIM2中断源,

而在清除清除通道2中断标志位的时候就没有清除TIM2中断源为什么????

TIM3中断函数也是这样处理.





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值