cemi 发表于 2011-8-12 15:59:56

请问为什么这个霍尔传感器安装方法用来测量直流电机的转速不可靠(有图)?

我想用3144霍尔传感器测量一个直流电机的转速,安装方式如图,3144离磁钢的距离不到1mm,磁钢基本对准3144的感应点, 不知道为什么这种安装方法在转速高的时候(6000转/分)经常不准, 就是单位时间的脉冲数变化很大,为什么会这样的?另外如果想测量小直流电机的转速用什么方式方便一些?

http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_666946P6QR34.gif
(原文件名:Snap1.gif)

ldch 发表于 2011-8-12 16:19:05

有没有看看传感器的输出波形?

cemi 发表于 2011-8-12 19:40:53

我用示波器看了一下波形, 形状非常好,示波器读出的频率基本都是92.59Hz。
我是用stm32定时器的pwm输入捕捉3144霍尔传感器的输出的,电路很简单就是3144的输出接一个上拉然后接到定时器的输入,但是我看到输入脉冲计数的增加明显不均匀,每半秒增加的脉冲数从20几到100多跳来跳去,如果比较稳定的时候就会30到50间跳动,
示波器能比较稳定的读出传感器输出的频率,这样看来好像是stm32输入捕捉的问题,但问题在那里呢?

cemi 发表于 2011-8-12 19:45:50

关于定时器相关的代码不多,就是定时器设置,和中断处理

void TIM_Configuration(void)
{
    TIM_ICInitTypeDefTIM_ICInitStructure;
        //TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
        //TIM_OCInitTypeDefTIM_OCInitStructure;

        TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
        TIM_ICInitStructure.TIM_ICFilter = 0x0;
        TIM_ICInit(TIM2, &TIM_ICInitStructure);
       
        TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);
        TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);        /* Select the TIM2 Input Trigger: TI2FP2 */
        TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset); /* Select the slave Mode: Reset Mode */
        TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); /* Enable the Master/Slave Mode */
       
        TIM_Cmd(TIM2, ENABLE); /* TIM enable counter */
        TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE); /* Enable the CC2 Interrupt Request */

        TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
        TIM_ICInitStructure.TIM_ICFilter = 0x0;
        TIM_ICInit(TIM3, &TIM_ICInitStructure);
       
        TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);
        TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);        /* Select the TIM2 Input Trigger: TI2FP2 */
        TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); /* Select the slave Mode: Reset Mode */
        TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); /* Enable the Master/Slave Mode */
       
        TIM_Cmd(TIM3, ENABLE); /* TIM enable counter */
        TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE); /* Enable the CC2 Interrupt Request */       
       
}

下面是中断处理

void TIM2_IRQ(void)
{
        PlusCounter ++;
        TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); /* Clear TIM2 Capture compare interrupt pending bit */       
}

zf12862177 发表于 2011-8-12 19:52:02

原来你用的是中断的方式。
一般像这种脉冲捕捉都是直接用外设的硬件捕捉脉冲,用中断的方式不是很好,特别是脉冲频率很高的时候,CPU光进中断了

而且,不清楚你是怎么看到脉冲增加的,如果是用调试接口,那是显示不及的。因为100hz,说明每一个脉冲10ms,而调试接口数据传输速度通常没有那么快

NJ8888 发表于 2011-8-12 20:08:18

你用两个霍尔90度排就能完全消除可能的抖动

cemi 发表于 2011-8-12 21:23:08

我是间隔多长时间在屏幕上刷新一下PlusCounter的值,或者PlusCounter达到某个值的时候显示达到该值所需的时间,由Systick产生间隔50ms的定时来刷新时间值。
现在初步估计是程序的问题,因为在示波器读取到的频率是120Hz的时候,根据读取一段时间内脉冲数来算的话大概在200Hz左右,奇怪的是为什么计数会多了,究竟是什么问题呢?

cemi 发表于 2011-8-12 21:28:08

会不会是有一些干扰导致计算器多计数呢?

cemi 发表于 2011-8-12 21:45:19

问题初步找到了, 是干扰的问题, 那个电机我用另外的电源驱动的时候,相同的脉冲数所需的时间基本相同。

huayuliang 发表于 2011-8-12 22:39:52

汗,看来 pulse 写成 plus 的不光俺一个。。

cemi 发表于 2011-8-12 23:11:09

回复【9楼】huayuliang花生
汗,看来 pulse 写成 plus 的不光俺一个。。
-----------------------------------------------------------------------

哈哈, 真是喔, 以后改正。

berryluker2 发表于 2011-8-12 23:47:21

还有更简单的方法没?正在做这个测试电路。

manyman 发表于 2014-7-8 23:30:46

zf12862177 发表于 2011-8-12 19:52
原来你用的是中断的方式。
一般像这种脉冲捕捉都是直接用外设的硬件捕捉脉冲,用中断的方式不是很好,特别 ...

麻烦问一下用外设硬件捕捉脉冲具体怎么操作,我也是用的中断口,一秒钟要中断上百次,一点都不精确

zf12862177 发表于 2014-7-9 13:42:34

manyman 发表于 2014-7-8 23:30
麻烦问一下用外设硬件捕捉脉冲具体怎么操作,我也是用的中断口,一秒钟要中断上百次,一点都不精确 ...

用单片机的计数器啊,来一个外部脉冲就计数一次。假设你100ms读一次计数器值,本次读了10个,就是说在100ms,来了10个。这个叫M法测速

还有种T法,就是利用PWM的输入捕捉,计数器自由运行,来一个脉冲,就把当前计数器的值捕捉到,并放到内存,和上次的值做差,就知道这次脉冲用了多少时间。
页: [1]
查看完整版本: 请问为什么这个霍尔传感器安装方法用来测量直流电机的转速不可靠(有图)?