📄 qep.lst
字号:
C:\tic2xx\c2000\cgtools\bin\dspa.exe QEP.asm QEP.obj -gls -v2xx
TMS320C1x/C2x/C2xx/C5x COFF Assembler Version 7.00 Wed Jun 8 17:23:51 2005
Copyright (c) 1987-1999 Texas Instruments Incorporated
QEP.asm PAGE 1
1 ;=====================================================================
2 ; File : QEP.asm
3 ; Module Name : QEP
4 ; Initialization Routine : QEP_INIT
5 ; Description : 通过计算QEPA,QEPB,QEPZ得到转子实际转速OmigaR0,和转向QEP_dir。
6 ; 当通过原点的时候有正脉冲,通过捕捉功能来产生中断,
7 ; 给计数器重新赋初值。
8 ; OmigaR0 = ( POS0 - POS1 ) / Tpwm,单位(1/mS)变换成可以被其它模块用的形式,OmigaR0=OmigaR0*7FFFH/2pi
9 ;
10 ; |~~~~~~~~~~~~~~~~~~|
11 ; POS0 o------> | |
12 ; POS1 o------> | QEP |----->o OmigaR0
13 ; Tpwm o------> | |----->o QEP_dir
14 ; | |
15 ; |------------------|
16 ;
17 ; 编码器为1000线,每360度产生4000个脉冲。每个PWM开关周期进行一次计算。
18 ; Modify: 2004.6.16
19 ;=====================================================================
20 .include "f2407.h"
21 .global QEP,QEP_INIT ; function call
22
23 .global POS0,POS1 ; Inputs
24 .global OmigaR0,QEP_dir ; Outputs
25 .global TEMP
26 .global QEP_C ; constant
27
28 ;=====================================================================
29 0000 QEP_INIT:
30 ;=====================================================================
31 0000 bce8 LDP #DP_EVA
32 0001 ae20 SPLK #0000H,CAPCONA ; 使能QEP
0002 0000
33 0003 ae08 SPLK #1830H,T2CON ; 还没有使能timer2。
0004 1830
34 0005 ae05 SPLK #4000H,T2CNT ; 计数器初值。考虑到要增减计数,取个中间值。(不用超过8000,为负
0006 4000
35
36 0007 bc04 LDP #DP_DATA
37 0008 ae00! SPLK #0,POS1 ; 存第一个值。
0009 0000
38 000a ae00! SPLK #41,QEP_C ; 计算OmigaR0用到的常量
000b 0029
39 000c bce8 LDP #DP_EVA
40 000d ae08 SPLK #1870H,T2CON ; 使能timer2。
000e 1870
41 000f ef00 RET
42 ;=====================================================================
43 0010 QEP:
44 ;=====================================================================
45 0010 bf00 SPM 0 ;相乘为无符号数相乘,不需要移位。
46 ;----------------------------------------------------
47 ; calculate QEP_dir
48 0011 bce8 LDP #DP_EVA ;检测转向
TMS320C1x/C2x/C2xx/C5x COFF Assembler Version 7.00 Wed Jun 8 17:23:51 2005
Copyright (c) 1987-1999 Texas Instruments Incorporated
QEP.asm PAGE 2
49 0012 4100 BIT GPTCONA,1 ;通用定时器2的状态,1为增计数。
50 0013 e100 BCND CONVER,TC ;增计数时转移
0014 0018'
51 0015 b900 LACL #0 ;减计数,反向旋转。
52 0016 7980 B END_QEP_dir
0017 0019'
53 0018 CONVER:
54 0018 b901 LACL #1 ;增计数,正向旋转。
55 0019 END_QEP_dir:
56 0019 bc04 LDP #DP_DATA
57 001a 9000! SACL QEP_dir
58 ;----------------------------------------------------
59 ; calculate OmigaR0
60 ; OmigaR0 = ( POS0 - POS1 ) / Tpwm 增减计数算式一样
61 ; 转换成CAL_FLUX可用=(POS0 - POS1)*5*(7FFFH/4000)=(POS0 - POS1)*41,(单位1/mS,7FFFh为360度)按Tpwm=0.2mS
62 ; 令QEP_C=41,
63 ; T2CNT>=4000+初值(增计数)或T2CNT<=-4000+初值(减计数)时重新装载计数值。
64 ; 判断是否超过4000线。
65 001b e388 BCND DOWNCOUNT,EQ ; ACC=0时转移,减计数。
001c 0035'
66 ; 增计数时
67 001d bce8 LDP #DP_EVA
68 001e 1005 LACC T2CNT
69 001f bc04 LDP #DP_DATA
70 0020 9000! SACL POS0 ; 存当前位置
71 0021 3000! SUB POS1
72 0022 9000! SACL TEMP ; 存差值
73 0023 7300! LT TEMP
74 0024 5400! MPY QEP_C ; 按5K开关频率、电机1500r/min、则相乘不会超出16位。
75 0025 be03 PAC
76 0026 bfb0 AND #7FFFH ;保证不会为负数
0027 7fff
77 0028 9000! SACL OmigaR0 ;求得OmigaR0
78 ; 判断是否超过4000线
79 0029 1000! LACC POS0
80 002a bfa0 SUB #4FA0H ; 4FA0H-4000H=4000
002b 4fa0
81 002c e344 BCND END_DIS,LT ; 4000线以后就重新计数。
002d 004e'
82 002e bf90 ADD #4000H
002f 4000
83 ; SACL POS0
84 0030 9000! SACL POS1 ; 下一次计算的POS1
85 0031 bce8 LDP #DP_EVA
86 0032 9005 SACL T2CNT ; COUNTER=POS1
87 0033 7980 B END_QEP
0034 0050'
88 ; 减计数时
89 0035 DOWNCOUNT:
90 0035 bce8 LDP #DP_EVA
91 0036 1005 LACC T2CNT
92 0037 bc04 LDP #DP_DATA
93 0038 9000! SACL POS0 ; 存当前位置
94 0039 3000! SUB POS1
TMS320C1x/C2x/C2xx/C5x COFF Assembler Version 7.00 Wed Jun 8 17:23:51 2005
Copyright (c) 1987-1999 Texas Instruments Incorporated
QEP.asm PAGE 3
95 003a be00 ABS ; 减计数,相减为负,取绝对值
96 003b 9000! SACL TEMP ; 存差值
97 003c 7300! LT TEMP
98 003d 5400! MPY QEP_C ; 按5K开关频率、电机1500r/min、则相乘不会超出16位。
99 003e be03 PAC
100 003f bfb0 AND #7FFFH ;保证不会为负数
0040 7fff
101 0041 9000! SACL OmigaR0 ;求得OmigaR0
102 ; 判断是否超过4000线
103 0042 1000! LACC POS0
104 0043 bfa0 SUB #3060H ; 4000h-3060h=4000
0044 3060
105 0045 e304 BCND END_DIS,GT ; 4000线以后就重新计数。
0046 004e'
106 0047 bf90 ADD #4000H ; 加上初值4000H,重新一轮循环
0048 4000
107 ; SACL POS0
108 0049 9000! SACL POS1 ; 下一次计算的POS1
109 004a bce8 LDP #DP_EVA
110 004b 9005 SACL T2CNT ; COUNTER=POS1
111 004c 7980 B END_QEP
004d 0050'
112 004e END_DIS:
113 004e 1000! LACC POS0
114 004f 9000! SACL POS1 ; 下一次计算的POS1
115 0050 END_QEP:
116 ;正反转的处理。
117 ;----------------------------------------------------
118 0050 bf00 SPM 0 ; 复位
119 0051 ef00 RET
No Errors, No Warnings
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -