文号
t52351
阅读
6834
回复
13
收藏
4
[首发][原创]边干边写之——打造最小的步进控制和驱动电路(持续更新中)
2012/11/19
IP:山东
花了小半个月,做了个马达驱动电路,和一个二轴运动控制电路。。。

马达驱动可以驱动两个直流电机正反转和无级调速(相当于一个双电调)或一个两相四线步进电机,

步进电机只支持单4拍,双4拍和8拍方式,电流只有1A。。。

100_1020.jpg

运动控制可以完成直线和圆弧插补,
速度挺快的,
可惜为了适应不给力的驱动,
只好把速度降下来了。。。
实测用16细分驱动器能跑到单轴400RPM。
100_1031.jpg

半夜拍的视频,光线不好,凑和看吧。。。

点击此处查看视频
还差个步进驱动模块没焊,
只能看到X轴的情况。。。
循环跑这样的路线:

先跑一段X,再跑一段Y(X不转),再跑一段45度(X半速),然后跑了个整圆(X变速正反转)
+10
科创币
hx
2012/11/23
高高高高高质量发帖
+10
科创币
jrcsh
2012/11/24
神贴酝酿中.广告位招租
kknd作者
14年1个月前IP:未同步
471827
1楼
又焊了个驱动器,拍了段两轴联动的视频。。。

插补过程可以看出来了。。。

点击此处查看视频
引用
评论
kknd作者
14年1个月前IP:未同步
471831
2楼
加减速控制成了问题。。。
51就是51,
空间和速度都成问题。。。

继续折腾。。。。
引用
评论
kknd作者
14年1个月前IP:未同步
472689
3楼
总感觉步进电机运行异常,
估计是算法出问题,
可惜51上调试太不直观,
VB6写个程序仿真一下。。。
还真是出了问题。。。

111.jpg
引用
评论
kknd作者
14年1个月前IP:未同步
472690
4楼
可惜这样看不出问题出在哪。。。
做个数据域测试。。。
112.jpg

看出来了,象限判断错误。。。
改改。。。
113.jpg

改错地方了,再改。。。
   114.jpg

这个差不多了,还有错误,继续改。。。
   115.jpg

这次对了。。。

试试效果。。。
   118.jpg
引用
评论
14年1个月前IP:未同步
472693
5楼
高高高高高质量发帖
引用
评论
kknd作者
14年1个月前IP:未同步
472836
6楼
边模拟边开发。。。
搞定了第一个功能。。。
指哪打哪。。。
鼠标点到哪,步进电机走到哪。。。
可惜还不是G代码。。。
继续。。。

119.jpg
引用
评论
kknd作者
14年1个月前IP:未同步
472945
7楼
再试试直线和曲线复合的效果。。。

120.jpg
引用
评论
kknd作者
14年1个月前IP:未同步
472946
8楼
折腾梯形加速度曲线。。。
网上找了个Arduino源码
解析源码中的一个加速度曲线表。。。
看情况是个16位定时器的线性装定值表。。。
用65536除一下,然后画曲线看看什么样子。。。

121.jpg

不出所料,果然是线性拟合。。。
1K字节一个表太离谱了,
现在研究一下用什么算法动态生成这个数据更高效。。。
引用
评论
kknd作者
14年1个月前IP:未同步
472954
9楼
采用最简单的方法进行了优化。。。
均匀抽取原表的1/10个元素,隔10个留一个,
留下25个数据,
表的规模减小了10倍,
每个表100个字节,2个表200字节,可以接受了。。。
从效果上看,比正规NC系统采用的7点甚至5点加速度控制已经精细多了。。。 122.jpg
引用
评论
14年1个月前IP:未同步
472960
10楼
神贴酝酿中.广告位招租
引用
评论
14年1个月前IP:未同步
473097
11楼
我对lz做的产品很感兴趣,这里贡献一段动检测是否能达到指定速度的检测代码,稍微改改就能态生成加速曲线:
未命名.jpg
Public Function ComputePulse(ByVal Velo As Double, ByVal a As Double, ByVal d As Double, ByRef maxv As Double, ByRef PNum As Long, ByRef t As Double) As Boolean
Dim c0 As Long
Dim c1 As Long
Dim flag As Boolean

PNum = 1
c0 = 0.676 * Frequency * Sqr(2 * d / a) / 2
t = c0 * 2
flag = True

Do
c1 = c0 - c0 / (2 * PNum)
maxv = d / c1 * Frequency / 2
t = t + c1 * 2
PNum = PNum + 1

If c0 <> c1 Then
c0 = c1
Else
flag = False
End If
Loop Until maxv > Velo Or Not flag

PNum = PNum - 1
t = t / Frequency

ComputePulse = flag
End Function

其中Frequency是单片机运行频率。
c0 = 0.676 * Frequency * Sqr(2 * d / a) / 2是初值,除以2的原因是因为通常的步进电机驱动器都是一个脉冲前进一步,不是一个上升沿或者一个下降沿前进一步(除非用STK672-080的16细分模式)。
c1 = c0 - c0 / (2 * PNum)通过之前计算的结果得出下一次发出脉冲的间隔,更精确一点c1 = c0  - c0 * 2 / (4 * PNum - 1))
引用
评论
kknd作者
14年1个月前IP:未同步
473229
12楼
回 11楼(kissjack) 的帖子
太好了,感谢兄弟分享!!
正在为这个发愁呢。。。
加速度控制需要前瞻算法,而且一下要预判几百到上千步,
STC有硬件乘除法,4周期,可惜是8位的。。。
正在努力优化预判功能。。。
在低速区预读足够的语句进行速度标定,
不然在转角和微小线段群的处理上将是个大问题。。。
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的