ramtron 发表于 2019-8-14 18:03:41

ST MC BLDC电机无法快速切换正反转

想用ST MC电机库进行BLDC开发,实际要求电机可以快速切换正反转,但实际实验过程中却无法实现,两方向切换过程中必须要延时一些时间,否则反向无法正常启动。感觉就像是要“缓一下”才行,但这缓
的时间也太长了,我测试时则需500ms或以上(如下程序红色语句所示),想请教下这是什么原因。
开发套件为NUCLEO-IHM01,电机库版本为5.3,测试代码如下:

int main(void)
{
/* USER CODE BEGIN 1 */
       int16_t Motor1Speed,Motor1SpeedAverage;
       int16_t Motor1Dir;
       uint16_t Motor1State,Motor1Faults;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
MX_DAC_Init();
MX_TIM1_Init();
MX_USART2_UART_Init();
MX_MotorControl_Init();
/* Initialize interrupts */
MX_NVIC_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
                       MC_ProgramSpeedRampMotor1(100/6,600);
                       MC_StartMotor1();
                       HAL_Delay(2000);
                       Motor1Speed = MC_GetMecSpeedReferenceMotor1();
                       Motor1SpeedAverage = MC_GetMecSpeedAverageMotor1();
                       Motor1Dir = MC_GetImposedDirectionMotor1();
                       Motor1State = MC_GetSTMStateMotor1();
                       Motor1Faults = MC_GetOccurredFaultsMotor1();
                       if((Motor1State==10)||(Motor1State==11))
                        {
                                MC_AcknowledgeFaultMotor1();
                        }
                        MC_StopMotor1();
                        HAL_Delay(500);
                               
                         MC_ProgramSpeedRampMotor1(-100/6,600);
                       MC_StartMotor1();
                       HAL_Delay(2000);
                       Motor1Speed = MC_GetMecSpeedReferenceMotor1();
                       Motor1SpeedAverage = MC_GetMecSpeedAverageMotor1();
                       Motor1Dir = MC_GetImposedDirectionMotor1();
                       Motor1State = MC_GetSTMStateMotor1();
                       Motor1Faults = MC_GetOccurredFaultsMotor1();
                       if((Motor1State==10)||(Motor1State==11))
                        {
                               MC_AcknowledgeFaultMotor1();
                        }
                        MC_StopMotor1();
                        HAL_Delay(500);                       
}
/* USER CODE END 3 */
}

mmuuss586 发表于 2019-8-15 09:17:16

可以先停止,再切换啊

mmuuss586 发表于 2019-8-15 09:19:05

:D
正反转快速切换本身就不太支持,加编码器,位置控制会好些

ramtron 发表于 2019-8-15 09:27:17

mmuuss586 发表于 2019-8-15 09:19
正反转快速切换本身就不太支持,加编码器,位置控制会好些

正反转快速切换为什么不太支持呢?切换过程中那么长的时间都在做些什么呢?因代码有些复杂,目前还没理解到这一部分。
接下来我是准备加编码器TLE5012B的,我应用是快速跟踪定位,不知用这套件上的方案加上自己修改代码能否实现?

ramtron 发表于 2019-8-16 10:10:22

没有人了解了吗?

darkghool-16056 发表于 2019-8-16 17:21:51

ramtron 发表于 2019-8-15 09:27
正反转快速切换为什么不太支持呢?切换过程中那么长的时间都在做些什么呢?因代码有些复杂,目前还没理解 ...

数字接口的磁编码器做反馈一般转速不能太高,转速高了以后读取电角度有延迟电机会振动到怀疑人生

ramtron 发表于 2019-8-19 09:59:13

darkghool-16056 发表于 2019-8-16 17:21
数字接口的磁编码器做反馈一般转速不能太高,转速高了以后读取电角度有延迟电机会振动到怀疑人生 ...
你好,转速我要求不高的,有3圈每秒都够了。
现在问题是这启动的时间太长了,至少500ms,导致反向转动时等待时间太长了!
如果这时间在30ms左右那都可以了,而且还没搞懂这500ms系统在做些什么,我发现调用MC_StartMotor1();函数后至少需要500ms以上电机才真正动起来!

darkghool-16056 发表于 2019-8-19 11:29:42

ramtron 发表于 2019-8-19 09:59
你好,转速我要求不高的,有3圈每秒都够了。
现在问题是这启动的时间太长了,至少500ms,导致反向转动时等 ...
低速的话用磁编没问题,我猜想st的库应该是想做的比较安全点,防止瞬间启动烧毁吧,他那里面用到编码器的话还需要启动前定位,它里面的状态切换太麻烦了,我就是移植st库里那几个关键函数,剩下的自己做状态切换,可以做到瞬间启动正反转,但是瞬间反转带来的问题是会有很高的反电动势,不过你这低速的话不会有这问题

这一道天堑 发表于 2019-8-19 13:02:54

改一下STOPPERMANENCY_MS 宏的值就可以了,唉,你这还好,我这要求来回摆动,1s起码3-4次。目前感觉ST的搞不定,升速即便超调很多也感觉太慢了,我觉得我可能需要换TI的看看了。

子曰好人 发表于 2019-8-19 14:17:11

ST这套程序就是一个demo,你们对它要求太高了,拿来入门可以好好研究一下,想要达到高性能,还得自己写代码:)
页: [1] 2
查看完整版本: ST MC BLDC电机无法快速切换正反转