STM32F103 PWM输入捕捉周期和占空比

初始化

	u8  TIM2CH2_CAPTURE_STA;	//标记状态
	u16 TIM2_Over_Count;			//记录计数器溢出的次数
	u16	TIM2CH2_CAPTURE_VAL;	//接收计数器里的值
	u32 T2CH2_HL_Time;			//time2 ch2 高电平时间
	u32 T2CH2_Period_Time;		//time2 CH2 的周期
	u32 T2CH2_Duty;				//time2 ch2 的占空比
	u32 T2CH2_CapTime;		//记录进入中断的时间,用于判断长时间不进中断,给duty赋0
	
	TIM_ICInitTypeDef  TIM2_ICInitStructure;

void TIM2_Cap_Init(u16 arr,u16 psc)
{	 
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
 	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	//
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //
	
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;  //
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //
	GPIO_Init(GPIOA, &GPIO_InitStructure);
//	GPIO_ResetBits(GPIOA,GPIO_Pin_0);						 //
	
	//
	TIM_TimeBaseStructure.TIM_Period = arr; //
	TIM_TimeBaseStructure.TIM_Prescaler =psc; 	//  
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //
  
	//
	TIM2_ICInitStructure.TIM_Channel = TIM_Channel_2; //
	TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;	//
	TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //
	TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;	 //
	TIM2_ICInitStructure.TIM_ICFilter = 0x00;//
	TIM_ICInit(TIM2, &TIM2_ICInitStructure);
	
	
	//
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //
	NVIC_Init(&NVIC_InitStructure);  //
	
	TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC2,ENABLE);//
	
	TIM_Cmd(TIM2,ENABLE ); 	//
}

中断

void TIM2_IRQHandler(void)
{   
		if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //溢出中断
		{	  
				TIM2_Over_Count++;			//中断次数加1
				TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //	清楚溢出中断标志位	
		}
		//**********************************************************************************************************
		if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)	//  捕获中断,上升沿或下降沿到来
		{
			T2CH2_CapTime=System_Time;
			if(TIM2CH2_CAPTURE_STA==0X40)		//	上一次捕捉的是上升沿,这次捕捉的是下降沿
			{	  		
				//
				TIM2CH2_CAPTURE_STA=0X80;		//成功捕捉到下降沿,标记高电平捕捉完毕
				TIM2CH2_CAPTURE_VAL=TIM_GetCapture2(TIM2);//得到计数器里的值
				T2CH2_HL_Time=TIM2CH2_CAPTURE_VAL+TIM2_Over_Count*65536; //**得到高电平时间**
		   	TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Rising); // 设置下一次捕捉的是上升沿
			}
			//--------------------------------------------------------------------------------------------------------------------------
			else  	//这一次捕捉的是上升沿
			{
				//
				TIM2CH2_CAPTURE_VAL=TIM_GetCapture2(TIM2);
				T2CH2_Period_Time=TIM2CH2_CAPTURE_VAL+TIM2_Over_Count*65536;//**得到周期**
				//
				TIM2CH2_CAPTURE_STA=0;			//
				TIM2_Over_Count=0;
				TIM2CH2_CAPTURE_VAL=0;
	 			TIM_SetCounter(TIM2,0);
				TIM2CH2_CAPTURE_STA=0X40;		// 成功捕捉到上升沿标志
		  	 	TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Falling);		// 设置下一次捕捉下降沿
			}		
		 	TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); //	清除捕获中断标志位。
		}			     	    					      
}

获取占空比

float Get_TIM2CH2_Duty(void)
{
	float duty;
	if(System_Time-T2CH2_CapTime>1000)
	{duty=0;}//防止pwm突然消失,进不了中断,duty维持上一个值。这里判断超过1s没有进中断,给duty赋0
	else
	{duty=T2CH2_HL_Time*100/T2CH2_Period_Time;}
	return duty;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值