请选择 进入手机版 | 继续访问电脑版

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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版