📄 clark.asm
字号:
;=====================================================================
; Name : CLARK.asm
; Module Name : CLARK,CLARK_INIT
; Para : input:IA0,IB0 (Q12)
; output:Ialfa0,Ibeta0 (Q11)
; constant:CLARK_C1=sqrt(3/8)=0.61237=0x4E62(Q15),CLARK_C2=sqrt(1/2)=0.707106=0x5A82(Q15)
; Func : CLark Transform (3/2 Transform)
; Ialfa0 = sqrt(3/2) * IA0 = sqrt(3/8) * ( IA0 * 2 );( IA0 * 2 )相当于IA0值不变,Q格式从Q12变到Q11。
; Ibeta0 = sqrt(1/2) * ( IA0 + 2 * IB0 ) = sqrt(1/2) * ( (IA0/2+IB0) * 2 );同理( (IA0/2+IB0) * 2 )相当IB0右移一位再加IA0。
; Modify : 2004.6.16
;=====================================================================
.include "f2407.h"
.global CLARK,CLARK_INIT ;function call
.global IA0,IB0 ;input(Q12)
.global Ialfa0,Ibeta0 ;output(Q11)
.global TEMP
.global CLARK_C1 ;constant
.global CLARK_C2
;=====================================================================
CLARK_INIT:
;=====================================================================
; 赋值两个常数
LDP #DP_DATA
SPLK #4E62H,CLARK_C1
SPLK #5A82H,CLARK_C2
RET
;=====================================================================
CLARK:
;=====================================================================
SPM 1 ;相乘产生两个符号位,左移一位去掉。
SETC SXM ;SXM=1
;---------------------------------------------------------------
; Ialfa0 = sqrt(3/2) * IA0 = sqrt(3/8) * ( IA0 * 2 )
LDP #DP_DATA ;这一个页面存放SVPWM相关的数据。
LT IA0
MPY CLARK_C1
SPH Ialfa0 ;存Ialfa0结果
;---------------------------------------------------------------
; Ibeta0 = sqrt(1/2) * ( IA0 + 2 * IB0 ) = sqrt(1/2) * ( (IA0/2+IB0) * 2 )
LACC IA0
SFR ;算术右移,IA0/2
ADD IB0 ;按matlab计算这个值不会溢出16位。
SACL TEMP
LT TEMP
MPY CLARK_C2
SPH Ibeta0 ;存Ibeta0结果
;---------------------------------------------------------------
SPM 0 ;恢复PM值为0
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -