wander_zhang 发表于 2011-8-6 18:10

stm32 FOC pmsm 电机控制 霍尔位置检测中断的问题

使用stm的开发板电机控制总体觉得该方案还不错。不过最近发现一个问题,当电机速度变化比较大的时候, 转子位置检测偏差比较大,严重时电机正反转力矩交替产生,导致电机震荡。

分析其原因,发现霍尔在一个电气周期只产生3个中断. 个人认为如果产生6个中断的话,这个问题可能就不会出现了。

不知道也在使用该开发板的同仁有没有发现这个问题,欢迎留下宝贵意见。

fengxiangru 发表于 2011-8-23 17:01

我也发现这个问题了,只有3个中断

fengxiangru 发表于 2011-8-23 17:01

我也在想是不是改成6个中断

fengxiangru 发表于 2011-8-23 17:02

有空+QQ聊下, 七五八065八五0

lbz0123 发表于 2011-8-24 08:08

与中断的触发方式有关吧
你可以试试把他改成双边沿触发
这样一个周期应该就有六个中断了

lbz0123 发表于 2011-8-24 08:33

啊 忘了 霍尔应该在一个机械周期里面有六次电平跳变
但是机械周期不等于电器周期
所以 好像不行

wangyi39 发表于 2011-12-6 09:50

学习学习!!!

ltjish 发表于 2011-12-6 19:42

之前我也碰到过,另外还有启动问题,后来我把3次触发改成6次触发后发现会好很多!

amonghappy 发表于 2011-12-7 22:40

ST的TIM非常适合改成6次触发的,新的3.0的库已经更改。但不知道为什么以前的库会是3次触发的。
可以使用一个TIM内部的XOR做触发源,产生的TRGO可以用来复位定时器即可。具体看一下参考手册的TIM章节。

wander_zhang 发表于 2011-12-8 03:47

stm 的处理器hall 接口不直接支持六次中断, 必须在每次hall中断动态改变中断的的沿, 才能产生六次中断.

bencon 发表于 2011-12-8 14:09

学习啦!谢谢谢!

jay404823000 发表于 2012-4-6 15:43

我也发现这个问题了,原本ST的2.0电机库的霍尔传感器检测方式确实存在问题,那样配置只能进入一次中断,进过仔细看数据手册发现IC1的扑捉有一个TRC的选择,TRC的输入可以选择三个霍尔传感器的异或,就可以了!搞了一天。
源码:
TIM_TimeBaseInitTypeDef TIM_HALLTimeBaseInitStructure;
    TIM_ICInitTypeDef       TIM_HALLICInitStructure;
    NVIC_InitTypeDef      NVIC_InitHALLStructure;
    GPIO_InitTypeDef      GPIO_InitStructure;

    /* TIM2 clock source enable */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    /* Enable GPIOA, clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_StructInit(&GPIO_InitStructure);
    /* Configure PA.00,01 ,02 as Hall sensors input */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
      
    // Timer configuration in Clear on capture mode
    TIM_DeInit(TIM2);
   
    TIM_TimeBaseStructInit(&TIM_HALLTimeBaseInitStructure);
    // Set full 16-bit working range
    TIM_HALLTimeBaseInitStructure.TIM_Period = 0xFFFF;
    TIM_HALLTimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInit(TIM2,&TIM_HALLTimeBaseInitStructure);
   
    TIM_ICStructInit(&TIM_HALLICInitStructure);
    TIM_HALLICInitStructure.TIM_Channel = TIM_Channel_1;
    TIM_HALLICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    TIM_HALLICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC;//增加TRC的选择
    TIM_HALLICInitStructure.TIM_ICFilter = 0x0B;
   
    TIM_ICInit(TIM2,&TIM_HALLICInitStructure);
   
    // Force the HALL_TIMER prescaler with immediate access (no need of an update event)
    TIM_PrescalerConfig(TIM2, (u16) 800,                
                     TIM_PSCReloadMode_Immediate);
    TIM_InternalClockConfig(TIM2);
   
    //Enables the XOR of channel 1, channel2 and channel3
    TIM_SelectHallSensor(TIM2, ENABLE);
   
    TIM_SelectInputTrigger(TIM2, TIM_TS_TI1F_ED);       //输入触发方式改为异或信号
    TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);
   
    // Source of Update event is only counter overflow/underflow
    TIM_UpdateRequestConfig(TIM2, TIM_UpdateSource_Regular);
   
    /* Enable the HALL_TIMER IRQChannel*/
    NVIC_InitHALLStructure.NVIC_IRQChannel = TIM2_IRQn;

    NVIC_InitHALLStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitHALLStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitHALLStructure.NVIC_IRQChannelCmd = ENABLE;
   
    NVIC_Init(&NVIC_InitHALLStructure);

    // Clear the TIMx's pending flags
    TIM_ClearFlag(TIM2, TIM_FLAG_Update + TIM_FLAG_CC1 + TIM_FLAG_CC2 + \
                  TIM_FLAG_CC3 + TIM_FLAG_CC4 + TIM_FLAG_Trigger + TIM_FLAG_CC1OF + \
                  TIM_FLAG_CC2OF + TIM_FLAG_CC3OF + TIM_FLAG_CC4OF);

    // Selected input capture and Update (overflow) events generate interrupt
    TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);

    TIM_SetCounter(TIM2, 0);
    TIM_Cmd(TIM2, ENABLE);

kavin_zhou 发表于 2015-4-25 12:24

学习了
{:soso_e113:}

lijinzhi 发表于 2015-4-27 17:55

不是可以用捕异或

drf63329272 发表于 2015-5-13 16:05

jay404823000 发表于 2012-4-6 15:43
**** 作者被禁止或删除 内容自动屏蔽 ****

你好,根据你的代码修改,好像不行,速度反馈出错,其他的地方需要改吗?

drf63329272 发表于 2015-5-13 16:18

楼主,这个问题解决了么?

gp352365782 发表于 2015-5-20 16:05

6个触发会好点,不过有时候在变化率过快的情况下,也出现这种问题,而且随转速升高,这个变化率越来越小

这世界我来了 发表于 2015-9-27 21:50

ltjish 发表于 2011-12-6 19:42
之前我也碰到过,另外还有启动问题,后来我把3次触发改成6次触发后发现会好很多!

是的,我现在也在做hall的,有时候出现启动不起来现象,不知道您解决这个问题了没
页: [1]
查看完整版本: stm32 FOC pmsm 电机控制 霍尔位置检测中断的问题