转速测量

1、转速测量的原理

转速测量的本质是计算因旋转引起的脉冲信号的频率。假设每旋转一周产生一个脉冲信号,如下所示是典型的逻辑时序:

转速测量_第1张图片

在脉冲信号的上升沿开始对采样时钟进行计数,在脉冲信号的下一次上升沿停止计数,即可获得被测物体旋转一周所需时间。此处假设采样时钟的频率记为符号F,那么采样时钟的周期Tc = 1/F,设在一个脉冲周期中经过的时钟周期数量为N。转速记为符号n,单位为“转/分”。那么:

被测物体旋转一周所需时间为N*Tc,脉冲信号的频率f = 1/(N*Tc)。

转速n = 60*f = 60/(N*Tc);

转速与采样时钟频率的关系:n = 60*F/N。

若旋转一周输出脉冲个数为M个(M≥1),那么转速n=60/(N*Tc)/M或60*F/N/M。

 

注:以上给出的两个计算公式分别适用于给定采样时钟周期和时钟频率的情况,事实上,周期与频率互为倒数关系,此处如此给出是为了便于代入计算。例如,通过软件定时器计数时,通常使用定时器周期,而使用硬件进行计数时,通常使用输入频率。

 

2、转速测量电路设计

(1)、通过硬件计数器采集

转速测量_第2张图片

该采集电路受使能端控制,使能端的下降沿清零计数器,使能端为低电平时,计数器不进行计数,使能端为高电平时使能转速采集,在转速信号的上升沿开始计数,下一次上升沿停止计数,得到一个旋转周期内的计数值。下图为关键信号时序。

转速测量_第3张图片

CPU在收到采集完成反馈信息后,在启动下次转速采集前可读取计数器的计数值,带入第一部分中的公式可计算出当前转速值。

(2)、通过软件计数器采集

转速测量_第4张图片

通过CPU的外部中断接收转速信号,CPU将外部中断设置为上升沿触发或下降沿,在检测到第一个上升沿/下降沿触发计数,在下一个上升沿/下降沿结束计数,可获得一个转速周期内定时器计数值。

需要注意的是,由于CPU的主频不同,可实现的定时器计数周期有所差异,因此在使用此种方式进行转速测量时要预估被测转速的范围,从而得到转速方波的周期范围,以便选取合适的计数时钟频率。

在已知计数时钟周期/频率,获得单个转速周期内计数值后,根据第一部分的公式可计算出当前转速。

示例代码:

void EXTIx_IRQHandler(void)
{
	if(WaitNextExti)
	{
		RevCounter = TIM_GetCounter(TIMx);  //读取计数器
		WaitNextExti = 0;
		RevReadFinish = 1;
	}
	else
	{
		if(EnableRevRead)  //已使能转速读取
		{
			//清TIMx计数器
			TIM_SetCounter(TIMx,0x00000000);
			
			WaitNextExti = 1; //等待下一次外部中断
			EnableRevRead = 0;
		}
	}
	EXTI_ClearITPendingBit(EXTI_Linex);//清除LINEx上的中断标志位 
}



void TIM5_Int_Init(u32 arr,u16 psc)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx,ENABLE);  //使能TIMx时钟
	
	TIM_TimeBaseInitStructure.TIM_Period = arr; 	//自动重装载值
	TIM_TimeBaseInitStructure.TIM_Prescaler=psc;    //定时器分频
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
	
	TIM_TimeBaseInit(TIMx,&TIM_TimeBaseInitStructure);//初始化TIMx
	
	TIM_ITConfig(TIMx,TIM_IT_Update,DISABLE); 
	TIM_Cmd(TIMx,ENABLE); 
}



void Handle_Rev_Cmd(void)
{
	EnableRevRead = 1;  
	RevReadTimeout = 0;
	
	IntoRevReadTime = os_time_get();  //进入代码的时间
	
	while(!RevReadFinish)  
	{
		if((os_time_get() - IntoRevReadTime) > 1*1000)  //1s超时退出
		{
			RevReadTimeout = 1;
			RevReadFinish = 1;
			break;
		}
	}
	
	if(RevReadTimeout)  
	{
		RevCounter = 0x000F4240;  
	}
	else
	{
		RevCounter = TIM_GetCounter(TIMx);  //读取计数器
	}
	
	//计算转速并发送至客户端
	RevValue = 60*1000000/RevCounter;  
	
	EnableRevRead = 0;
}

   

 

3、转速传感器

(1)、光电传感器

光电传感器通常使用红外线发射器与接收器来判断是否有物体从前方经过,可以选择直射方式、反射方式或投射方式。

直射式光电转速传感器由开孔圆盘、光源、光敏元件及缝隙板等组成。开孔圆盘的输入轴与被测轴相连接,光源发出的光,通过开孔圆盘和缝隙板照射到光敏元件上被光敏元件所接收,将光信号转为电信号输出。开孔圆盘上有许多小孔,开孔圆盘旋转一周,光敏元件输出的电脉冲个数等于圆盘的开孔数,因此,可通过测量光敏元件输出的脉冲频率,得知被测转速。

 

反射式光电传感器主要由被测旋转部件、反光片(或反光贴纸)、反射式光电传感器组成,在可以进行精确定位的情况下,在被测部件上对称安装多个反光片或反光贴纸会取得较好的测量效果。当测试距离近且测试要求不高时,可仅在被测部件上安装了一片反光贴纸,此时,当旋转部件上的反光贴纸通过光电传感器前时,光电传感器的输出就会跳变一次。通过测出这个跳变频率f,就可知道转速n。

 

(2)、霍尔传感器

用图示的方法设置磁体,使磁性转盘的输入轴与被测转轴相连,霍尔传感器固定在磁性转盘附近。当被测转轴转动时,磁性盘随之转动,磁体每经过霍尔传感器一次,霍尔传感器便输出一个相应的电压脉冲。检出单位时间的脉冲数,便可求出被测转速。

转速测量_第5张图片

 

关注微信公众号同步更新 

转速测量_第6张图片

你可能感兴趣的:(单片机开发与应用)