sbusr 发表于 2019-6-27 19:36:19

咨询使用FreeRTOS控制步进电机脉冲的实现方法

需求越来越复杂了,原来的电机驱动板,就是接收简单的指令,通过驱动器控制电机按照某个速度走到某个位置,加减速早就实现了。或按照指令速度一直转。
现在想要把单个电机的多个动作,或多个电机配合的动作,放到驱动板上来做(不要求轨迹,不要求插补)。
这个组合动作还不一定,随时会调整。
而且还要求很短的时间,所以就想到了要多人开发,使用FreeRTOS操作系统,把通信、流程、电机脉冲控制,都分开。

看了几个开发板厂家的讲解资料,讲得都很好。对FreeRTOS的中断处理基本清楚了。
电机脉冲计数、控制脉冲频率,这两个定时器的中断,肯定要放到不被RTOS屏蔽的高优先级中断里。但这样的中断里不能调RTOS的API。

这就需要流程控制的任务,能够获取到电机的动作状态,电机走完后停止,流程控制任务能够响应下一步动作。

暂时只想到了查询的方式,不知道还有没有更好的方法。
各位坛友如果有经验,请不吝赐教。谢谢。

flash3g 发表于 2019-6-27 21:12:40

用一个高优先级任务管理所有电机驱动的定时器

merphy 发表于 2019-6-27 22:10:15

一共几个电机

kinsno 发表于 2019-6-27 22:22:59

楼主方便分亨一下这几个开发板的资料吗?

taoworking 发表于 2019-6-27 22:36:26

楼主不用担心,FreeRTOS的所有任务调度的优先级都低于系统的硬件中断。你只要别再任务里面关断中断即可。

sbusr 发表于 2019-6-28 09:22:07

merphy 发表于 2019-6-27 22:10
一共几个电机

4到5个,脉冲控制

sbusr 发表于 2019-6-28 09:22:36

kinsno 发表于 2019-6-27 22:22
楼主方便分亨一下这几个开发板的资料吗?

正点原子,安富莱。论坛里都有下载链接的帖子啊。自行搜索吧

sbusr 发表于 2019-6-28 09:26:07

taoworking 发表于 2019-6-27 22:36
楼主不用担心,FreeRTOS的所有任务调度的优先级都低于系统的硬件中断。你只要别再任务里面关断中断即可。 ...

优先级这个明白。
原来是想用信号量、事件标志或任务通知,当电机的STEP脉冲定时器中断里计数到走完后,通知控制流程的任务的。
但是脉冲定时器中断为了保证时间,不能被BASEPRI屏蔽,所以中断优先级要调高。高于RTOS屏蔽的中断优先级。
而不被RTOS屏蔽的中断,又不能调API,所以。。。

rainyuoko 发表于 2019-6-28 11:00:21

sbusr 发表于 2019-6-28 09:26
优先级这个明白。
原来是想用信号量、事件标志或任务通知,当电机的STEP脉冲定时器中断里计数到走完后, ...

信号量和消息可以在中断里调用,对应后缀有_ISR的就是可以在中断里调用的函数

sbusr 发表于 2019-6-28 11:32:53

rainyuoko 发表于 2019-6-28 11:00
信号量和消息可以在中断里调用,对应后缀有_ISR的就是可以在中断里调用的函数 ...

竟然可以这样操作??我再读手册去了。

ddplys 发表于 2019-6-28 11:54:28

rainyuoko 发表于 2019-6-28 11:00
信号量和消息可以在中断里调用,对应后缀有_ISR的就是可以在中断里调用的函数 ...

不受操作系统控制的中断中,不得使用操作系统相关API函数。

ddplys 发表于 2019-6-28 11:56:54

sbusr 发表于 2019-6-28 09:26
优先级这个明白。
原来是想用信号量、事件标志或任务通知,当电机的STEP脉冲定时器中断里计数到走完后, ...

你不调用API函数,自己定义一个标志位变量不就行了。

rainyuoko 发表于 2019-6-28 12:09:20

ddplys 发表于 2019-6-28 11:54
不受操作系统控制的中断中,不得使用操作系统相关API函数。

所有中断都可以在操作系统里初始化和控制,在进行关键任务时候可以用_enter_critical_region禁止任务调度。使用操作系统的情况下一般也不会不使用操作系统控制中断吧

ddplys 发表于 2019-6-28 13:47:35

rainyuoko 发表于 2019-6-28 12:09
所有中断都可以在操作系统里初始化和控制,在进行关键任务时候可以用_enter_critical_region禁止任务调度 ...

在电机控制中,很多算法都是在中断中完成,对于实时性要求严格的算法,必须不受操作系统的中断控制。
基本上我所用过的FOC,BLDC和步进控制时,ADC和PWM波中断都必须不受操作系统控制。

sbusr 发表于 2019-6-28 14:14:33

ddplys 发表于 2019-6-28 11:56
你不调用API函数,自己定义一个标志位变量不就行了。

嗯,只能靠自己的全局变量了。

贝塔 发表于 2019-6-28 16:02:47

建议参考9楼方案~

su33691 发表于 2019-6-29 06:10:03

对于实时性要求严格的算法,就不用操作系统

sbusr 发表于 2019-6-30 21:53:06

su33691 发表于 2019-6-29 06:10
对于实时性要求严格的算法,就不用操作系统

算法不是事。是在电机驱动板上(只发脉冲的那种,不是直接控制mosfet),加各种应用级的功能,而且在研发过程中还不停的变,今天说这样地组动作效果好,明天就改成另外的了。
比如,这三四个电机,几个轴实现一组动作。顺序、距离,重复等等。
如果是明确的过程,那还好办了。

kaomantou 发表于 2019-9-16 02:00:10

sbusr 发表于 2019-6-30 21:53
算法不是事。是在电机驱动板上(只发脉冲的那种,不是直接控制mosfet),加各种应用级的功能,而且在研发 ...

需要抽象出几轴行为的描述方法,通过这个描述方法就可以做分工了,底层干底层,应用层干应用层,实际需求变化只是行为描述的组合,比如G代码
页: [1]
查看完整版本: 咨询使用FreeRTOS控制步进电机脉冲的实现方法