📄 svpwm.asm
字号:
;=====================================================================
; Filename : SVPWM.asm
; Module names: SVPWM
; Initialization routines: SVPWM_INIT
; Description: 判断扇区,做SVPWM计算,
; 给出CMPR1_BUFF,CMPR2_BUFF,(两个比较寄存器的值),ACTRA_BUFF(空间矢量的扇区值),
; 为下一周期做准备。
; input:Ualfa0,Ubeta0(Q11)
; output:CMPR1_BUFF,CMPR2_BUFF,ACTRA_BUFF
;
; Modify: 2004.6.18
;=====================================================================
.include "f2407.h"
.global SVPWM,SVPWM_INIT ;function call
.global PROTECT ;PROTECT function call
.global Ualfa0,Ubeta0,SECTOR
.global SVPWM_C1,SVPWM_C2
.global CMPR1_BUFF,CMPR2_BUFF,ACTRA_BUFF
.global TEMP,TEMP1
.global A,B,C,TX1,TX2
;=====================================================================
SVPWM_INIT:
;=====================================================================
LDP #DP_DATA
SPLK #3648,SVPWM_C1 ;按照Udc=514v时表示为22000.
SPLK #2106,SVPWM_C2
; SPLK #3211,SVPWM_C1 ;按照Udc=514v时表示为25000.
; SPLK #1854,SVPWM_C2
; SPLK #2675,SVPWM_C1 ;按照Udc=514v时表示为30000.
; SPLK #1545,SVPWM_C2
; SPLK #2450,SVPWM_C1 ;SVPWM_C1=sqrt(3/8)*Tpwm/Udc,按照Udc=514v时表示为32767(7FFFH)最大.
; SPLK #1414,SVPWM_C2 ;SVPWM_C2=sqrt(1/8)*Tpwm/Udc,Tpwm=FA0H(半个PWM周期)
RET
;=====================================================================
SVPWM:
;=====================================================================
;----------------------------------------------------------------
;Name : 计算扇区。
;Description: 根据《电力电子技术》浙大人的文章。
;Para : input:Ualfa0,Ubeta0
; output:SECTOR(扇区号)
;Func : Calculate sector
;Modify : 2004.6.18
;---------------------------------------------------------------
SPM 1
SETC SXM
;----------------------------------------
;首先计算A,B,C
LDP #DP_DATA
LT Ualfa0
SPLK #376CH,TEMP ;sqrt(3)/4=0.433=376CH(Q15)
MPY TEMP
SPH TEMP ;TEMP=sqrt(3)/4*Ualfa0
LACC Ubeta0
SFR
SFR
NEG
SACL TEMP1 ;TEMP1= -Ubeta0/4
;----------------------------------------
LACC Ubeta0
BCND A1,GT
SPLK #0,A
B START_B
A1:
SPLK #1,A
START_B: ;计算B
LACC TEMP1
ADD TEMP
BCND B1,GT
SPLK #0,B
B START_C
B1:
SPLK #2,B
START_C: ;计算C
LACC TEMP1
SUB TEMP
BCND C1,GT
SPLK #0,C
B CAL_S
C1:
SPLK #4,C
;----------------------------------------
CAL_S:
LACC A
ADD B
ADD C
SACL TEMP ;TEMP=A+2B+4C
MAR *,AR0
LAR AR0,TEMP ;AR0=A+2B+4C
;----------------------------------------
;开始判断扇区
SBRK #1 ;AR0=AR0-1
BANZ SECTOR_AR0_2
LACC Ualfa0 ;扇区II
BCND SECTOR_2,GEQ
SPLK #3,SECTOR
B START_CAL_T
SECTOR_2:
SPLK #2,SECTOR
B START_CAL_T
SECTOR_AR0_2:
BANZ SECTOR_AR0_3
SPLK #8,SECTOR ;扇区VI
B START_CAL_T
SECTOR_AR0_3:
BANZ SECTOR_AR0_4
SPLK #1,SECTOR ;扇区I
B START_CAL_T
SECTOR_AR0_4:
BANZ SECTOR_AR0_5
SPLK #5,SECTOR ;扇区IV
B START_CAL_T
SECTOR_AR0_5:
BANZ SECTOR_AR0_6
SPLK #4,SECTOR ;扇区III
B START_CAL_T
SECTOR_AR0_6:
BANZ SECTOR_ERROR
LACC Ualfa0 ;扇区V
BCND SECTOR_6,GEQ
SPLK #7,SECTOR
B START_CAL_T
SECTOR_6:
SPLK #6,SECTOR
B START_CAL_T
;----------------------------------------
SECTOR_ERROR:
SPM 0
CALL PROTECT ;加载保护模块
;----------------------------------------------------------------
;Name : 计算T1,T2时间(根据清华大学电机系文章。)
;Para : input:Ualfa0,Ubeta0
; output: CMPR1_BUFF,CMPR2_BUFF,(两个比较寄存器的值),ACTRA_BUFF(空间矢量的扇区值)
; constant: SVPWM_C1(Q15),SVPWM_C2(Q15)
;Modify : 2004.6.18
;-----------------------------------------------------------------
START_CAL_T:
SPM 1
;----------------------------------------
;先计算T1X/2,T2X/4.分别存在TX1,TX2里面.
;TX1=T1X/2=sqrt(3/8)*ABS(Ualfa0)*Tpwm/Udc=SVPWM_C1*ABS(Ualfa0)
LACC Ualfa0
ABS
SACL TEMP
LT TEMP
MPY SVPWM_C1
SPH TX1
;TX2=T2X/4=sqrt(1/8)*ABS(Ubeta0)*Tpwm/Udc=SVPWM_C2*ABS(Ubeta0)
LACC Ubeta0
ABS
SACL TEMP
LT TEMP
MPY SVPWM_C2
SPH TX2
;----------------------------------------
;计算T1/2,(T1+T2)/2,并确定下一周期ACTRA的值。赋值CMPR1_BUFF,CMPR2_BUFF,ACTRA_BUFF。
LDP #DP_DATA
LAR AR0,SECTOR
SBRK #1 ;AR0-1
BANZ NOT1 ;指令执行之后,AR0=AR0-1
;扇区I
SPLK #1100011001100110B,ACTRA_BUFF ;逆时针转,空间矢量100
LACC TX1
SUB TX2
SACL CMPR1_BUFF ;T1结果
LACC TX1
ADD TX2
SACL CMPR2_BUFF ;T2结果
B END_CAL_T ;结束计算
;----------------------
NOT1:
BANZ NOT2 ;AR0-2
;扇区II的第一象限
SPLK #1110011001100110B,ACTRA_BUFF ;逆时针转,空间矢量110
LACC TX1
ADD TX2
SACL CMPR1_BUFF ;T1结果
LACC TX2
ADD TX2
SACL CMPR2_BUFF ;T2结果
B END_CAL_T ;结束计算
;----------------------
NOT2:
BANZ NOT3 ;AR0-3
;扇区II的第二象限
SPLK #1110011001100110B,ACTRA_BUFF ;逆时针转,空间矢量110
LACC TX2
SUB TX1
SACL CMPR1_BUFF ;T1结果。
LACC TX2
ADD TX2
SACL CMPR2_BUFF ;T2结果
B END_CAL_T ;结束计算
;----------------------
NOT3:
BANZ NOT4 ;AR0-4
;扇区III
SPLK #1010011001100110B,ACTRA_BUFF ;逆时针转,空间矢量010
LACC TX2
ADD TX2
SACL CMPR1_BUFF ;T1结果
LACC TX1
ADD TX2
SACL CMPR2_BUFF ;T2结果
B END_CAL_T ;结束计算
;----------------------
NOT4:
BANZ NOT5 ;AR0-5
;扇区IV
SPLK #1011011001100110B,ACTRA_BUFF ;逆时针转,空间矢量011
LACC TX1
SUB TX2
SACL CMPR1_BUFF ;T1结果。
LACC TX1
ADD TX2
SACL CMPR2_BUFF ;T2结果
B END_CAL_T ;结束计算
;----------------------
NOT5:
BANZ NOT6 ;AR0-6
;扇区V的第四象限
SPLK #1001011001100110B,ACTRA_BUFF ;逆时针转,空间矢量001
LACC TX2
SUB TX1
SACL CMPR1_BUFF ;T1结果
LACC TX2
ADD TX2
SACL CMPR2_BUFF ;T2结果
B END_CAL_T ;结束计算
;----------------------
NOT6:
BANZ NOT7 ;AR0-7
;扇区V的第三象限
SPLK #1001011001100110B,ACTRA_BUFF ;逆时针转,空间矢量001
LACC TX1
ADD TX2
SACL CMPR1_BUFF ;T1结果
LACC TX2
ADD TX2
SACL CMPR2_BUFF ;T2结果
B END_CAL_T ;结束计算
;----------------------
NOT7:
;扇区VI
SPLK #1101011001100110B,ACTRA_BUFF ;逆时针转,空间矢量101
LACC TX2
ADD TX2
SACL CMPR1_BUFF ;T1结果
LACC TX1
ADD TX2
SACL CMPR2_BUFF ;T2结果
B END_CAL_T ;结束计算
;----------------------------------------
END_CAL_T:
SPM 0
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -