📄 clarke.asm
字号:
;=======================================================================
; 文件名: clarke.asm
;
; 模块名称: CLARKE
;
; 初始化程序名: CLARKE_INIT
;
; 公司: 达盛科技
;
; 功能描述: 三相静止坐标到两相正交静止坐标变换
; 从(a,b,c)坐标 -> (d,q) 坐标变换
; clark_d = clark_a
; clark_q = (2 * clark_b + clark_a) / sqrt(3)
;
; |~~~~~~~~~~~~~~~~~|
; clark_a o------>| |----->o clark_d
; clark_b o------>| CLARKE |
; clark_c* o------>| |----->o clark_q
; |_________________|
;
; 目标板cpu: x2407
;=====================================================================================
; 修改记录:
;-------------------------------------------------------------------------------------
; 最终更改日期:2005.7.10 版本号: ver.1.0
;=======================================================================
;(使用子程序就把下面的变量声明文件复制到主程序中) ref【识别在当前模块中使用但在其他模块中定义的符号】
; .ref CLARKE, CLARKE_INIT ;子程序调用
; .ref clark_a, clark_b ;输入
; .ref clark_d, clark_q ;输出
;=======================================================================
;外部变量声明 def【识别在当前模块中定义且可以被其他模块使用的符号】
.def CLARKE, CLARKE_INIT ;子程序调用
.def clark_a, clark_b ;输入
.def clark_d, clark_q ;输出
;=======================================================================
.include "x24x_app.h" ;include 【告诉汇编器开始从其他文件中读仍从读原语句】
; 变量定义 .usect【在未初始化命名段内保留空间】
clark_a .usect "clarke",1
clark_b .usect "clarke",1
clark_d .usect "clarke",1
clark_q .usect "clarke",1
sqrt3inv .usect "clarke",1 ; 1/sqrt(3)
clk_temp .usect "clarke",1
;=========================
CLARKE_INIT:
;=========================
; sqrt3inv = (1/sqrt(3))=0.577350269
ldp #sqrt3inv
SPLK #018830,sqrt3inv ; 1/sqrt(3) (Q15)
RET
;=========================
CLARKE:
;=========================
SPM 1 ; 设置乘积移位模式以适合 Q15 计算
SETC SXM ; 允许符号扩展
;clark_d = clark_a
ldp #clark_a
LACC clark_a ; ACC = clark_a
SACL clark_d ; clark_d = clark_a
;clark_q = (2 * clark_b + clark_a) / sqrt(3)
SFR ; ACC = clark_a/2
ADD clark_b ; ACC = clark_a/2 + clark_b
SACL clk_temp ; clk_temp = clark_a/2 + clark_b
LT clk_temp ; TREG = clark_a/2 + clark_b
MPY sqrt3inv ; PREG = (clark_a/2 + clark_b)*(1/sqrt(3))
PAC ; ACC = (clark_a/2 + clark_b)*(1/sqrt(3))
SFL ; ACC = (clark_a + clark_b*2)*(1/sqrt(3))
SACH clark_q ; clark_q = (clark_a + clark_b*2)*(1/sqrt(3))
SPM 0 ; 禁止符号扩展
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -