请选择 进入手机版 | 继续访问电脑版
搜索
查看: 3838|回复: 16

[求助] ST MC BLDC电机无法快速切换正反转

[复制链接]

该用户从未签到

2

主题

12

帖子

0

蝴蝶豆

初级会员

最后登录
2022-12-14
发表于 2019-8-14 18:03:41 | 显示全部楼层 |阅读模式
想用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 */
}

回复

使用道具 举报

该用户从未签到

62

主题

3651

帖子

100

蝴蝶豆

论坛元老

最后登录
2021-4-30
发表于 2019-8-15 09:17:16 | 显示全部楼层
可以先停止,再切换啊
回复 支持 反对

使用道具 举报

该用户从未签到

62

主题

3651

帖子

100

蝴蝶豆

论坛元老

最后登录
2021-4-30
发表于 2019-8-15 09:19:05 | 显示全部楼层

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

使用道具 举报

该用户从未签到

2

主题

12

帖子

0

蝴蝶豆

初级会员

最后登录
2022-12-14
 楼主| 发表于 2019-8-15 09:27:17 | 显示全部楼层
mmuuss586 发表于 2019-8-15 09:19
正反转快速切换本身就不太支持,加编码器,位置控制会好些

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

使用道具 举报

该用户从未签到

2

主题

12

帖子

0

蝴蝶豆

初级会员

最后登录
2022-12-14
 楼主| 发表于 2019-8-16 10:10:22 | 显示全部楼层
没有人了解了吗?
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

20

帖子

0

蝴蝶豆

中级会员

最后登录
2021-1-11
发表于 2019-8-16 17:21:51 | 显示全部楼层
ramtron 发表于 2019-8-15 09:27
正反转快速切换为什么不太支持呢?切换过程中那么长的时间都在做些什么呢?因代码有些复杂,目前还没理解 ...

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

使用道具 举报

该用户从未签到

2

主题

12

帖子

0

蝴蝶豆

初级会员

最后登录
2022-12-14
 楼主| 发表于 2019-8-19 09:59:13 | 显示全部楼层
darkghool-16056 发表于 2019-8-16 17:21
数字接口的磁编码器做反馈一般转速不能太高,转速高了以后读取电角度有延迟电机会振动到怀疑人生 ...

你好,转速我要求不高的,有3圈每秒都够了。
现在问题是这启动的时间太长了,至少500ms,导致反向转动时等待时间太长了!
如果这时间在30ms左右那都可以了,而且还没搞懂这500ms系统在做些什么,我发现调用MC_StartMotor1();函数后至少需要500ms以上电机才真正动起来!
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

20

帖子

0

蝴蝶豆

中级会员

最后登录
2021-1-11
发表于 2019-8-19 11:29:42 | 显示全部楼层
ramtron 发表于 2019-8-19 09:59
你好,转速我要求不高的,有3圈每秒都够了。
现在问题是这启动的时间太长了,至少500ms,导致反向转动时等 ...

低速的话用磁编没问题,我猜想st的库应该是想做的比较安全点,防止瞬间启动烧毁吧,他那里面用到编码器的话还需要启动前定位,它里面的状态切换太麻烦了,我就是移植st库里那几个关键函数,剩下的自己做状态切换,可以做到瞬间启动正反转,但是瞬间反转带来的问题是会有很高的反电动势,不过你这低速的话不会有这问题
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1

帖子

2

蝴蝶豆

新手上路

最后登录
2019-8-20
发表于 2019-8-19 13:02:54 | 显示全部楼层
改一下STOPPERMANENCY_MS 宏的值就可以了,唉,你这还好,我这要求来回摆动,1s起码3-4次。目前感觉ST的搞不定,升速即便超调很多也感觉太慢了,我觉得我可能需要换TI的看看了。

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

20

主题

1628

帖子

5

蝴蝶豆

论坛元老

最后登录
2022-6-7
发表于 2019-8-19 14:17:11 | 显示全部楼层
ST这套程序就是一个demo,你们对它要求太高了,拿来入门可以好好研究一下,想要达到高性能,还得自己写代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-3-29 16:48 , Processed in 1.210633 second(s), 43 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表