找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17754|回复: 24
收起左侧

一个单片机控制两个步进电机同时转,主函数怎么写?

  [复制链接]
ID:86913 发表于 2017-2-13 11:23 | 显示全部楼层 |阅读模式
两个电机分别由P0、P1口控制,并且两个电机的运行状态如转数、速度和
方向都不一样,现在要求两个电机同时开始转动(但不同时停止),要求
动作不循环,只运转一次。这个主函数怎么写?请指导!
(下面的主函数,一个电机转完了,才转另一个电机 ,没有用)

/********主函数********/
main()       
    {
          P0=0xff;P1=0xff;       //两个端口同时工作   
        motor1();              //电机1转动,它由P0口控制
        P0=0x00;               //电机1停转
        motor2();              //电机2转动,它由P1口控制
        P1=0x00;               //电机2停转
    }


回复

使用道具 举报

ID:227622 发表于 2018-8-8 17:39 | 显示全部楼层
其实这个问题我也遇到过,后来查了好多资料有点头绪了,因为我想做2自由度机械臂,也是要控制2个步进电机同时运转,后来发现51单片机因为只有定时器这种资源,而没有分时操作系统的概念,所以我打算模仿方式操作系统理论,将时间分成许多小区间,然后每隔一个区间就控制一个步进电机,因为时间区间非常小,所以从宏观上看两个步进电机是同时运转的,其实他们在互相抢夺cpu的资源,所以也是要付出驱动能力比正常驱动弱一点的代价,好了说一下程序的实现,其实无非可以用定时器来实现每次中断驱动步进电机2,主函数驱动步进电机1,要注意的是实现好2个步进电机运动的时间间隔,这又有点类似于动态扫描数码管一样了,需要一个定时器中断来不断扫描数码管更新的信息,嗯,其实楼主可以自己试一下,不懂再问我。谢谢~

评分

参与人数 1黑币 +80 收起 理由
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:164496 发表于 2017-2-13 21:09 | 显示全部楼层
看不到你的函数内容,给步进电机发脉冲应该是用定时器去发,用延时的方法让程序发就是很不好的,用两个定时器分别给两个步进电机发脉冲,什么时候发用条件,发多少用两个不同的变量控制定时器,发的频率用定时器的初始值

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:153041 发表于 2017-2-13 22:04 | 显示全部楼层
按楼上说的没错,如果楼主非要用空循环延时,可以把moto1和moto2打散到一起,moto1走一步,然后moto2走一步,再moto1走一步.... 这样穿插起来。。  如果要程序模块化可读,就采用操作系统,建立两个并发的任务,分别控制两个电机。。。

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:86913 发表于 2017-2-14 10:27 | 显示全部楼层
谢谢楼上两位提醒和指导,我是新手,刚开始是学延时函数的,定时器还不会,如果有定时器控制两个电机同时转动的这种例子,请发一个给我,非常感谢!
“把moto1和moto2打散到一起,moto1走一步,然后moto2走一步,再moto1走一步.... 这样穿插起来。”我以前试过的就是这种方式的,这不是我想学的。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:164429 发表于 2017-2-14 14:42 | 显示全部楼层
把引脚状态改变全放到定时器中,时间到了改变一个,不管有多少到了改变就好了加油

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:123289 发表于 2017-2-14 19:27 | 显示全部楼层
两个、十个一样做,看你如何构思。
基本上会做一个就能做十个。
电机的响应速度远小于单片机。各电机的驱动错开,尽可能将相同或类似的程序部分做成子程序调用。多用中断,合理分配各电机的驱动控制时间。千万不可让程序死在一个电机上运行,即不允许有死待某个条件变量的函数。

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:164687 发表于 2017-2-15 03:43 | 显示全部楼层
电机的响应速度远小于单片机。各电机的驱动错开,尽可能将相同或类似的程序部分做成子程序调用。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:105206 发表于 2017-2-15 10:33 | 显示全部楼层
51单片机最多只能实现两个步近电机同时运转。我用的是驱动器。
回复

使用道具 举报

ID:86913 发表于 2017-2-16 21:08 | 显示全部楼层
这样的要求能编出程序员吗?请看图上要求。哪位高手帮帮我编制个C语言程序-----  一个单片机控制两个步进电机同时启动。单片机为STC89C52,驱动器L298N。先谢谢了! 2017-02-16 11 26 55.png

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:7485 发表于 2017-2-17 08:59 | 显示全部楼层
首先,51单片机是简单的处理器,单线程,不可能真正意义上的“同时”运行两个子程序(函数)。

51单片机相对高级的处理器来说,虽说运行的速度不高,可也是us级的速度,相比步进电机的运行波形来说,差着几个数量级的。所以用“分时段”来控制2台步进电机是一点问题都没有。因为控制程序中单片机将绝大部分时间用来延时。
如果使用程序循环来延时,单片机将时钟没有空闲时间。
但是如果用定时器来延时,在延时过程中,单片机就可以腾出手来做其他事情。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:105206 发表于 2017-2-17 10:34 | 显示全部楼层
我觉得51只能做两个,不知各位攒不攒同。


我是同时按不同的驱动,相互不干扰,等待。我用的是驱动器驱动步进马达。

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:111634 发表于 2017-2-17 21:59 | 显示全部楼层
jubaolun 发表于 2017-2-17 10:34
我觉得51只能做两个,不知各位攒不攒同。

同时驱动10台步进电机都没问题。
回复

使用道具 举报

ID:86913 发表于 2017-2-18 16:08 | 显示全部楼层
各位高手,能否提供一个采用定时器的,控制两个电机 的C语言程序,非常感谢!
回复

使用道具 举报

ID:105206 发表于 2017-2-18 20:09 | 显示全部楼层
如果51能做10个,3轴打印不就可以用51单片机了。您觉得勒。
回复

使用道具 举报

ID:86913 发表于 2017-3-20 09:15 | 显示全部楼层
MAIKER 发表于 2017-2-13 21:09
看不到你的函数内容,给步进电机发脉冲应该是用定时器去发,用延时的方法让程序发就是很不好的,用两个定时 ...

谢谢您,您好的意思我大致懂了,就是编程序太难了,没有一个示例比较难!
回复

使用道具 举报

ID:86913 发表于 2017-3-20 09:18 | 显示全部楼层
utzuzu 发表于 2017-2-13 22:04
按楼上说的没错,如果楼主非要用空循环延时,可以把moto1和moto2打散到一起,moto1走一步,然后moto2走一步 ...

谢谢您!对我这个新手来说有点太深奥了。
回复

使用道具 举报

ID:86913 发表于 2017-3-20 09:18 | 显示全部楼层
1053356130 发表于 2017-2-14 14:42
把引脚状态改变全放到定时器中,时间到了改变一个,不管有多少到了改变就好了加油

谢谢您的指导!
回复

使用道具 举报

ID:86913 发表于 2017-3-20 09:21 | 显示全部楼层
ahshmj 发表于 2017-2-17 08:59
首先,51单片机是简单的处理器,单线程,不可能真正意义上的“同时”运行两个子程序(函数)。

51单片机 ...

谢谢您的指导!
回复

使用道具 举报

ID:227622 发表于 2018-3-22 19:06 | 显示全部楼层
如果要实现精确的控制,最好给步进电机发脉冲用定时器去计数,用延时的方法让程序发就是很不好的,用两个定时器分别给两个步进电机发脉冲,此外,还可以通过各电机的驱动错开,尽可能将相同或类似的程序部分做成子程序调用,也可以实现这功能

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:379643 发表于 2018-8-8 18:03 | 显示全部楼层
学习
回复

使用道具 举报

ID:600893 发表于 2019-9-9 16:28 | 显示全部楼层
可以  可以 打开了我的思路
回复

使用道具 举报

ID:468238 发表于 2019-9-10 15:13 | 显示全部楼层
你可以通过时间片来进行操作   每一毫秒进行一个任务    这样解决电机问题
回复

使用道具 举报

ID:315853 发表于 2019-9-10 15:58 | 显示全部楼层
将P0=0x00、P1=0x00抽出,写个while,while里面写个if判断左右轮在什么情况下分别执行P0=0x00、P1=0x00,同时避免无效if重复执行,都停止结束就执行while空语句
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表