你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
ramtron 提问时间:2019-8-14 18:03 /
想用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 */
}

收藏 评论16 发布时间:2019-8-14 18:03

举报

16个回答
ramtron 回答时间:2019-8-20 09:54:59
这一道天堑 发表于 2019-8-19 13:02
改一下STOPPERMANENCY_MS 宏的值就可以了,唉,你这还好,我这要求来回摆动,1s起码3-4次。目前感觉ST的搞 ...

听了你的建议,我将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();开始到电机真正动起来的时间。
zhangyh89 回答时间:2019-8-19 11:29:42
ramtron 发表于 2019-8-19 09:59
你好,转速我要求不高的,有3圈每秒都够了。
现在问题是这启动的时间太长了,至少500ms,导致反向转动时等 ...

低速的话用磁编没问题,我猜想st的库应该是想做的比较安全点,防止瞬间启动烧毁吧,他那里面用到编码器的话还需要启动前定位,它里面的状态切换太麻烦了,我就是移植st库里那几个关键函数,剩下的自己做状态切换,可以做到瞬间启动正反转,但是瞬间反转带来的问题是会有很高的反电动势,不过你这低速的话不会有这问题
ramtron 回答时间:2019-8-19 09:59:13
darkghool-16056 发表于 2019-8-16 17:21
数字接口的磁编码器做反馈一般转速不能太高,转速高了以后读取电角度有延迟电机会振动到怀疑人生 ...

你好,转速我要求不高的,有3圈每秒都够了。
现在问题是这启动的时间太长了,至少500ms,导致反向转动时等待时间太长了!
如果这时间在30ms左右那都可以了,而且还没搞懂这500ms系统在做些什么,我发现调用MC_StartMotor1();函数后至少需要500ms以上电机才真正动起来!
mmuuss586 回答时间:2019-8-15 09:17:16
可以先停止,再切换啊
mmuuss586 回答时间:2019-8-15 09:19:05

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

正反转快速切换为什么不太支持呢?切换过程中那么长的时间都在做些什么呢?因代码有些复杂,目前还没理解到这一部分。
接下来我是准备加编码器TLE5012B的,我应用是快速跟踪定位,不知用这套件上的方案加上自己修改代码能否实现?
ramtron 回答时间:2019-8-16 10:10:22
没有人了解了吗?
zhangyh89 回答时间:2019-8-16 17:21:51
ramtron 发表于 2019-8-15 09:27
正反转快速切换为什么不太支持呢?切换过程中那么长的时间都在做些什么呢?因代码有些复杂,目前还没理解 ...

数字接口的磁编码器做反馈一般转速不能太高,转速高了以后读取电角度有延迟电机会振动到怀疑人生
这一道天堑 回答时间:2019-8-19 13:02:54
改一下STOPPERMANENCY_MS 宏的值就可以了,唉,你这还好,我这要求来回摆动,1s起码3-4次。目前感觉ST的搞不定,升速即便超调很多也感觉太慢了,我觉得我可能需要换TI的看看了。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

子曰好人 回答时间:2019-8-19 14:17:11
ST这套程序就是一个demo,你们对它要求太高了,拿来入门可以好好研究一下,想要达到高性能,还得自己写代码
ramtron 回答时间:2019-8-19 15:28:42
子曰好人 发表于 2019-8-19 14:17
ST这套程序就是一个demo,你们对它要求太高了,拿来入门可以好好研究一下,想要达到高性能,还得自己写代码 ...

我拆了一两个云台电机里面的板子,基本上都是STM32F030+WSP4884+MOS的方案,方式用的是6步PWM,测试用的时候看启动也挺快的了,启动时间远小于500ms,转速也是不高的,最高好像是720度/秒。
我也是往自己改代码的方向去的,根本没想到直接就用的
ramtron 回答时间:2019-8-19 15:32:42
darkghool-16056 发表于 2019-8-19 11:29
低速的话用磁编没问题,我猜想st的库应该是想做的比较安全点,防止瞬间启动烧毁吧,他那里面用到编码器的 ...

听到你这么说的话我就放心多了,起码知道修改ST方案是可以实现的了,你移植的是FOC那个几关键函数吗?那几个函数代码在原理性应该是没问题的
子曰好人 回答时间:2019-8-19 15:35:58
ramtron 发表于 2019-8-19 15:28
我拆了一两个云台电机里面的板子,基本上都是STM32F030+WSP4884+MOS的方案,方式用的是6步PWM,测试用的 ...

恩,硬件方案是可行的,大同小异,分析一下workbench生成代码的状态机,应该还是能找到启动时间较长的原因
ramtron 回答时间:2019-8-19 15:45:22
这一道天堑 发表于 2019-8-19 13:02
改一下STOPPERMANENCY_MS 宏的值就可以了,唉,你这还好,我这要求来回摆动,1s起码3-4次。目前感觉ST的搞 ...

谢谢,我试下修改这个值看看,一直用的STM32的单片机,TI的MCU我都没用过
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版