Arduino有没有好用的驱动步进电机(方向+脉冲)的库?
如题,或者提供个加减速度算法也好。Arduino用的是Stm32的小板子,TB价格在几块到十几块的那个板子,坛里有介绍,用起来非常爽。
步进电机是方向+脉冲的驱动器驱动的。 marlin???? 另外,Arduino不是有step motor库么 qiqirachel 发表于 2019-2-11 18:25
另外,Arduino不是有step motor库么
不清楚啊,我玩Aduino是大白。
是用 IO 驱动的 方向+脉冲 形式的吗? 本帖最后由 kv2004 于 2019-2-11 18:48 编辑
qiqirachel 发表于 2019-2-11 18:25
marlin????
不知道marlin是啥
~~~~~
刚搜了一下,不是marlin
是
STM32F103C8T6最小系统板 单片机 核心板 STM32 ARM 找到两个库:
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-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:54 编辑
kv2004 发表于 2019-2-13 14:02
找到两个库:
DMTimer 1.0.0
DMStepper 1.01
用电子表格算了一下,速度是线性增加减少的:
libreOffice的电子表格:
页:
[1]