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

📄 soft_svpwm.asm

📁 《DSP原理及电机控制应用-基于240x系列》2008新购的DSP原理及电机控制应用
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;--------------------------------------------------------------------------------------------------------
; 重庆大学――美国德州仪器数字信号处理方案实验室
; 函数名:void soft_svpwm(softsvpwm *p, int u_alfa, int u_beta)
; 函数功能:本函数根据给定电压量,计算生成空间矢量PWM所需的占空比,
;	最终利用TMS320LF2407内部的全比较模块输出给定电压。
;	该给定电压由u_alfa、u_beta表示。
; 函数参数:
;	softsvpwm *p; //softsvpwm结构体类型指针,指向输出结构体
;	int u_alfa;   //Q12,给定参考电压alfa分量
;	int u_beta;   //Q12,给定参考电压beta分量
; 输出结构体:	
;	typedef struct
;		{ int Vdcinvt; //Q0,占空比饱和系数
;		  int PWMPRD;  //Q0,周期寄存器TxPR的值
;		  int va;      //Q0,比较寄存器CMPR4的值
;		  int vb;      //Q0,比较寄存器CMPR5的值
;		  int vc;      //Q0,比较寄存器CMPR6的值
;		}softsvpw
; 相关系数的确定:
; 	Vdcinvt=SQRT3(Vb*T_pwm)/Vdc,其中,T_pwm为计数器
;	周期寄存器值,Vdc为逆变器母线电压,Vb为待输出相电
;	压峰值,SQRT3*Vb为待输出线电压峰值,故可以设SQRT3*Vb/Vdc=k,
;	则Vdcinvt=k*T_pwm,故占空比饱和时可以认为以下关系成立:
;		(t1+t2)*Vdcinvt>T_pwm
;	即:	(t1+t2)*k*T_pwm>T_pwm
;	其中,t1,t2代表基本矢量作用时间对应的占空比,k=<1
; 本子程序的函数声明和机构体的定义都包含在softsvpwm_c.h文件中,用户
;	使用时只需要使用#include指令将该文件包含到project中即可。
; 在调用本子程序前,用户还需要对输出结构体中的变量Vdeinvt和PWMPRD
;	进行初始化。

; 2002.7.8.
;--------------------------------------------------------------------------------------------------------
		.def _soft_svpwm
		.global _soft_svpwm
SQRT32	.set 6edah				;(sqrt3)/2 (Q15)
_soft_svpwm_frame .set 4h
		.text                                               
_soft_svpwm  
		POPD	*+
		SAR		AR0,*+
		SAR		AR1,*
		LAR		AR0,#_soft_svpwm_frame
		LAR		AR0,*0+,AR0
		LAR		AR2,*,AR2			;C COMPATIBLE
									;STACK:u_beta/u_alfa/ *p/address/AR0/AR1
									;ARP:AR2, AR0:AR1, AR2:AR1
		SETC	SXM					;SIGN EXTENSION MODE ENABLE
		SBRK	#3
		LAR		AR3,*-,AR0			;ARP:AR0, AR0:AR1, AR2:u_alfa, AR3:Vdcinvt
;----------------------------------------------------------------------------------------
;calculate vref1, -vref2 and -vref3
;----------------------------------------------------------------------------------------
		LACC	#SQRT32
		SACL	*					;STACK:u_beta/u_alfa/ *p/address/AR0/0x6EDA
		LT		*,AR2               ;0x6EDA-->TREG
									;ARP:AR2, AR0:0x6EDA, AR2:u_alfa, AR3:Vdcinvt
		MPY		*-					;0x6EDA*u_alfa
									;ARP:AR2, AR0:0x6EDA, AR2:u_beta, AR3:Vdcinvt
		LACC	*,14,AR0			;u_beta/2-->ACC
									;ARP:AR0, AR0:0x6EDA, AR2:u_beta, AR3:Vdcinvt  
		NEG
		SACH	*+,2				;STACK:u_beta/u_alfa/ *p/address/AR0/-vref1/unknow 
									;ARP:AR0, AR0:unknow, AR2:u_beta, AR3:Vdcinvt
		APAC	                    
		NEG                         ;u_beta/2-0x6EDA*u_alfa
		SACH	*+,1,AR2			;STACK:u_beta/u_alfa/ *p/address/AR0/-vref1/-vref2/unknow 
									;ARP:AR2, AR0:unknow, AR2:u_beta, AR3:Vdcinvt
		LACC	*,14,AR0    		;u_beta/2-->ACC 
		APAC						;u_alfa*0x6eda+u_beta/2
		SACH	*,1,AR3				;STACK:u_beta/u_alfa/ *p/address/AR0/-vref1/-vref2/-vref3 
									;ARP:AR3, AR0:-vref3, AR2:u_beta, AR3:Vdcinvt
;---------------------------------------------------------------------------------------------
;calculate X, Y and Z
;---------------------------------------------------------------------------------------------
		SPM		2					;PREG LEFT SHIFT 4
		LT		*+,AR0
		MPY		*					;Y=Vdcinvt*(-vref3)
		SPH		*-					;STACK:u_beta/u_alfa/ *p/address/AR0/-vref1/-vref2/Y 
									;ARP:AR0, AR0:-vref2, AR2:u_beta, AR3:PWMPRD
		MPY		*                   ;Z=Vdcinvt*(-vref2)
		SPH		*-,AR2				;STACK:u_beta/u_alfa/ *p/address/AR0/-vref1/Z/Y 
									;ARP:AR2, AR0:-vref1, AR2:u_beta, AR3:PWMPRD
		MPY		*                   ;X=Vdcinvt*(vref1)
		SPH		*,AR0				;STACK:X/u_alfa/ *p/address/AR0/-vref1/Z/Y 
									;ARP:AR0, AR0:-vref1, AR2:X, AR3:PWMPRD		
		SPM		1
;---------------------------------------------------------------------------------
;calculate sector
;---------------------------------------------------------------------------------		
		LACC	#0					
		BIT		*+,0				
		BCND	softsvpwm1,NTC
		ADD		#1					;if vref1>0, then sector=sector+1
softsvpwm1
		BIT		*+,0
		BCND	softsvpwm2,NTC
		ADD		#2 					;if vref2>0, then sector=sector+2
softsvpwm2                                                            
		BIT		*+,0
		BCND	softsvpwm3,NTC
		ADD		#4  				;if vref3>0, then sector=sector+4
									;STACK:X/u_alfa/ *p/address/AR0/-vref1/Z/Y/unknow 
	                           		;ARP:AR0, AR0:unknow, AR2:X, AR3:PWMPRD 
softsvpwm3
		ADD		#sectable
		TBLR	*
		LACC	*-					;STACK:X/u_alfa/ *p/address/AR0/-vref1/Z/Y/sector_srx 
									;ARP:AR0, AR0:Y, AR2:X, AR3:PWMPRD
		BACC 
;--------------------------------------------------------------------------------------
;duty ratio calculation
;--------------------------------------------------------------------------------------
mute
		LACC	#0
		MAR		*,AR3				;ARP:AR3, AR0:Y, AR2:X, AR3:PWMPRD
		MAR		*+
		SACL	*+
		SACL	*+
		SACL	*,AR1				;va=0, vb=0, vc=0
									;ARP:AR1, AR0:Y, AR2:X, AR3:vc
		B		softsvpwm_end				

sector_sr1
		LACC	*-                  ;sector=1, t1=Z, t2=Y
		ADD		*-
		SACL	*+,AR3				;STACK:X/u_alfa/ *p/address/AR0/t1+t2/t1/t2/sector_srx 
									;ARP:AR3, AR0:t1, AR2:X, AR3:PWMPRD
		SUB		*,AR0 				;sector=1, t1=Z, t2=Y, t1+t2-PWMPRD
									;ARP:AR0, AR0:t1, AR2:X, AR3:PWMPRD
		BCND	softsvpwm4,LEQ
		MAR		*-,AR3				;ARP:AR3, AR0:t1+t2, AR2:X, AR3:PWMPRD 
        LACC	*,15,AR0	 	  	;SATURATION
        							;ARP:AR0 
        RPT		#15
        SUBC	*					;CALCULATE PWMPRD/t1+t2, Q15
        SACL	* 				    ;STACK:X/u_alfa/ *p/address/AR0/(PWMPRD/t1+t2)/t1/t2/sector_srx 
									;ARP:AR0, AR0:(PWMPRD/t1+t2), AR2:X, AR3:PWMPRD        
        LT		*+               	;(PWMPRD/t1+t2)-->TREG
        							;ARP:AR0, AR0:t1, AR2:X, AR3:PWMPRD
        MPY		*					;AR0:t1  					
        SPH		*+					;t1=t1*T_pwm/(t1+t2)
							        ;STACK:X/u_alfa/ *p/address/AR0/(PWMPRD/t1+t2)/t1/t2/sector_srx 
									;ARP:AR0, AR0:t2, AR2:X, AR3:PWMPRD
        MPY		*
        SPH		*-               	;t2=t2*T_pwm/(t1+t2)
        							;STACK:X/u_alfa/ *p/address/AR0/(PWMPRD/t1+t2)/t1/t2/sector_srx 
									;ARP:AR3, AR0:t1, AR2:X, AR3:PWMPRD 
softsvpwm4
		LACC	*+,15				
		ADD		*-,15,AR3
		SUB		*+,15				
		NEG			                ;taon=PWMPRD-t1-t2 
									;ARP:AR3, AR0:t1, AR2:X, AR3:va
		MAR		*+					;AR3:vb
		SACH	*-,AR0				;vb=taon=(PWMPRD-t1-t2)/2
									;ARP:AR0, AR0:t1, AR2:X, AR3:va
		ADD		*+,16,AR3			;va=tbon=taon+t1	
		SACH	*+					;ARP:AR3, AR0:t2, AR2:X, AR3:vb
		MAR		*+,AR0				;ARP:AR0, AR0:t2, AR3:vc
		ADD		*,16,AR3
		SACH	*,AR1				;vc=tcon=tbon+t2
									;ARP:AR1, AR0:t2, AR3:vc
		B		softsvpwm_end

sector_sr2              			
		LACC	*+,AR2 				;sector=2, t1=Y, t2=-X
									;STACK:-t2/u_alfa/ *p/address/AR0/-vref1/Z/t1/sector_srx 
									;ARP:AR2, AR0:sector_srx, AR2:-t2, AR3:PWMPRD 
		SUB		*,AR0               ;t1-(-t2)
		SACL	*-,AR3			   	;STACK:-t2/u_alfa/ *p/address/AR0/-vref1/Z/t1/t1+t2 
									;ARP:AR3, AR0:t1, AR2:-t2, AR3:PWMPRD
		SUB		*,AR0				;t1+t2-PWMPRD							
		BCND	softsvpwm5,LEQ
		MAR		*+,AR3				;ARP:AR3, AR0:t1+t2, AR2:-t2, AR3:PWMPRD 
        LACC	*,15,AR0	 	  	;SATURATION
        							;ARP:AR0 
        RPT		#15
        SUBC	*					;CALCULATE PWMPRD/t1+t2, Q15
        SACL	* 				    ;STACK:-t2/u_alfa/ *p/address/AR0/-vref1/Z/t1/(PWMPRD/t1+t2) 
									;ARP:AR0, AR0:(PWMPRD/t1+t2), AR2:-t2, AR3:PWMPRD        
        LT		*-               	;(PWMPRD/t1+t2)-->TREG
        							;ARP:AR0, AR0:t1, AR2:-t2, AR3:PWMPRD
        MPY		*					;AR0:t1  					
		SPH		*,AR2		        ;STACK:-t2/u_alfa/ *p/address/AR0/-vref1/t1/Y/(PWMPRD/t1+t2) 
									;ARP:AR2, AR0:t1, AR2:-t2, AR3:PWMPRD
        MPY		*
        SPH		*,AR0		       	;t2=t2*PWMPRD/(t1+t2)
        							;STACK:-t2/u_alfa/ *p/address/AR0/(PWMPRD/t1+t2)/t1/Y/sector_srx 
									;ARP:AR0, AR0:t1, AR2:-t2, AR3:PWMPRD

softsvpwm5
		LACC	*,15,AR2
		SUB		*,15,AR3            ;t1-(-t2)
		SUB		*+,15				;taon=(PWMPRD-t1-t2)/2
									;ARP:AR3, AR0:t1, AR2:-t2, AR3:va  
		NEG
		SACH	*+,AR0				;va=taon
									;ARP:AR0, AR0:t1, AR2:-t2, AR3:vb
		ADD		*,16,AR3            ;tbon=taon+t1
		MAR     *+					;ARP:AR3, AR3:vc
		SACH	*-,AR2				;vc=tbon
									;AR3:vb
		SUB		*,16,AR3			;tcon=tbon-(-t2)
									;AR3:vb
		SACH	*,AR1				;vb=tcon
		B		softsvpwm_end               

sector_sr3

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -