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

xmjulytiger 2010-03-24 05:16:17
学单片机不久,基本能做流水灯、逻辑控制之类的。最近有朋友交来一个项目,上位机通过串口和单片机通讯,单片机接驱动芯片带步进电机。上位机程序由别人用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-校验和错
...全文
883 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xmjulytiger 2010-03-29
  • 打赏
  • 举报
回复
开始写串口通讯部分,程序如下。现在有以下问题:

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<len; i++);
{
while(!RI);
*buf=SBUF; //接收数据
RI=0;
buf++
}

}
}
蒋剑波 2010-03-27
  • 打赏
  • 举报
回复
先调试好串口通信,然后再根据客户所定的协议,控制步进机,这就是头绪,简单的编程.
tcdzyq 2010-03-26
  • 打赏
  • 举报
回复
楼主驱动部分用什么做?软件通讯是可以比较容易实现的。
xmjulytiger 2010-03-26
  • 打赏
  • 举报
回复
弄清楚数据含义了,准备开工。定期来这里汇报,请各位朋友多多指教。
数据举例:
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度
xmjulytiger 2010-03-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xmjulytiger 的回复:]
十分抱歉! 顶楼中单片机端口的内容打错了,应该更正为:

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

键盘进水了。
P1.2、P1.3控制2号步进电机,同理是P1.2输出脉冲,P1.3输出方向信号
xmjulytiger 2010-03-26
  • 打赏
  • 举报
回复
十分抱歉! 顶楼中单片机端口的内容打错了,应该更正为:

单片机用的是89C2051, P1.0、P1.1控制1号步进电机,P1.0输出脉冲,P1.1输出高/低电平作方向信号;P1.2、P1.3控制2号步进电机,同理是P1.2输出脉冲,P1.1输出方向信号。脉冲数和方向信号由上位机指定。
xmjulytiger 2010-03-26
  • 打赏
  • 举报
回复
步进电机采用的是硬件驱动方式,单片机输出脉冲序列和方向信号(高/低电平),接专用的驱动芯片。目前暂时不考虑步进电机启动、停止时的加减速。

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

比如,按照协议的字段定义,上位机请求一个转角方向1为“1”, 转角增量1为“100”, 转角方向2为“0”,转角增量2为“50”,应该发送什么样的字符呢?下位机若相应“正确完成”,又应该发送什么样的字符呢?
DISINHUI 2010-03-24
  • 打赏
  • 举报
回复
网上有本书: 单片机模块开发实例导航 有实例代码可以参考
C_Rabbit 2010-03-24
  • 打赏
  • 举报
回复
单片机的串口通讯,只需要设置好相关参数,如波特率、通信端口设置等,即可在相应的寄存器中写入发送数据,或触发后读相应寄存器得到数据。在调试的时候,利用示波器,可以事半功倍。

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

http://download.csdn.net/source/1172712

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧