📄 soft_svpwm.asm
字号:
;--------------------------------------------------------------------------------------------------------
; 重庆大学――美国德州仪器数字信号处理方案实验室
; 函数名: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 + -