kv2004 发表于 2019-2-11 18:25:13

Arduino有没有好用的驱动步进电机(方向+脉冲)的库?

如题,或者提供个加减速度算法也好。
Arduino用的是Stm32的小板子,TB价格在几块到十几块的那个板子,坛里有介绍,用起来非常爽。
步进电机是方向+脉冲的驱动器驱动的。

qiqirachel 发表于 2019-2-11 18:25:42

marlin????

qiqirachel 发表于 2019-2-11 18:25:59

另外,Arduino不是有step motor库么

kv2004 发表于 2019-2-11 18:30:37

qiqirachel 发表于 2019-2-11 18:25
另外,Arduino不是有step motor库么

不清楚啊,我玩Aduino是大白。
是用 IO 驱动的 方向+脉冲 形式的吗?

kv2004 发表于 2019-2-11 18:34:35

本帖最后由 kv2004 于 2019-2-11 18:48 编辑

qiqirachel 发表于 2019-2-11 18:25
marlin????

不知道marlin是啥
~~~~~

刚搜了一下,不是marlin

STM32F103C8T6最小系统板 单片机 核心板 STM32 ARM

kv2004 发表于 2019-2-13 14:02:12

找到两个库:
DMTimer 1.0.0
DMStepper 1.01
看人家写的相当规矩。
编译时候提醒AVR和ARM库兼容问题。我看了一遍程序,似乎没问题,都用的最基本的库函数。

他的加速度是固定的数值,和 坛子里的“直线”“正弦”加速度方式能走出“S“型速度曲线的算法,不太一样。
他的可能在开始时能走出”J"型。

对加减速度的调整的关键代码就这几句,没看明白算法:
加速:      speed = sqrt(currentStep * 2 * acceleration);
减速:      speed = sqrt((stepsToGo - currentStep) * 2 * acceleration);

简单解释一下,程序每发出一个脉冲,都会运行一次上面的程序,计算下一次脉冲,将要等到什么时候发出来。
currentStep 是 从运动开始计算,当前的脉冲序号。
stepsToGo是 总共要运动的脉冲数量,全程脉冲的数量。
acceleration 是 一个固定值,加速度。
计算出来的速度,最终变成等待的间隔:
   periodUs = 1000000 / speedHz
调用micros()或者delayMicros(),到时驱动一下脉冲,就完成了对步进电机控制器的脉冲输出。

kv2004 发表于 2019-2-14 22:49:14

kv2004 发表于 2019-2-13 14:02
找到两个库:
DMTimer 1.0.0
DMStepper 1.01


DMTimer库里的isTimeReached函数似乎有问题:
bool DMTimer::isTimeReached(unsigned long currentTime, unsigned long interval){
if(currentTime > _lastTime + interval)
{
    _lastTime = currentTime;
    return true;
}
return false;
}
这个函数的目的是,过去记录的时间 加上 间隔,和 当前的时间相比,决定是否 时间到。
但如果“过去记录的时间 加上 间隔”,超过 U32 最大值,将会变成很小的数。

我改成:
bool DMTimer::isTimeReached(unsigned long currentTime, unsigned long interval){
if(currentTime - _lastTime > interval)
{
    _lastTime = currentTime;
    return true;
}
return false;
}

前提是interval参数不超过 U32的一半。
----

我改过的库函数,会不会在下一次更新时被冲掉?

kv2004 发表于 2019-2-15 10:53:19

本帖最后由 kv2004 于 2019-2-15 10:54 编辑

kv2004 发表于 2019-2-13 14:02
找到两个库:
DMTimer 1.0.0
DMStepper 1.01

用电子表格算了一下,速度是线性增加减少的:
libreOffice的电子表格:

页: [1]
查看完整版本: Arduino有没有好用的驱动步进电机(方向+脉冲)的库?