椒盐时代 发表于 2016-4-8 13:03:14

我想用ST控制3或4个电机运动,有细分驱动器了,对定位有...

我想用ST控制3或4个电机运动,有细分驱动器了,对定位有一定要求,并可以通过触摸屏控制电机运转,我思路是这样:已知给驱动器发送2000个脉冲电机轴会转一圈,那换算成行程就可以知道一个脉冲走多少距离,然后通过发送脉冲数控制行程,从而实现准确定位,发送的脉冲数需要可控可调。
有说PWM不好精确控制步数,建议直接用脉冲,还有一种DMA方式。
直接用脉冲可以吗?高电平-延时-低电平 这就是一个脉冲吧?那这个延时时间是不很关键?需要非常精准?
如果DMA方式,那驱动器的脉冲端口是接ST一个定时器的TIM3_CH1 /CH2 CH3三个通道还是接三个定时器TIM1TIM2TIM3?

RAMILE 发表于 2016-4-8 13:03:15

本帖最后由 RAMILE 于 2016-4-9 08:53 编辑

分享一个技巧,
定时器设定为连续自由计数,从0000~FFFF,
定时器比较通道CH1的CCR设定为,“相等输出反转,且相等触发DMA加载CCR”,
对应的DMA通道指向一个64字的数组,并且设置循环发送,设置半数发送完成中断,和全完成中断
DMA指向的64字数组是这样的,{10,20,30,40,50,60,70,80,.......630},这样的话输出的是宽度为10个timer-tick的方波,如果设成倒数等差的话,就是梯形加减速脉冲了
这个64字的数组在启动发脉冲时候计算好,在DMA半数完成中断时候计算前面一半32个个数值,在DMA全完成中断时候计算后面一半数值

这种动态脚本方式是我想到的生成变周期序列的最佳方式,每若干脉冲中断一次在中断中有足够时间(需要验证)计算下一步的脚本。
另外,这种方式输出脉冲通道的数量是由DMA通道数决定的,一般来说只使用一个定时器就可以输出3路脉冲,每路脉冲和每个脉冲都是由动态脚本决定,好不好控制脉冲步数就看你怎么演算脚本了


DMA脚本方式可能面临的问题有,脚本生产速度跟不上,两个DMA同时发生的请求面临的优先次序问题,不过脉冲频率不高的环境下,这些都不是事,一个103C8完全胜任
实际上还是用FPGA做脉冲好点,频率高脉冲步进更细,会用FPGA做DDS生产脉冲,就应该会做这种加减速脉冲

蓝蓝的恋 发表于 2016-4-8 13:55:18

一个定时器足够了

RAMILE 发表于 2016-4-8 14:54:03

DMA脚本方式可能面临的问题有,脚本生产速度跟不上,两个DMA同时发生的请求面临的优先次序问题,不过脉冲频率不高的环境下,这些都不是事,一个103C8完全胜任

实际上还是用FPGA做脉冲好点,频率高脉冲步进更细,会用FPGA做DDS生产脉冲,就应该会做这种加减速脉冲

error_dan 发表于 2016-4-8 16:26:34

ST的吗?
上L6470。

RAMILE 发表于 2016-4-8 16:50:58

卖L6470开发板{:lol:}

到手即转,80一片,这就是成本价

RAMILE 发表于 2016-4-9 08:56:35

LZ 你代码写出了给我看看,我懒得写

我已经准备L6480了{:lol:}

gpfrank 发表于 2016-4-10 16:59:36

RAMILE 发表于 2016-4-8 13:03
分享一个技巧,
定时器设定为连续自由计数,从0000~FFFF,
定时器比较通道CH1的CCR设定为,“相等输出反转 ...

一个定时器,加3或者4路DMA做脉冲。

这里有个问题,
变频: 因为频率是16位定时器,变频是不是限制? 因为PLC变都是1~100K
启停: 如果3路,4路不是同时启停,这个怎么处理?

一个timer+一个DMA的 很容易变频,用预分频就可以,启停也互不干扰。
关于您说的DMA和计算的问题,这些您可以再增加一个TIMER, 例如500us, 可以每500us查一下,是否有问题。
另外加大BUFFER的尺寸,可以更换循环尺寸等。

现在很想用您的一个timer 做3-4路的办法。
因为高速计数A,B相,一路就要一个。还没好的办法。4路就要4个。
剩下的没几个了。

RAMILE 发表于 2016-4-11 08:58:16

本帖最后由 RAMILE 于 2016-4-11 09:28 编辑

gpfrank 发表于 2016-4-10 16:59
一个定时器,加3或者4路DMA做脉冲。

这里有个问题,



这里有个问题,
变频: 因为频率是16位定时器,变频是不是限制? 因为PLC变都是1~100K

低频率这个问题,可能需要更高技巧的跳周期方式,启动外加的软件周期中断,叫CCR寄存器躲过CNT计数,从而在这次65536个计数中不产生反转,这样可以在高速时钟36MHz输入情况下,获得比较低的输出翻转频率,并且扩展定时精度,躲过255次计数反转,等于将定时器扩展成了24bit

启停: 如果3路,4路不是同时启停,这个怎么处理?

这个看你的C语言程序设计能力了,我编程能力比较渣{:lol:} 。脚本计算模块是这个程序的核心,其中要面对多种工作状态,对不同的脉冲策略进行调度
脉冲停止比较容易处理,可以用上面说的躲过计数的方法,无限躲过计数。脉冲同步启动也比较好处理,把定时器时钟关掉,然后设定脚本开始起跑

现在想着比较麻烦的是,X轴跑一半的,Y轴半路随机启动。这种是类似于按键对刀那种情况,不是路径已经规划好的。这时候只能牺牲响应速度,强制在CNT TIM_UP ISR中
进行命令通信,别的方法暂时没想到

可以在X轴的DMA中断中进行Y轴的脚本启动操作,如果脚本循环节长度是64的话,可以把Y轴响应时间缩短到32个时间片内,我觉得对于随机命令响应这样就足够了
也可以在外部中断中查询X轴DMA的指针计数器,和当前指针指向的数值,这样可以把随机按键响应,缩短到一个中断响应+两个X轴时间片

emobbs 发表于 2016-10-31 22:59:08

还是要留个爪子的

654705188 发表于 2016-11-2 16:07:46

我靠好高深的样子啊。

wsh 发表于 2016-11-4 14:01:05

Mark ST控制电机

19711972f 发表于 2016-12-28 13:36:29

第一次听说这种功能的芯片{:lol:}
页: [1]
查看完整版本: 我想用ST控制3或4个电机运动,有细分驱动器了,对定位有...