📄 macro.h
字号:
;==========================================================
;所用宏
;----------------------------------------------------------
STOP: .MACRO ;停机模块
LDP #0E1H ;7080H-70FFH
LACL PADATDIR
AND #1111111111110111B
SACL PADATDIR ;PADATDIR.3(IOPA3)=/DISDRIVE(DP=0E1H)
LDP #0E8H
LACL COMCON
AND #1111110111111111B
SACL COMCON ;禁止PWM输出
LDP #0E8H
SPLK #0,CMPR1
SPLK #0,CMPR2
LDP #4 ;200H-027FH
SPLK #0,RunFlag
.ENDM
;--------------------------------------------------------------------
RUN: .MACRO ;运行宏
LDP #4 ;200H-027FH
SPLK #1,RunFlag
LDP #0E1H ;7080H-70FFH
LACL PADATDIR ;;PADATDIR.3(IOPA3)=/DISDRIVE(DP=0E1H)
OR #1000B
SACL PADATDIR ;;PADATDIR.3(IOPA3)=/DISDRIVE(DP=0E1H)
LDP #0E1H ;7080H-70FFH
LACC #1111111111111011B
AND PADATDIR
SACL PADATDIR ;PADATDIR.2(IOPA2)=UNCLOCK
LACC #100B
OR PADATDIR
SACL PADATDIR ;将UNLOCK置低再置高
LDP #0E8H
LACL COMCON
OR #1000000000B
SACL COMCON ;允许PWM输出
.ENDM
;----------------------------------------------------------
ALARM: .MACRO ;ALARM模块
LDP #0E1H ;7080H-70FFH
LACL PCDATDIR ;PCDATDIR.6(IOPC6)=ALARM
OR #1000000B
SACL PCDATDIR ;PCDATDIR.6(IOPC6)=ALARM
.ENDM
;-----------------------------------------------------------------------
DISALARM: .MACRO ;DISALARM模块
LDP #0E1H ;7080H-70FFH
LACL PCDATDIR ;PCDATDIR.6(IOPC6)=ALARM
AND #1111111110111111B
SACL PCDATDIR ;PCDATDIR.6(IOPC6)=ALARM
.ENDM
;------------------------------------------------------------------------
SHORT: .MACRO
LDP #0E1H
LACC PBDATDIR
OR #80H ;PBDATDIR.7(IOPB7)
SACL PBDATDIR
.ENDM
;-----------------------------------------------------------------------
DISSHORT: .MACRO
LDP #0E1H
LACC PBDATDIR
AND #0FF7FH ;PBDATDIR.7(IOPB7)
SACL PBDATDIR
.ENDM
;========================================================================
BREAK: .MACRO
LDP #0E1H
LACC PBDATDIR
OR #20H ;PBDATDIR.5(IOPB5)
SACL PBDATDIR
.ENDM
;========================================================================
DISBREAK: .MACRO
LDP #0E1H
LACC PBDATDIR
AND #0FFDFH ;PBDATDIR.5(IOPB5)
SACL PBDATDIR
.ENDM
;========================================================================
FAN: .MACRO
LDP #0E1H
LACC PBDATDIR
OR #40H ;PBDATDIR.6(IOPB6)
SACL PBDATDIR
.ENDM
;========================================================================
DISFAN: .MACRO
LDP #0E1H
LACC PBDATDIR
AND #0FFBFH ;PBDATDIR.6(IOPB6)
SACL PBDATDIR
.ENDM
;========================================================================
;========================================================================
Y1ON .MACRO
LDP #0E1H
LACC PCDATDIR
OR #10B ;PCDATDIR.1(IOPC1)=RUN(Y1)
SACL PCDATDIR
.ENDM
Y1OFF .MACRO
LDP #0E1H
LACC PCDATDIR
AND #1111111111111101B ;PCDATDIR.1(IOPC1)=RUN(Y1)
SACL PCDATDIR
.ENDM
Y2ON .MACRO
LDP #0E1H
LACC PCDATDIR
OR #1B ;PCDATDIR.0(IOPC0)=FAI(Y2)
SACL PCDATDIR
.ENDM
Y2OFF .MACRO
LDP #0E1H
LACC PCDATDIR
AND #1111111111111110B ;PCDATDIR.0(IOPC0)=FAI(Y2)
SACL PCDATDIR
.ENDM
Y3ON .MACRO
LDP #0E1H
LACC PCDATDIR
OR #10000000B ;PCDATDIR.7(IOPC7)=FDT(Y3)
SACL PCDATDIR
.ENDM
Y3OFF .MACRO
LDP #0E1H
LACC PCDATDIR
AND #1111111101111111B ;PCDATDIR.7(IOPC7)=FDT(Y3)
SACL PCDATDIR
.ENDM
;========================================================================
;=================================================================
SinCosAngle .MACRO
;------------------------------------------------------------------
;(Angle)--->(CosAngle,SinAngle)
;------------------------------------------------------------------
ldp #4
LACL Angle ;磁通角度扇区
sub #900
BCND QUADRANT1,LT
sub #900
BCND QUADRANT2,LT
sub #900
BCND QUADRANT3,LT
sub #900
BCND QUADRANT4,LT
QUADRANT1 LACL Angle
ADD #SINCOSTAB
TBLR SinAngle
LACC #900
SUB Angle
ADD #SINCOSTAB
TBLR CosAngle
B SinCosCalEnd
QUADRANT2 LACC #1800
sub Angle
ADD #SINCOSTAB
TBLR SinAngle
LACC Angle
SUB #900
ADD #SINCOSTAB
TBLR CosAngle
lacc CosAngle
neg
sacl CosAngle
B SinCosCalEnd
QUADRANT3 LACC Angle
sub #1800
ADD #SINCOSTAB
TBLR SinAngle
lacc SinAngle
neg
sacl SinAngle
LACC #2700
SUB Angle
ADD #SINCOSTAB
TBLR CosAngle
lacc CosAngle
neg
sacl CosAngle
B SinCosCalEnd
QUADRANT4 LACC #3600
sub Angle
ADD #SINCOSTAB
TBLR SinAngle
lacc SinAngle
neg
sacl SinAngle
LACC Angle
SUB #2700
ADD #SINCOSTAB
TBLR CosAngle
B SinCosCalEnd
SinCosCalEnd nop
.ENDM
;=============================================================================
;===========================================================
Store1 .macro
MAR *,AR1
MAR *+
SST #1,*+
SST #0,*+
SACH *+
SACL *+
PAC
MPYK #1
SPL *+
SACH *+
SACL *+
SAR AR4,*+ ;for scope
SAR AR2,* ;for scope
.endm
;===========================================================
Restore1 .macro
MAR *,AR1
lar AR2,*- ;for scope
lar AR4,*- ;for scope
LT *-
MPYK #1
LPH *-
LT *-
LACl *-
ADD *-,16
LST #0,*-
LST #1,*-
.endm
;===========================================================
Store3 .macro
MAR *,AR1
MAR *+
SST #1,*+
SST #0, *+
SACH *+
SACL *+
SAR AR2,*+ ;for scope
SAR AR4,* ;for scope
.endm
;===========================================================
Restore3 .macro
MAR *,AR1
lar AR4,*- ;for scope
lar AR2,*- ;for scope
LACL *-
ADDH *-
LST #0, *-
LST #1, *-
.endm
;=======================================================================
;软件计时模块
;功能:S01每S01_K次中断(0.1s)有一次过零
; S01每过一次零Clock增加1
;-----------------------------------------------------------------------
Clock_S01 .macro S01,S01_K,Clock
ldp #S01/128 ;200H-027FH
LACL S01
ADD #1
SACL S01
SUB #S01_K
BCND S01OUT,LEQ
splk #0,S01 ;S01复位
ldp #SAH_k/128 ;示波器变量区
lacc Clock,16 ;软件时钟用于定时触发等
add #1<<1,15
sach Clock
S01OUT NOP
.endm
;===========================================================
ReadCurrent .MACRO
ADLOOPI: LDP #ADCTRL1/128
BIT ADCTRL1,7
BCND ADLOOPI, NTC ;查询IA和ib是否转换完毕
Current_scale ADCFIFO1,kia,ia_offset,IA,TEMP
Current_scale ADCFIFO2,kib,ib_offset,IB,TEMP
LDP #IA/128
LACC IA
ADD IB
NEG
SACL IC ;IC=-(IA+IB)
lacc IA ;电机过流保护
abs
sub #8192
bcnd I_abn,GT
lacc IB
abs
sub #8192
bcnd I_abn,GT
lacc IC
abs
sub #8192
bcnd I_abn,GT
b I_end
I_abn STOP
ALARM
ldp #4
splk #1,I_FAIL
LDP #232
LACC EVIFRA
SACL EVIFRA
Restore1 ;恢复现场
CLRC INTM
RET
I_end nop
.ENDM
;===========================================================
Current_scale .MACRO ADCFIFO1,kia,ia_offset,IA,TEMP
LDP #ADCFIFO1/128
LACC ADCFIFO1,10
and #3FFH,16
sub #512*2,15
ldp #TEMP/128
sach TEMP
lt TEMP
sdp TEMP,kia
mpy kia ;2^22
pac
sdp kia,ia_offset
SUB ia_offset,(22-13)
sdp ia_offset,IA
sach IA,7 ;AD结果减512不会大于512,故不会溢出
.ENDM
;===========================================================
ReadVdcVcap .macro ;用于不检测线电压的接法
ADLOOPVDCCAP: LDP #0E0H
BIT ADCTRL1,7
BCND ADLOOPVDCCAP, NTC
VDC_sacle ADCFIFO1,kvdc,VDC,TEMP
LDP #0E0H
LACC ADCFIFO2,10
AND #3FFH,16
LDP #4 ;200H-027FH
SACH vcap
ldp #4 ;电机过压保护
lacl VDC
sub #17241 ;220*1.732*1.414*2^5=17241.3
bcnd V_abn,GT
b V_end
V_abn STOP
ALARM
ldp #4
splk #1,V_FAIL
LDP #232
LACC EVIFRA
SACL EVIFRA
Restore1 ;恢复现场
CLRC INTM
RET
V_end nop
.endm
;===========================================================
;===========================================================
VDC_sacle .macro ADCFIFO1,kvdc,VDC,TEMP
LDP #ADCFIFO1/128
LACC ADCFIFO1,10
AND #3FFH,16
LDP #TEMP/128
SACH TEMP ;temp中是10位AD量
LT TEMP
sdp TEMP,kvdc
mpy kvdc ;2^14 lyh2002.9.2
pac
sfl ;2^15 lyh2002.9.2
sfl ;2^16 lyh2002.9.3
sdp kvdc,VDC
sach VDC,5 ;2^5
.endm
;===========================================================
;=========================================================================
sdp .macro data_last,data
.if (data_last/128!=data/128)
ldp #data/128
.endif
.endm
;=========================================================================
;==========================================================
dq_ab .macro di,qi,sini,cosi,ai,bi
ab_dq qi,di,sini,cosi,bi,ai
.endm
;=========================================
;=========================================
; vd = va*cos(angle)+vb*sin(angle)
; vq =-va*sin(angle)+vb*cos(angle)
; (DP自动切换)
; 要求 PM=0
;-----------------------------------------
ab_dq .macro a,b,sin,cos,d,q
ldp #b/128
lt b
sdp b,sin
mpy sin
sdp sin,a
ltp a ;b*sin->acc,a->TREG
sdp a,cos
mpy cos ;a*cos->PREG
sdp cos,sin
mpya sin ;a*cos+b*sin->acc,a*sin->PREG
add #1,14
sdp sin,d
sach d,1 ;a*cos+b*sin->d
lacl #0
sdp d,b
lt b
sdp b,cos
mpys cos ;-a*sin->acc,b*cos->PREG
apac ;-a*sin+b*cos->acc
add #1,14
sdp cos,q
sach q,1 ;-a*sin+b*cos->q
.endm
;=========================================
;=========================================
;(DP自动切换)
;要求:pm=0
;-----------------------------------------
anb_abc .macro al,be,a,b,c,temp
ldp #al/128
lacl al
sdp al,a
sacl a
sdp a,be
lt be
sdp be,temp
splk #-28378,temp ;sqrt(3),2^14
mpy temp
pac
sdp temp,al
sub al,14
add #1,14
sdp al,b
sach b,1
pac
neg
sdp b,al
sub al,14
add #1,14
sdp al,c
sach c,1
.endm
;=========================================
;=====================================================================
ms_delay .macro ms_num_k,temp
ldp #temp/128
splk #20000,temp
lacc #ms_num_k
ms_LOOP RPT temp ;20000 nop = 1mS
NOP ;1 cycle
sub #1
bcnd ms_LOOP,gt
.endm
;=========================================================================
;=============================================================================
; 加减速模块
; tinc,tdec的含义:是w变化1(0-wn)所需要的时间(范围:0-2000秒, 定标:2^4)
; 有待修改:
; 1.将tinc,tdec在主程序中转化为单位时间频率的变化量.
; 2.当时间改为实际值后,时间的基值将不参与运算
; 3.在移位的地方需要的时候要采用条件汇编
; 4.四舍五入
; 5.注意除法分子要小于分母(TC<tdec)
;----------------------------------------------------------------------------
wincdec .macro w,w_l,wobj,w_shift,tinc,tdec,TC,tc_shift,temp1
ldp #w/128
lacc w ;w_shift
sdp w,wobj
sub wobj ;w_shift
BCND STABLE?,EQ
BCND INC?,LT
DEC?: sdp wobj,TC
lacc TC ;2^tc_shift
sdp TC,tdec
rpt #15
subc tdec ;2^4
sdp tdec,temp1
sacl temp1
lt temp1
sdp temp1,wn
mpy wn ;2^w_shift
pac ;2^(tc_shift-4+w_shift)
rpt #((tc_shift-4+w_shift)-(w_shift+16)-1)
sfr
neg
sdp wn,w
add w,16
adds w_l
sach w
sacl w_l
sdp w,wobj
sub wobj,16
bcnd INCDECOUT?,geq
b stopincdec?
INC?: sdp wobj,TC
lacc TC
sdp TC,tinc
rpt #15
subc tinc
sdp tinc,temp1
sacl temp1
lt temp1
sdp temp1,wn
mpy wn ;2^w_shift
pac ;2^(tc_shift-4+w_shift)
rpt #((tc_shift-4+w_shift)-(w_shift+16)-1)
sfr
sdp wn,w
add w,16
adds w_l
sach w
sacl w_l
sdp w,wobj
sub wobj,16
bcnd INCDECOUT?,leq
b stopincdec?
stopincdec? lacl wobj
sdp wobj,w
sacl w
splk #0,w_l
B INCDECOUT?
STABLE?: nop
B INCDECOUT?
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -