⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 svpwm.asm

📁 DSP关于F2407的实例程序
💻 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 + -