电动自行车的后轮电机是一个直流无刷电机,可直接采用电机自身的霍尔检测器的信号来采集速度信息,而不增加其他位置和速度检测元件。采用霍尔信号对转速测量通常采用两种方法,一种是使用一路信号进行测量,一种是利用三路霍尔,通过逻辑电路或算法,产生六倍于一路霍尔信号频率倍频信号,然后对其进行测量。本文介绍以STM32单片机位核心、一路霍尔信号进行电动机转速测量系统。
1、## 无刷直流电动机霍尔测速的原理 ##
无刷直流电机的工作原理本质上与有刷电机类似,有刷直流电机采用机械的电刷和换向器对绕组中的电流进行换向。而无刷电机采用电子方式对绕组电流换向。直流电机中转矩是通过永磁体磁场和绕组中的电流相互作用产生的,在有刷电机中,换向器通过切换电枢绕组实现电枢电流的换向与合适的磁场。而无刷直流电机中,霍尔位置传感器探测转子旋转磁场的位置,通过逻辑与驱动电路,给相应的绕组激励。总的说来,绕组根据电机永磁体的磁场作出反应,从而产生需要的转矩。如下图是一种三相8极(四对磁极)无刷直流电机基本组成:
旋转的永磁体转过双极型数字霍尔传感器时,会使双极型数字霍尔传感器状态发生改变,即发出一个低频脉冲。如果电机磁极对数是上图中8极磁体无刷直流电机中,则电机每转一圈,就会有8个脉冲出现。
2、## 转速算法的选取 ##
单片机转速测量的算法很多,主要有频率测速法(M法)、周期测速法(T法)、MT法等。
M 测速法:通过在相同的时间T间隔内计算传感器输出的脉冲个数来算出转速;设霍尔传感器输出的信号每转 R个脉冲,对应的转速为N(r/min),则f=RN/60,就可算出实际转速为N=60M/RT(r/min)。
根据上式可确定这种测速法的分辨率为:Q= 60(M+1)/RT-60M/RT =60/RT
其中:R为每转的信号数,T为间隔时间,M为T时间内测得的脉冲数。
可见这种测速法的分辨率取决于电机转一周的输出方波R和测速周期T,极对数越多或测量周期越长,则分辨率越小,但一般电机的R不大,且测量周期不宜过大,因为测量周期过大为影响测速的反应速度,降低系统的实时性。所以这种方法是不可取的。
T法测速:通过测量传感器发出的相邻两个脉冲之间的T来算出转速。用一个计数器对一个已知频率为f的时钟脉冲计数;传感器每输出一个脉冲都想CPU申请一次中断,CPU响应中断读出计数值M,并将计数器清零。则可计算出转速的公式为:N=60f/MR (r/min)。
这种测速的分辨率为:Q=60f/R(M-1)-60f/MR=60f/RM(M-1)=RN*N/(60f-RN)
其中,f为时钟频率,R为每转输出的信号数,,M为中断读到的计数值。
可见这种测速法的分辨率与转速有关,转速越低,Q越小,因此,这种测速法在低速时有叫强的分辨率。
3、## 软件设计与实现 ##
/*
函数名:
函数功能:主函数
*/
int main(void)
{
u32 temp=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
delay_init(); //延时函数初始化
uart_init(9600); //9600
LED_Init(); //初始化与LED连接的硬件接口
TIM1_PWM_Init(199,7199); //不分频。PWM频率=10000/(199+1)=50hz
TIM_SetCompare1(TIM1,100);
TIM2_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数
Lcd_Init(); //LCD初始化
LCD_Clear(WHITE); //清屏
xianshi(); while(1)
{
delay_ms(10);
if(TIM2CH1_CAPTURE_STA&0X80)//成功捕获到了一次高电平
{
temp=TIM2CH1_CAPTURE_STA&0X3F;
temp*=65536; //溢出时间总和
temp+=TIM2CH1_CAPTURE_VALwNum(10,55,temp,6);
LCD_ShowNum(10,55,temp,6);//LCD显示捕获的周期值
delay_ms(10000);
TIM2CH1_CAPTURE_STA=0;
//开启下一次捕获
}
}
}
/*
函数名:
函数功能:输入捕获中断处理函数
*/
u8 TIM2CH1_CAPTURE_STA=0; //输入捕获状态
u16 TIM2CH1_CAPTURE_VAL; //输入捕获值
//定时器5中断服务程序
void TIM2_IRQHandler(void)
{
if((TIM2CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM2CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM2CH1_CAPTURE_VAL=0XFFFF;
}
else TIM2CH1_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
{
if(TIM2CH1_CAPTURE_STA&0X40) //捕获到第2个上升沿
{
TIM2CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次周期
TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);
}else //还未开始,第一次捕获上升沿
{
TIM2CH1_CAPTURE_STA=0; //清空
TIM2CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM2,0);
TIM2CH1_CAPTURE_STA|=0X40; //标记捕获到了第1次上升沿
}
}
}
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}
电动自行车的后轮电机是一个直流无刷电机,可直接采用电机自身的霍尔检测器的信号来采集速度信息,而不增加其他位置和速度检测元件。采用霍尔信号对转速测量通常采用两种方法,一种是使用一路信号进行测量,一种是利用三路霍尔,通过逻辑电路或算法,产生六倍于一路霍尔信号频率倍频信号,然后对其进行测量。本文介绍以STM32单片机位核心、一路霍尔信号进行电动机转速测量系统。
1、## 无刷直流电动机霍尔测速的原理 ##
无刷直流电机的工作原理本质上与有刷电机类似,有刷直流电机采用机械的电刷和换向器对绕组中的电流进行换向。而无刷电机采用电子方式对绕组电流换向。直流电机中转矩是通过永磁体磁场和绕组中的电流相互作用产生的,在有刷电机中,换向器通过切换电枢绕组实现电枢电流的换向与合适的磁场。而无刷直流电机中,霍尔位置传感器探测转子旋转磁场的位置,通过逻辑与驱动电路,给相应的绕组激励。总的说来,绕组根据电机永磁体的磁场作出反应,从而产生需要的转矩。如下图是一种三相8极(四对磁极)无刷直流电机基本组成:
旋转的永磁体转过双极型数字霍尔传感器时,会使双极型数字霍尔传感器状态发生改变,即发出一个低频脉冲。如果电机磁极对数是上图中8极磁体无刷直流电机中,则电机每转一圈,就会有8个脉冲出现。
2、## 转速算法的选取 ##
单片机转速测量的算法很多,主要有频率测速法(M法)、周期测速法(T法)、MT法等。
M 测速法:通过在相同的时间T间隔内计算传感器输出的脉冲个数来算出转速;设霍尔传感器输出的信号每转 R个脉冲,对应的转速为N(r/min),则f=RN/60,就可算出实际转速为N=60M/RT(r/min)。
根据上式可确定这种测速法的分辨率为:Q= 60(M+1)/RT-60M/RT =60/RT
其中:R为每转的信号数,T为间隔时间,M为T时间内测得的脉冲数。
可见这种测速法的分辨率取决于电机转一周的输出方波R和测速周期T,极对数越多或测量周期越长,则分辨率越小,但一般电机的R不大,且测量周期不宜过大,因为测量周期过大为影响测速的反应速度,降低系统的实时性。所以这种方法是不可取的。
T法测速:通过测量传感器发出的相邻两个脉冲之间的T来算出转速。用一个计数器对一个已知频率为f的时钟脉冲计数;传感器每输出一个脉冲都想CPU申请一次中断,CPU响应中断读出计数值M,并将计数器清零。则可计算出转速的公式为:N=60f/MR (r/min)。
这种测速的分辨率为:Q=60f/R(M-1)-60f/MR=60f/RM(M-1)=RN*N/(60f-RN)
其中,f为时钟频率,R为每转输出的信号数,,M为中断读到的计数值。
可见这种测速法的分辨率与转速有关,转速越低,Q越小,因此,这种测速法在低速时有叫强的分辨率。
3、## 软件设计与实现 ##
/*
函数名:
函数功能:主函数
*/
int main(void)
{
u32 temp=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
delay_init(); //延时函数初始化
uart_init(9600); //9600
LED_Init(); //初始化与LED连接的硬件接口
TIM1_PWM_Init(199,7199); //不分频。PWM频率=10000/(199+1)=50hz
TIM_SetCompare1(TIM1,100);
TIM2_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数
Lcd_Init(); //LCD初始化
LCD_Clear(WHITE); //清屏
xianshi(); while(1)
{
delay_ms(10);
if(TIM2CH1_CAPTURE_STA&0X80)//成功捕获到了一次高电平
{
temp=TIM2CH1_CAPTURE_STA&0X3F;
temp*=65536; //溢出时间总和
temp+=TIM2CH1_CAPTURE_VALwNum(10,55,temp,6);
LCD_ShowNum(10,55,temp,6);//LCD显示捕获的周期值
delay_ms(10000);
TIM2CH1_CAPTURE_STA=0;
//开启下一次捕获
}
}
}
/*
函数名:
函数功能:输入捕获中断处理函数
*/
u8 TIM2CH1_CAPTURE_STA=0; //输入捕获状态
u16 TIM2CH1_CAPTURE_VAL; //输入捕获值
//定时器5中断服务程序
void TIM2_IRQHandler(void)
{
if((TIM2CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM2CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM2CH1_CAPTURE_VAL=0XFFFF;
}
else TIM2CH1_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
{
if(TIM2CH1_CAPTURE_STA&0X40) //捕获到第2个上升沿
{
TIM2CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次周期
TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);
}else //还未开始,第一次捕获上升沿
{
TIM2CH1_CAPTURE_STA=0; //清空
TIM2CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM2,0);
TIM2CH1_CAPTURE_STA|=0X40; //标记捕获到了第1次上升沿
}
}
}
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}
举报