《现场总线及工业网》
实验报告
班 级: 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、实验结论