?? 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 + -