6348|15

60

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

实际项目请教:单片机驱动步进电机,由上位机通过串口通讯控制 [复制链接]

学单片机不久,基本能做流水灯、逻辑控制之类的。最近有朋友交来一个项目,上位机通过串口和单片机通讯,单片机接驱动芯片带步进电机。上位机程序由别人用VC写,给了通讯协议如下。

单片机用的是89C2051, P1.0、P1.1控制1号步进电机,P1.0输出脉冲,P1.2输出高/低电平作方向信号;P1.2、P1.3控制2号步进电机,同理是P1.2输出脉冲,P1.2输出方向信号。脉冲数和方向信号由上位机指定。

看了一些书上讲串口的内容,都是把端口的状态或是某个存储单元的内容发送及接收,对应这个项目感觉毫无头绪,主要是帧结构还不太理解,校验、响应码什么的在单片机中怎么实现?请各位老师看一下,能给个示例程序吗提供点思路吗?

步进电机控制通讯接口协议


说明:1,按照节1进行数据定义

      2,串口通讯参数为:9600bps,8,1,无奇偶校验

1,通讯数据帧结构

包头标识   包长   数据     校验
0x7f                    Sum1 Sum2

1)每包数据以0x7f为数据开头标识;
2)“包长”为数据字段+校验字段 的数据字节长度;
3)数据通讯采用“呼叫-应答”处理模式,由上位机呼叫,下位机应答处理模式;
4)包头标识,包长字段分别为1字节长度,校验为2字节长度,数据字段长度由以下具体协议决定;
5)校验 方式为 包头标识+包长+数据字段 的求和。校验和= Sum1*256+ Sum2.

2,通讯协议(数据字段部分定义)步进电机输出

上位机请求
地址 功能码 转角方向1 转角增量1 转角方向2 转角增量2
0x01  0x02     0/1      Δ1 Δ2     0/1      Δ3 Δ4

说明:
1)转角方向,1-顺时针,0-逆时针
2)转角增量1=Δ1*256+Δ2; 转角增量2=Δ3*256+Δ4
   转角单位为度;转角增量数据应少于300,否则下位视为无效数据

下位机响应
地址 功能码 响应码
0x01  0x01     R

说明:
响应码:0-正确完成,1-无效数据,2-校验和错

最新回复

不知道楼主有没有完成这个设计,我的毕业设计就是这个,很急,兄台做好了可以发给我看一下吗,跪谢,包括上位机发送字符程序和单片机程序,我用的是msp430单片机。跪谢楼主,好人一生平安!!!  详情 回复 发表于 2016-5-10 16:25
点赞 关注

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
单片机的串口通讯,只需要设置好相关参数,如波特率、通信端口设置等,即可在相应的寄存器中写入发送数据,或触发后读相应寄存器得到数据。在调试的时候,利用示波器,可以事半功倍。

串口的帧格式是自己在相关的寄存器中设置决定的,一般设置为8位数据,即8个BYTE的数据,校验位一般是经过设置后自动添加的。

[url=http://download.eeworld.net/source/1172712][/url]
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
网上有本书: 单片机模块开发实例导航 有实例代码可以参考
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

4
 
谢谢楼上两位,现在主要是还看不懂协议的定义。

比如,按照协议的字段定义,上位机请求一个转角方向1为“1”, 转角增量1为“100”, 转角方向2为“0”,转角增量2为“50”,应该发送什么样的字符呢?下位机若相应“正确完成”,又应该发送什么样的字符呢?
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

5
 
这种协议大都是自定协议,很简单
8个字节通常用固定的特殊头字节和特殊尾字节作为通讯开始和结束的标志,以防范通讯错位(头字节和尾字节不要用相同的数值,以免错位)
剩余的六个字节,根据协议需求内容的多少,一般要有该帧的数据类型(是命令帧还是数据帧),该帧所传输的数据(即通讯的是什么命令或数据,此处的命令或数据也是用数值指代,通讯双方约定好命令意义,如约定0x01为正转,约定0x02为反转,那么直接通讯0x01或0x02即可代表相应命令,接收端根据约定执行相应命令),如为数据帧的话,则还有相应的数据值(例如在之前的字节里分别却认为数据帧格式,转角数据值,则后续的字节里应有转角的数据量,此处需要注意的是,一个字节最大值为255,如超过,则需要用两个字节来表示该数据量,可表示65535的范围)
如果你即将编写的协议,比较简单,可以把命令动作集中在一个帧内解决,这样可以减少通讯的开销
下位机的回应,也是上述的方法相同的
你的疑惑,我在最初接触通讯的时候也有的,其实只要记住一点就能明白了,通讯的精髓,是双方约定好各个命令和数据的含义,利用已明了其指代的数值进行通讯工作。不明意义的数值,是不应该出现的,若出现,硬件问题造成的不明意义数值,应尽力加以解决以降低其出现概率达到可以接受的程度,在操作中对其不予作用或回复出错提示帧。软件问题造成的不明意义数值,应完全解决。这也是整个系统的容错能力的表现,在设计时应该预先考虑到
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 
来观摩学习下··顺便接分
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

7
 
弄清楚数据含义了,准备开工。定期来这里汇报,请各位朋友多多指教。
数据举例:
7F 0A 01 02 00 00 1E 01 00 3C 00 E7 //表1逆时针转30度 ,表2顺时针转60度
7F 0A 01 02 01 00 1E 00 00 3C 00 E7 //表1顺时针转30度 ,表2逆时针转60度
7F 0A 01 02 01 01 22 00 01 2B 00 DC //表1顺时针转290度 ,表2逆时针转299度
7F 0A 01 02 00 01 22 01 01 2B 00 DC //表1逆时针转290度 ,表2顺时针转299度
 
 
 

回复

99

帖子

0

TA的资源

一粒金砂(初级)

8
 
楼主驱动部分用什么做?软件通讯是可以比较容易实现的。
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

9
 
步进电机采用的是硬件驱动方式,单片机输出脉冲序列和方向信号(高/低电平),接专用的驱动芯片。目前暂时不考虑步进电机启动、停止时的加减速。

协议中转角方向指定了单片机输出的方向信号,如 转角方向1为1,则P1.1输出高电平;
      转角增量指定了单片机输出脉冲序列的脉冲数,如转角增量1为 00 1E, 则P1.0输出对应数量的脉冲。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

10
 
十分抱歉! 顶楼中单片机端口的内容打错了,应该更正为:

单片机用的是89C2051, P1.0、P1.1控制1号步进电机,P1.0输出脉冲,P1.1输出高/低电平作方向信号;P1.2、P1.3控制2号步进电机,同理是P1.2输出脉冲,P1.1输出方向信号。脉冲数和方向信号由上位机指定。
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 9 楼 xmjulytiger 的回复:
十分抱歉! 顶楼中单片机端口的内容打错了,应该更正为:

单片机用的是89C2051, P1.0、P1.1控制1号步进电机,P1.0输出脉冲,P1.1输出高/低电平作方向信号;P1.2、P1.3控制2号步进电机,同理是P1.2输出脉冲,P1.1输出方向信号。脉冲数和方向信号由上位机指定。


键盘进水了。
P1.2、P1.3控制2号步进电机,同理是P1.2输出脉冲,P1.3输出方向信号
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

12
 
先调试好串口通信,然后再根据客户所定的协议,控制步进机,这就是头绪,简单的编程.
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

13
 
开始写串口通讯部分,程序如下。现在有以下问题:

1、接收到12位数据存在缓冲区,要取出前10位来作求和运算(包头标识+包长+数据字段 的求和。校验和= Sum1*256+ Sum2),求和结算与后2位比较,在程序中怎么实现呢?

2、怎么取得指定位的数据呢?比如要取转角方向1那一位的数据,用什么样的语句?

以前写过简单的汇编,C还是第一次用。请各位朋友指教.
******************************************************************************
void main()
{
        /*初始化串口*/
        void init_serial()
        {
                TMOD=0x20; //定时器T1使用工作方式2
                TH1=250;
                TL2=250;
                TR1=1;                //开始计时
                PCON=ox80; //SMOD=1
                SCON=ox50. //串口工作方式1,9600bit/s,允许接收
        }
       
        /*下位机接收数据*/
        while(1)
        {
                unsigned char buf; //指向缓冲区,存放数据

                unsigned char recv_data(*buf)
                {       
                        unsigned char len; //保存数据长度
                        unsigned char i;
                        len=12; //12位的数据长度                       
                        RI=0;                       
                       
                        /*接收数据*/
                        for(i=0; i                         {
                                while(!RI);
                                *buf=SBUF; //接收数据
                                RI=0;
                                buf++       
                        }               
                               
                }
}       
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

14
 
yun
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(中级)

15
 

实际项目请教:用单片机控制步进电机,由上位机串口通信控制下为机

本人现在正处于学习单片机C语言阶段,希望学得不错的老师不吝赐教。本人目前要编写一个程序,是由单片机控制二相步进电机的启动、停止、正反转和速度、位置,P1.0口输入脉冲,P1.2口控制转动方向,1为正转,0为反转,用C语言编写。

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

16
 
不知道楼主有没有完成这个设计,我的毕业设计就是这个,很急,兄台做好了可以发给我看一下吗,跪谢,包括上位机发送字符程序和单片机程序,我用的是msp430单片机。跪谢楼主,好人一生平安!!!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表