stm32 FOC pmsm 电机控制 霍尔位置检测中断的问题
使用stm的开发板电机控制总体觉得该方案还不错。不过最近发现一个问题,当电机速度变化比较大的时候, 转子位置检测偏差比较大,严重时电机正反转力矩交替产生,导致电机震荡。分析其原因,发现霍尔在一个电气周期只产生3个中断. 个人认为如果产生6个中断的话,这个问题可能就不会出现了。
不知道也在使用该开发板的同仁有没有发现这个问题,欢迎留下宝贵意见。 我也发现这个问题了,只有3个中断 我也在想是不是改成6个中断 有空+QQ聊下, 七五八065八五0 与中断的触发方式有关吧
你可以试试把他改成双边沿触发
这样一个周期应该就有六个中断了 啊 忘了 霍尔应该在一个机械周期里面有六次电平跳变
但是机械周期不等于电器周期
所以 好像不行 学习学习!!! 之前我也碰到过,另外还有启动问题,后来我把3次触发改成6次触发后发现会好很多! ST的TIM非常适合改成6次触发的,新的3.0的库已经更改。但不知道为什么以前的库会是3次触发的。
可以使用一个TIM内部的XOR做触发源,产生的TRGO可以用来复位定时器即可。具体看一下参考手册的TIM章节。 stm 的处理器hall 接口不直接支持六次中断, 必须在每次hall中断动态改变中断的的沿, 才能产生六次中断. 学习啦!谢谢谢! 我也发现这个问题了,原本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); 学习了
{:soso_e113:} 不是可以用捕异或 jay404823000 发表于 2012-4-6 15:43
**** 作者被禁止或删除 内容自动屏蔽 ****
你好,根据你的代码修改,好像不行,速度反馈出错,其他的地方需要改吗? 楼主,这个问题解决了么? 6个触发会好点,不过有时候在变化率过快的情况下,也出现这种问题,而且随转速升高,这个变化率越来越小 ltjish 发表于 2011-12-6 19:42
之前我也碰到过,另外还有启动问题,后来我把3次触发改成6次触发后发现会好很多!
是的,我现在也在做hall的,有时候出现启动不起来现象,不知道您解决这个问题了没
页:
[1]