
想用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 */ } |
听了你的建议,我将STOPPERMANENCY_MS 宏的值由400改在了2,然后再将代码中红色字体的两句延时由“HAL_Delay(500);”改成“HAL_Delay(10);”,发现电机也是可以正常反转了,谢谢!
另外关于调用了MC_StartMotor1();语句后,电机延时约1秒才真正动起来的问题,我通过修改drive_parameter.h文件中宏PHASE1_DURATION 1000(改成200)和PHASE2_DURATION 1536(改成500)的值,大减小了由MC_StartMotor1();开始到电机真正动起来的时间。
低速的话用磁编没问题,我猜想st的库应该是想做的比较安全点,防止瞬间启动烧毁吧,他那里面用到编码器的话还需要启动前定位,它里面的状态切换太麻烦了,我就是移植st库里那几个关键函数,剩下的自己做状态切换,可以做到瞬间启动正反转,但是瞬间反转带来的问题是会有很高的反电动势,不过你这低速的话不会有这问题
你好,转速我要求不高的,有3圈每秒都够了。
现在问题是这启动的时间太长了,至少500ms,导致反向转动时等待时间太长了!
如果这时间在30ms左右那都可以了,而且还没搞懂这500ms系统在做些什么,我发现调用MC_StartMotor1();函数后至少需要500ms以上电机才真正动起来!
正反转快速切换本身就不太支持,加编码器,位置控制会好些
正反转快速切换为什么不太支持呢?切换过程中那么长的时间都在做些什么呢?因代码有些复杂,目前还没理解到这一部分。
接下来我是准备加编码器TLE5012B的,我应用是快速跟踪定位,不知用这套件上的方案加上自己修改代码能否实现?
数字接口的磁编码器做反馈一般转速不能太高,转速高了以后读取电角度有延迟电机会振动到怀疑人生
评分
查看全部评分
我拆了一两个云台电机里面的板子,基本上都是STM32F030+WSP4884+MOS的方案,方式用的是6步PWM,测试用的时候看启动也挺快的了,启动时间远小于500ms,转速也是不高的,最高好像是720度/秒。
我也是往自己改代码的方向去的,根本没想到直接就用的
听到你这么说的话我就放心多了,起码知道修改ST方案是可以实现的了,你移植的是FOC那个几关键函数吗?那几个函数代码在原理性应该是没问题的
恩,硬件方案是可行的,大同小异,分析一下workbench生成代码的状态机,应该还是能找到启动时间较长的原因
谢谢,我试下修改这个值看看,一直用的STM32的单片机,TI的MCU我都没用过