现场总线与工业网电机实验报告

时间:2024.5.13

《现场总线及工业网》

实验报告

  级:     11020343     

  号:    1102034332     

  名:       李诚       

  导:       刘波       

20##    12  09

实验二基于CAN总线的电机控制

实验目的

(1)理解和掌握CAN总线通信协议;

(2)理解和掌握CAN总线的标准帧和扩展帧的结构;

(3)初步掌握利用CAN总线实现工业设备控制的方法。

实验设备及软件

1、计算机4台、CAN总线下位机节点2套

2、交流电机及变频器1套

3、RS232转RS485模块4个

4、USB转RS232电缆若干条、连接线缆、接头转换板若干

5、单片机编程器1台

6、软件:串口调试助手、CRC检验码生成器

实验原理

实验原理如图所示,由1台CAN总线节点和4台计算机构成RS485通信网络,首先在计算机上使用串口调试软件发送用于对电机进行正反转控制的CAN总线协议数据帧给该CAN总线节点,该节点再通过CAN总线网络将数据帧发送给与控制电机的变频器相连的另一下位机CAN节点,该节点根据协议控制相应的继电器动作,实现电机的正反转及启动停止控制。实验过程中通过串口调试软件的窗口可方便地观察发送的数据帧结构以及其他实验组对电机的控制情况。

CAN总线节点电路原理图

见附件

实验步骤及要求

1、阅读实验系统CAN总线节点的电路原理图,熟悉控制原理;

2、按照所给控制要求编写相应的数据帧(扩展帧格式);

3、根据控制要求编写CAN总线节点2的控制程序;

4、利用编译软件及程序烧录器将程序烧录到单片机并安装到CAN总线节点2的电路板上;

5、打开串口调试软件,利用编写的数据帧控制电机;

实验内容及结果

1、控制要求

控制电机的正反挺转,其中88H正转,89H反转。

2、编写的扩展帧

正转:82 00 00 40 00 88

反转:82 00 00 40 89 00

停转:82 00 00 40 00 00

3、程序

;设CAN控制器SJA1000的片选地址为7F00H

;选择PeliCAN模式

MODE    EQU    7F00H;SJA1000方式寄存器

CMR     EQU    7F01H;SJA1000命令寄存器

SR      EQU    7F02H;SJA1000状态寄存器

IR      EQU    7F03H;SJA1000中断寄存器

IER     EQU    7F04H;SJA1000验收代码寄存器  ;中断使能寄存器

ACR     EQU    7F10H;SJA1000验收代码寄存器

AMR     EQU    7F14H;SJA1000验收屏蔽寄存器

BTR0    EQU    7F06H;SJA1000总线定时寄存器0

BTR1    EQU    7F07H;SJA1000总线定时寄存器1

OCR     EQU    7F08H;SJA1000输出控制寄存器

RBSA    EQU    7F1EH;SJA1000接收缓存器起始地址寄存器

CDR     EQU    7F1FH;SJA1000时钟分频寄存器

ALC     EQU    7F0BH;SJA1000丢失仲裁捕获寄存器

ECC     EQU    7F0CH;SJA1000错误代码捕获寄存器

CANTXB  EQU    7F10H;SJA1000发送缓冲区首址

CANRXB  EQU    7F10H;SJA1000接收缓冲区首址

RXERR   EQU    7F0EH;

TXERR   EQU    7F0FH;

CPUTM   EQU    30H

CPURM   EQU    40H

;R0-存放CAN发送数据缓冲区地址(接收的PC机数据存放的首地址),R6存放发送的数据个数(来自PC机的数据个数)

;R1-存放CAN接收数据缓冲区地址(发往PC机的数据存放的首地址),R7存放接收的数据个数(发往PC机的数据个数)

;

       ORG    0000H

       SJMP   MAIN

       ORG    30H

;=============================主程序========================================

MAIN:  MOV    SP,#5FH

       LCALL  DELAY2

       LCALL  CANINI         ;SJA1000初始化

       MOV    SCON,#50H      ;串口初始化

       MOV    TMOD,#20H

       MOV    TH1,#0FDH

       MOV    TL1,#0FDH

       MOV    PCON,#00H      ;设置波特率

       SETB   TR1            ;启动定时器

       ;SETB   EA             ;开放中断

       ;SETB   ES             ;开放串行中断

       SETB   P1.7

       MOV    A,#52H

       MOV    SBUF,A

       JNB    TI,$

       CLR    TI

       MOV    A,#65H

       MOV    SBUF,A

       JNB    TI,$

       CLR    TI

       MOV    A,#61H

       MOV    SBUF,A

       JNB    TI,$

       CLR    TI

       MOV    A,#64H

       MOV    SBUF,A

       JNB    TI,$

       CLR    TI

       MOV    A,#79H

       MOV    SBUF,A

       JNB    TI,$

       CLR    TI

       MOV    A,#20H

       MOV    SBUF,A

       JNB    TI,$

       CLR    TI

       MOV    A,#4FH

       MOV    SBUF,A

       JNB    TI,$

       CLR    TI

       MOV    A,#4BH

       MOV    SBUF,A

       JNB    TI,$

       CLR    TI

       MOV    A,#21H

       MOV    SBUF,A

       JNB    TI,$

       CLR    TI

       CLR    00H            ;位00H-CAN发送区是否有数据需要发送,0-无,1-有

       CLR    01H            ;位01H-CAN接收区是否有数据需要发送,0-无,1-有

       CLR    02H            ;位02H-是否第1次接收PC机数据标志位:0-是,1-否

       CLR    03H            ;位03H-接收结束标志位

LOOP:  LCALL  SEARCH

       JNB    01H,LOOP       ;接收到CAN数据?是-开始工件检测(与电缸控制器进行通信;否-继续接收

       CLR    01H

       MOV    A,CPURM+5

       CJNE   A,#88H,NO_FORWARD

MOTOR_FORWARD:

       SETB   P1.5

       SETB   P3.4

       LCALL  DELAY2

       LCALL  DELAY2

       LCALL  DELAY2

       LCALL  DELAY2

       LCALL  DELAY2

       LCALL  DELAY2

       LCALL  DELAY2

       LCALL  DELAY2

       LCALL  DELAY2

       CLR    P1.4

       CLR    P1.6

       SJMP   LOOP

NO_FORWARD:

       MOV    A,CPURM+6

       CJNE   A,#89H,MOTOR_STOP

MOTOR_BACKWARD:

       SETB   P1.4

       SETB   P1.6

       LCALL  DELAY2

       LCALL  DELAY2

       LCALL  DELAY2

       LCALL  DELAY2

       LCALL  DELAY2

       LCALL  DELAY2

       LCALL  DELAY2

       LCALL  DELAY2

       LCALL  DELAY2

       CLR    P1.5

       CLR    P3.4

       SJMP   LOOP

MOTOR_STOP:

       SETB   P1.4

       SETB   P1.5

       SETB   P1.6

       SETB   P3.4

       SJMP   LOOP

;motor_stop:

;       CJNE   A,#02,LOOP4

;       SETB    P1.4

LOOP4: SJMP   LOOP           ;跳回开始新的循环

;=========================CAN控制器初始化子程序================================

CANINI:

       MOV    DPTR,#MODE    ;方式寄存器

       MOV    A,#01H        ;进入复位模式,对SJA1000进行初始化

       MOVX   @DPTR,A       ;

CANI1: MOVX   A,@DPTR

       JNB    ACC.0,CANI1

       MOV    DPTR,#CDR     ;时钟分频寄存器

       MOV    A,#0C8H        ;1000,1000

       MOVX   @DPTR,A       ;选择PeliCAN模式,关闭时钟输出(CLKOUT)

       MOV    DPTR,#IER     ;

       MOV    A,#00001111B  ;中断允许寄存器开放发送中断、溢出中断和错误警告中断

       MOVX   @DPTR,A       ;

       MOV    DPTR,#AMR     ;接收屏蔽寄存器

       MOV    A,#0FFH       ;不用过滤ID28-ID21(类型)

       MOVX   @DPTR,A       ;不用过滤ID20-ID13(数量)

       INC    DPTR

       MOV    A,#0FFH       ;

       MOVX   @DPTR,A       ;

       INC    DPTR

       MOV    A,#00H        ;要求判断总线上的数据是否是发送给该节点的(过滤)

       MOVX   @DPTR,A       ;

       INC    DPTR

       MOV    A,#00H  ;

       MOVX   @DPTR,A       ;

       MOV    DPTR,#ACR     ;接收代码寄存器

       MOV    A,#0FFH       ;

       MOVX   @DPTR,A       ;

       INC    DPTR

       MOV    A,#0FFH       ;

       MOVX   @DPTR,A       ;

       INC    DPTR          ;

       MOV    A,#40H       ;

       MOVX   @DPTR,A       ;

       INC    DPTR

       MOV    A,#00H        ;该节点地址为4000H

       MOVX   @DPTR,A       ;

       MOV    DPTR,#BTR0    ;总线定时寄存器0

       MOV    A,#31H

       MOVX   @DPTR,A       ;

       MOV    DPTR,#BTR1    ;总线定时寄存器1

       MOV    A,#6FH

       MOVX   @DPTR,A       ; 设置波特率40kbps

       MOV    A,#00011010B  ;输出控制寄存器(采用推挽驱动方式)

       MOV    DPTR,#OCR     ;

       MOVX   @DPTR,A

       MOV    A,#00H        ;接收缓存器起始地址寄存器

       MOV    DPTR,#RBSA

       MOVX   @DPTR,A       ;设置接收缓存器FIFO起始地址为0

       MOV    A,#00H         ;

       MOV    DPTR,#TXERR   ;发送错误计数寄存器

       MOVX   @DPTR,A       ;清除发送错误计数寄存器

       MOV    DPTR,#ECC

       MOVX   A,@DPTR       ;错误代码捕捉寄存器,清除错误代码捕捉寄存器

       MOV    A,#08H        ;方式寄存器

       MOV    DPTR,#MODE

       MOVX   @DPTR,A       ;设置双滤波接收方式,并返回工作状态

       RET

;===========================CAN总线发送数据子程序==============================

TDATA:

       MOV     DPTR,#SR     ;状态寄存器

       MOVX    A,@DPTR       ;从SJA1000 读入状态寄存器值

       JB      ACC.4,TDATA  ;判断是否正在接收正在接收则等待

TS0 :  MOVX    A,@DPTR

       JNB     ACC.3,TS0     ;判断上次发送是否完成未完成则等待发送完成

TS1:   MOVX    A ,@DPTR

       JNB     ACC.2,TS1     ;判断发送缓冲区是否锁定锁定则等待

TS2 :  MOV     R0,#CPUTM

       MOV     DPTR, #CANTXB ;SJA1000 发送缓存区首址

       MOV     A,@R0         ;

       MOVX    @DPTR,A       ;

       JB      ACC.7,TS3

       ANL     A,#0FH        ;发送标准帧

       ADD     A,#02H

       MOV     R2,A

       AJMP    TS4

TS3:   ANL     A,#0FH        ;发送扩展帧

       ADD     A,#04H

       MOV     R2,A

TS4:   INC     R0

       MOV     A,@R0

       INC     DPTR

       MOVX    @DPTR,A

       DJNZ    R2,TS4

       MOV     DPTR ,#CMR    ;命令寄存器地址

       MOV     A,#01H

       MOVX    @DPTR,A      ;启动SJA1000 发送

       CLR     00H          ;清有数据发送标志位

       RET

;========================CAN总线查询方式接收数据子程序=========================

SEARCH:

       MOV    DPTR,#SR       ;状态寄存器地址

       MOVX   A,@DPTR

       ANL    A,#0C3H        ;读取总线脱离错误状态接收溢出有数据等位

       JNZ    PROC1

       RET

                             ;无上述状态结束

PROC1: JNB    ACC.7,PROCI

BUSERR:MOV    DPTR, #IR      ;IR 中断寄存器出现总线脱离

       MOVX   A, @DPTR       ;读中断寄存器清除中断位.

       MOV    DPTR ,#MODE    ;方式寄存器地址

       MOV    A,#08H

       MOVX   @DPTR,A        ;将方式寄存器复位请求位清0

       RET

       NOP

PROCI: MOV    DPTR,#IR       ;总线正常

       MOVX   A,@DPTR        ;读取中断位

       JNB    ACC.3,OTHER

OVER:  MOV    DPTR,#CMR      ;数据溢出中断置位.

       MOV    A,#0CH

       MOVX   @DPTR,A        ;在命令寄存器中清除数据溢出和释放接收缓冲区

       RET

       NOP

OTHER: JB     ACC.0,RECE     ;IR.0=1 接收FIFO 未满或接收中断使能

       LJMP   RECOUT         ;IR.0=0 接收缓冲区无数据退出接收

       NOP

RECE:  MOV    DPTR,#CANRXB   ;读取并保存接收缓冲区的数据

       MOV    R1,#CPURM      ;CPU 片内接收缓冲区首址

       MOVX   A,@DPTR        ;读取读取CAN 缓冲区的2 号字节

       MOV    @R1,A          ;保存

       ANL    A,#0FH         ;截取低4 位是数据长度0~8

       ADD    A,#4           ;加4个字节的标识符ID

       MOV    R3,A

RDATA0: INC    DPTR

       INC    R1

       MOVX   A,@DPTR

       MOV    @R1,A

       DJNZ   R3,RDATA0      ;循环读取与保存

       MOV    DPTR,#CMR

       MOV    A,#04H         ;释放CAN 接收缓冲区

       MOVX   @DPTR,A

       SETB   01H

RECOUT:

       MOV    DPTR, #ALC     ;释放仲裁丢失捕捉寄存器和错误捕捉寄存器

       MOVX   A,@DPTR

       MOV    DPTR ,#ECC

       MOVX   A,@DPTR

       NOP

       RET

;========================PC机数据接收查询子程序==============================

RS_RE: clr    p1.7

       JNB    RI,$

       CLR    RI

       JB     02H,RS_R1

       MOV    R0,#CPUTM

       MOV    A,SBUF

       MOV    @R0,A

       JB     ACC.7,RS_R2

       ANL     A,#0FH        ;发送标准帧

       ADD     A,#02H

       MOV     R4,A

       AJMP    RS_R3

RS_R2: ANL     A,#0FH        ;发送扩展帧

       ADD     A,#04H

       MOV     R4,A

RS_R3: SETB    02H

       LJMP    RS_RE

RS_R1: INC     R0

       MOV     A,SBUF

       MOV     @R0,A

       DJNZ    R4,RS_RE

       SETB    00H

       CLR     02H

       lcall   TDATA

RS_R4: RET

;============================往PC机发送数据子程序==============================

RS_TR:

       MOV    R1,#CPURM

       MOV    A,@R1

       JB     ACC.7,RS_T1

       ANL    A,#0FH        ;发送标准帧

       ADD    A,#02H

       MOV    R5,A

       AJMP   RS_T2

RS_T1: ANL    A,#0FH        ;发送扩展帧

       ADD    A,#04H

       MOV    R5,A

RS_T2: INC    R5

SEND:  MOV    A,@R1

       MOV    SBUF,A

       JNB    TI,$

       CLR    TI

       INC    R1

       DJNZ   R5,SEND

       CLR    01H

       RET

 ;==================================延时子程序==================================

DELAY2: MOV   R7,#00H      ;

        MOV   R6,#00H      ;

DELAY21:DJNZ  R6,DELAY21   ;

        DJNZ  R7,DELAY21   ;

        RET

        END

4、电机运行结果

电机正转:

电机反转:

电机停转:

5、实验结论

更多相关推荐:
现场总线实验报告-刘娟

专业实验报告

现场总线实验报告

现场总线技术实验报告学校成都理工大学学院核技术与自动化工程学院专业电气工程及其自动化姓名班级学号指导老师黄洪全实验一KeilC51开发环境学习一123实验目的KeilC51集成开发环境学习掌握KeilC51环境...

现场总线实验报告

一实验目的通过实际搭建一个DeviceNet实验平台来了解DeviceNet的基本设计方法和思路二实验仪器设备1SLC500模块式控制器包括13槽机架CPUIO模块1746IB161746OB16设备网扫描器模...

现场总线实验报告

现场总线实验一实验一SJA1000初始化一实验要求正确完成对SJA1000初始化初始化成功后用LED点亮表示初始化完成否则LED不亮二实验内容1实现SJA1000的初始化设置2理解SJA1000的相关寄存器的设...

现场总线实验报告

实验报告学院电气工程学院专业测控技术与仪器班级测仪101实验报告学院电气工程学院专业测控技术与仪器班级测仪101

北邮现场总线实验报告

现场总线实验报告实验名称CAN总线技术与iCAN模块实验学院自动化学院专业自动化专业班级20xx211411姓名韩思宇学号102120xx指导老师杨军一实验名称实验一CAN总线技术与iCAN模块实验二实验设备计...

现场总线实验报告

重庆大学研究生专业实验教学实验报告书实验课程名称实验指导教师学院专业及类别学号姓名实验日期成绩现场总线控制实验赖俊峰自动化学院控制工程专业20xx年5月27日重庆大学研究生院制一实验目的1了解SLC500可编程...

现场总线实验报告

CAN总线通信实验实验目的基于SJA1000CAN总线控制器和单片机系统完成CAN总线数据收发实验掌握CAN总线波特率设置消息ID和接收滤波器配置完成两个以上节点的数据通讯实验器材实验器材如下不含编程计算机SJ...

现场总线实验报告

现场总线实验报告姓名班级学号指导老师实验日期实验成绩实验一KeilC51开发环境学习一实验目的1KeilC51集成开发环境学习2掌握KeilC51环境的代码编辑调试3掌握软件下载方法二实验设备1KeilC51软...

数据结构实验二试验报告 线性表的基本操作

数据结构试验报告实验二线性表的基本操作专业班级网络工程1002班组长王星20xx100230组员郭坤铭20xx100243张磊20xx10024420xx年3月16日一实验项目目的和要求1掌握线性表的特点2掌握...

实验报告--数据结构--线性表的合并

辽宁工程技术大学上机实验报告附页includequotstdiohquotincludequotstdlibhquotdefineLISTINITSIZE100defineLISTINCREMENT10type...

数据结构实验一题目一线性表实验报告

数据结构实验报告实验名称:实验1线性表学生姓名:班级:班内序号:学号:日期:1.实验要求1、实验目的:熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法学习指针、模板类、异常处理的使用掌握线性表的操作的实…

现场总线实验报告(26篇)