我将至少使用一个可编程实时单元(PRU)向步进电机驱动器发送脉冲,但是在开始之前,我正在尝试布局程序的结构。

我是使用此库PRU Linux API
将汇编代码加载到PRU指令存储器中,但是除了该wiki和源代码之外,似乎没有太多文档:
github-pru-packageh

我的c程序将使用算法计算太阳的位置并执行汇编/将脉冲计数写入PRU数据存储器,以便它们可以根据我的需要打开/关闭gpio频率和转动步进器所需的脉冲数(适当步数)。我什至不确定这是否可以接受,但是我还很陌生,这似乎是完成任务的一种简单方法。

关于库函数的问题是:


使用prussdrv_map_prumemprussdrv_pru_write_memory赋予PRU访问脉冲计数之间是否存在明显的性能差异?
在完成以下任务之后,最好停止PRU组装程序吗?每个脉冲计数然后用新值重新执行它,或者保持PRU程序运行并轮询要写入的新脉冲计数?

我计划每10秒左右发送一次脉冲计数。

也欢迎提出任何关于重新访问整个结构和逻辑的建议。

评论

切线:我之前已经嵌入了NREL的太阳位置算法(SPA),并且效果很好。 nrel.gov/midc/spa

#1 楼

我喜欢您在步进电机驱动项目中使用BBB的选择。 BBB是目前可用的最佳开源硬件,可以将您的步进电机速度提高到200Mhz的精度,这比我们从Arduino或12MHz微控制器获得的速度快15倍。我在基于PRU的项目中使用了PyPruss python库,在该项目中,我用ARM汇编语言编写了PRU程序,并使用PyPruss python库生成了二进制.bin文件。这是最适合您的项目使用Pypruss在BBB上加速步进电机的文章。

可以使用C ++ PRU库使用相同的东西,这是我为我的项目编写的一些示例汇编代码:


用于发送PWM值的C ++代码到共享内存(由处理器和PRU共享的内存)。
汇编代码从共享内存中读取值,并使用PRU生成实时PWM值

随意浏览存储库。

#2 楼

我不熟悉PRU或PRU Linux API,但是,我可以向您提供一些一般性建议。




使用prussdrv_map_prumem或prussdrv_pru_write_memory与允许PRU访问脉冲计数?




最有可能。如果我理解正确,那么prussdrv_map_prumem可以直接访问PRU内存,而prussdrv_pru_write_memory不仅可以通过函数调用来访问PRU内存,还必须至少对函数参数进行解码才能至少知道要写入的内存。

要了解性能差异,可以将写入操作置于无限循环中,然后每1000次切换GPIO引脚一次。用示波器测量触发时间的差异,以查看花费了1000次写入的时间(请注意,这还包括循环常数,计数器增量,if和gpio写入的常数)。这应该给您一些度量方法,以确定哪种方法更快,提高多少。

但是您应该注意两点。首先,如果您每10秒控制一次,那么性能对您来说就不是问题。其次,您应该了解写入PRU存储器的任何特殊性。可能(再次,我不了解PRU,我通常是在说),为了正确地执行写操作,需要按照一定顺序执行某些操作。如果调用该库提供的write函数,则可以确保它们照顾了这些特性。如果您打算进行直接内存访问,请阅读数据表以了解是否有任何特殊性以及它们的特征。您还可以查看prussdrv_pru_write_memory函数的源代码(如果有)。



在完成每个脉冲计数的任务之后,最好停止PRU汇编程序,然后用新值重新执行它,还是保持PRU程序运行并轮询要写入的新脉冲计数?




如果您打算每10秒执行一次有用的操作,那么轮询而不是暂停将非常耗能。每当您可以停止并确保有人将您唤醒时,请务必这样做。