📄 newscope.asm
字号:
ldp #4
splk #18704,kia ;scale=2^23
splk #18704,kib ;scale=2^23
splk #25367,kvdc ;25367=523V/675.6*2^15
splk #QEP_num,QEPCNT
LAR AR1,#60H ;用于中断环境保存的栈底
setc OVM
setc sxm ;sign extension mode
;==================================================================
; ENABLE Serial Rx INTERRUPT, and begin the Scope Initial Loop.
;If (MultiSingle!=0ffffh && StartTime!=0ffffh) then Break
;-------------------------------------------------------------------
LDP #0E8H
splk #0001H, EVIMRA ;ENABAL PDPINT
LDP #00H
splk #01H, IMR ;ENABLE XINT1(INT1)
CLRC INTM
;==================================================================
; ENABLE USED INTERRUPT
;-------------------------------------------------------------------
LDP #0E8H
splk #1H, EVIMRB
splk #0201H, EVIMRA ;ENABAL T1 UNDERFLAW 和PDPINT
LDP #00H
splk #03H, IMR ;ENABLE TIMER1 INTERRUPT(INT2)
;和XINT1(INT1)
CLRC INTM
;==================================================================
MENU NOP
B MENU
;==================================================================
;中断2:定时器1下溢中断和过流保护中断
GISR2 MAR *,AR1
MAR *+
SST #1,*+
SST #0, *+
SACH *+
SACL *
LDP #232
LACC EVIVRA
SUB #29H
BCND TIM,EQ
B PDP
TIM
LACC EVIFRA
SACL EVIFRA
b TIMER1 ;跳至定时器中断服务程序
PDP LACC EVIFRA ;过流保护处理
SACL EVIFRA ;清中断标志
LDP #4 ;200H-027FH
STOP
LDP #4
splk #1,FailFlag
ALARM
Y1ON
MAR *,AR1
LACL *-
ADDH *-
LST #0, *-
LST #1, *-
CLRC INTM
RET
;================================================================================
;定时器1下溢中断
TIMER1:
CLRC INTM
;-------------------------------------------------------------------
; A/D START FOR ia AND ic
;Scale of current=2^10
;i(scaled)=AD*18.26601308589056*(2^10/2^10)=AD*18704.4/2^10
;-------------------------------------------------------------------
LDP #0E0H
splk #1011100100100101B, ADCTRL1 ;启动电流采样
ADLOOP1 NOP
LDP #0E0H
BIT ADCTRL1,7
BCND ADLOOP1, NTC ;查询ia和ib是否转换完毕
LACL ADCFIFO2
rpt #5
sfr
LDP #4 ;200H-027FH
sacl lia
SACL TEMP
lt kia
mpy TEMP
pac
sach TEMP,6
lacl TEMP
sub #ia_OFFSET_K
sacl ia ;ia的6.10f(实际值)
LDP #0E0H
LACL ADCFIFO1
rpt #5
sfr
LDP #4 ;200H-027FH
sacl lib
SACL TEMP
lt kib
mpy TEMP
pac
sach TEMP,6
lacl TEMP
sub #ib_OFFSET_K
sacl ib ;ib的6.10f(实际值)
LACC ia
ADD ib
NEG
SACL ic ;ic=-(ia+ib)
;------------------------------------------------------------------
;第4路电压及直流母线电压检测及过压保护
;------------------------------------------------------------------
STARTADVDCCAP LDP #0E0H
splk #1011100100110111B, ADCTRL1 ;启动vdc,VCAP的采样
ADLOOPVDCCAP: NOP
LDP #0E0H
BIT ADCTRL1,7
BCND ADLOOPVDCCAP, NTC
LACL ADCFIFO1
rpt #5
sfr
LDP #4 ;200H-027FH
sacl lvdc
VDC_AD SACL TEMP
LT kvdc
mpy TEMP
pac
sach vdc,6 ;vdc的实际值*2^5
;--------------------------------------------------------------------
;过压检测及保护
LACL vdc
SUB #VDCMAX_K
JOE BCND NO_OE,lt ;判断是否过压
OE: STOP ;若有过压则自由停车
LDP #4 ;200H-027FH
splk #2,FailFlag
NO_OE NOP
;--------------------------------------------------------------------
;第四路信号检测
LDP #0E0H
LACL ADCFIFO2
RPT #5
SFR
LDP #4 ;200H-027FH
IDC_AD SACL vcap
;--------------------------------------------------------------------
;码盘速度检测
ldp #4
lacl QEPCNT
sub #1
sacl QEPCNT
bcnd QEPend,neq
read_QEP ldp #0E8H
lacc T3CNT
splk #0000h,T3CNT
ldp #4
sacl spdQEP
ldp #4
splk #QEP_num,QEPCNT
splk #5,TEMP
LT TEMP
mpy spdQEP
pac
sacl n
QEPend nop
;------------------------------------------------------------------
;------------------------------------------------------------------
* Clarke transformation
* (a,b) -> (alfa,beta)
* isalfa = ia
* isbeta = (2 * ib + ia) / sqrt(3)
;------------------------------------------------------------------
ldp #4
lacc ia
sacl isalfa ;isalfa 3.13 format
lacc ib,1 ;isbeta = (2 * ib + ia) / sqrt(3)
add ia
sacl temp3
lt temp3
mpy #SQRT3inv ;SQRT3inv = (1 / sqrt(3)) = 093dh
;4.12 format = 0.577350269
pac
sach isbeta,4 ;isbeta 3.13 format
;================================================================
;直角坐标-极坐标变换
;Amplitude,SinTheta,CosTheta的计算
;(ValX,ValY)--->(Amplitude,SinTheta,CosTheta,Theta)
;================================================================
setc sxm
;------------------------------------------------------------------
;求角度的正余弦值 (Angle)--->(CosAngle,SinAngle)
SinCosAngle
;------------------------------------------------------------------
ldp #4
splk #0,Vsd_ref ;#0CCDH,Vsd_ref ;0
splk #4096,Vsq_ref ;#099AH,Vsq_ref ;1
;------------------------------------------------------------------
;V/f控制环节
;------------------------------------------------------------------
;(Vsd_ref*=F/18),(Vsq_ref*=F/18)
;------------------------------------------------------------------
VF ldp #4
splk #18,TEMP
LT f
MPY Vsd_ref
pac
rpt #15
subc TEMP
SACL Vsd_ref
LT f
MPY Vsq_ref
pac
rpt #15
subc TEMP
SACL Vsq_ref
;------------------------------------------------------------------
;加斩波直流电压测量定子电阻和导线电阻
; splk #0000H,Vsd_ref
; splk #0200H,Vsq_ref
;------------------------------------------------------------------
; 反park转换(d,q) -> (alfa,beta)
; vSal_ref = Vsd_ref * cos(Angle) - vSqref * sin(Angle)
; vSbe_ref = Vsd_ref * sin(Angle) + vSqref * cos(Angle)
;
; vSal_ref,vSbe_ref -----4.12 format
; sin(Angle),cos(Angle)--2.14 format
;------------------------------------------------------------------
LT Vsd_ref ;4.12 format
MPY CosAngle ;2.14 format
PAC
SACH TEMP,2
LT Vsq_ref ;4.12 format
MPY SinAngle
PAC
SACH TEMP1,2 ;4.12 format
MPY CosAngle
PAC
SACH TEMP2,2
LACL TEMP
SUB TEMP1
SACL Vsalfa_ref ;得到4.12 FORMAT的Vsalfa_ref
LACC #0 ;
LT Vsd_ref ;4.12 format
MPY SinAngle ;2.14 format
PAC
SACH TEMP,2
LACL TEMP
ADD TEMP2
SACL Vsbeta_ref ;得到4.12 format的Vsbeta_ref
;------------------------------------------------------------------
;------------------------------------------------------------------
;空间矢量模块
;(Vsalfa_ref,Vsbeta_ref,vdc)--->(SVPWM发出)
;------------------------------------------------------------------
SVPWM
NOPWM NOP
;------------------------------------------------------------------
;Angle+=f
;------------------------------------------------------------------
ChangeAngle ldp #4
LACC Angle
ADD f
SACL Angle
sub #3600
BCND Skip_Dec,LT
sacl Angle
Skip_Dec nop
;--------------------------------------------------------------------
;==============================================
;加减速模块开始
; if (f=fobj) then goto stable
; else if(f>fobj) then 每TDEC次中断执行f=f-1
; else if(f<fobj) then 每TINC次中断执行f=f+1
;------------------------------------------
;输入变量:f,fobj,TINC,TDEC
;输出变量:f
;专用变量:IncDecCounter
;------------------------------------------
ldp #4 ;200H-027FH
LACL f
SUB fobj
nop
BCND STABLE,EQ
BCND INC,LT
DEC: LACL IncDecCounter
ADD #1
SACL IncDecCounter
SUB TDEC
BCND DECF,GEQ
B INCDECOUT
DECF: LACL f
SUB #1
SACL f
splk #0,IncDecCounter
B INCDECOUT
INC: LACL IncDecCounter
ADD #1
SACL IncDecCounter
SUB TINC
BCND INCF, GEQ
B INCDECOUT
INCF: LACL f
ADD #1
SACL f
splk #0,IncDecCounter
B INCDECOUT
STABLE: splk #0,IncDecCounter
INCDECOUT: NOP
;------------------------------------------
;----------------------------------------------------------------------------
;计算时间测定
;----------------------------------------------------------------------------
;环境恢复返回主程序
mar *,AR1
lacl *- ;Accu. restored for context restore
addh *-
lst #0,*-
lst #1,*-
clrc INTM
RET
;----------------------------------------------------------------------------
;TIMER1中断程序结束
;================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -