Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 设置步进电机STM32的初始位置_C++_Embedded_Stm32_Nucleo_Motordriver - Fatal编程技术网

C++ 设置步进电机STM32的初始位置

C++ 设置步进电机STM32的初始位置,c++,embedded,stm32,nucleo,motordriver,C++,Embedded,Stm32,Nucleo,Motordriver,我有一个核仁-IHM01A1电机驱动器,用于驱动装有主轴的电机。主轴长度有限,中间有一个物体。当电机旋转时,对象沿主轴移动 如何设置电机的初始位置,以便每次在MCU上运行程序时,当对象位于主轴中心时,初始位置都被设置。不幸的是,您描述的机械和电气设置实际上不允许以正确的方式进行自动初始校准 顾名思义,步进电机用于执行步骤。它们自身无法进行绝对定位。如果需要绝对定位,则必须在当前位置未知时(例如启动或丢失步数后)设置原点,或在系统中添加绝对编码器(这样您就始终知道系统状态) 自动家居检测的一种解决

我有一个核仁-IHM01A1电机驱动器,用于驱动装有主轴的电机。主轴长度有限,中间有一个物体。当电机旋转时,对象沿主轴移动


如何设置电机的初始位置,以便每次在MCU上运行程序时,当对象位于主轴中心时,初始位置都被设置。

不幸的是,您描述的机械和电气设置实际上不允许以正确的方式进行自动初始校准

顾名思义,步进电机用于执行步骤。它们自身无法进行绝对定位。如果需要绝对定位,则必须在当前位置未知时(例如启动或丢失步数后)设置原点,或在系统中添加绝对编码器(这样您就始终知道系统状态)

自动家居检测的一种解决方案通常用于许多机械系统,尤其是3D打印机和其他CNC机器。您可能需要将其中一个添加到设置中,并朝开关方向行驶,直到按下开关为止。然后你移动它到中心所需的确切步骤数,你就完成了

但是,如果您无法更改设置中的任何内容,则可以按主轴的长度沿一个方向移动底座。当底座到达末端时,电机应失速并松开剩余的踏板。然后将其移回中心(如前所述的恒定步数),然后居中。考虑到失速马达会过热马达和马达驱动器。这可能会缩短他们的预期寿命


还有其他解决方案,如伺服或绝对编码器,但据我了解,您的目标是,限位开关应该很好。

文字并不能很好地描述机械原理,但可能与此无关。步进电机无法确定绝对位置。您可能需要一个绝对位置轴编码器(在这种情况下,如果使用PID回路,您可能不需要步进电机),或者一些指示初始位置的方法,例如限位开关或光学检测的分度孔。无论哪种方式都是一个机电问题,而不是一个软件开发问题,所以在这里是离题的。也许或者使用伺服这个问题并不完全与软件相关,尽管我在回答中提出了一个(肮脏的)软件解决方案谢谢。我问这个问题是因为我希望有一个没有外部硬件的解决方案。但似乎没有,最简单和最常见的解决方案似乎是像你所说的限位开关。哦,我并没有说它根本不起作用,但它需要让电机失速,这对他们和司机来说都不是最健康的事情。据我所知,当电机失速时,通过电机的电流变得非常高,直到达到其电流极限。有没有一种方法可以让驱动板在电机失速时感觉到撞击,或者当电源达到低于其自身电流极限的电流极限时停止?如果可能的话,我可能没有使用限位开关,也不会损坏电机,因为我只允许它松开剩余的踏板。有像A3981这样的驱动器能够检测电机失速和丢失的踏板。但对于几乎所有的应用程序来说,这都是一种过度的杀伤力。