📄 i_gen.asm
字号:
;===========================================================================
; 文件名: Igen.asm
;
; 模块名: I_GEN
;
; 初始化程序名: I_GEN_INIT
;
; 公司: 达盛科技
;
; 功能描述: 根据输入角度值,产生相差120度的正弦信号,以模拟电流反馈
; 正弦信号的相位、零点、幅值、可调根据输入调整
;
; |~~~~~~~~~~~~~~~|
; Ia_offset o------>| |
; Ib_offset o------>| |----->o Ia_out
; Ia_gain o------>| I_GEN |
; Ib_gain o------>| |
; theta_delt o------>| |
; theta o------>| |----->o Ib_out
; |_______________|
;
; 说明: 0 < theta < 7FFFh 对应 0 < theta < 360 deg
;
; 目标板cpu: C2xx
;=====================================================================================
; 修改记录:
;-------------------------------------------------------------------------------------
; 最终修改日期:2005.6.15 版本号: Ver 1.0
;===========================================================================
;(要调用模块,就将下面声明语句复制到主程序代码中相应位置)
; .ref I_gen,I_gen_INIT ;子程序调用
; .ref Ia_offset,Ib_offset,Ia_gain ;输入
; .ref Ib_gain,delt_theta,theta ;输入
; .ref Ia_out,Ib_out ;输出
;===========================================================================
;变量定义
.def I_GEN, I_GEN_INIT ;子程序调用
.def Ia_offset,Ib_offset,Ia_gain, ;输入
.def Ib_gain,delt_theta,theta ;输入
.def Ia_out,Ib_out ;输出
;===========================================================================
.ref SINTAB_360
Ia_offset .usect "I_GEN",1
Ib_offset .usect "I_GEN",1
Ia_gain .usect "I_GEN",1
Ib_gain .usect "I_GEN",1
delt_theta .usect "I_GEN",1
theta .usect "I_GEN",1
Ia_out .usect "I_GEN",1
Ib_out .usect "I_GEN",1
t_ptr1 .usect "I_GEN",1
theta_a .usect "I_GEN",1
theta_b .usect "I_GEN",1
GPR0_i1 .usect "I_GEN",1
;=====================================================================
I_GEN_INIT:
;=====================================================================
ldp #Ia_offset
SPLK #0000h, Ia_offset
SPLK #0000h, Ib_offset
SPLK #3FFFh, Ia_gain
SPLK #3FFFh, Ib_gain
SPLK #0000h, delt_theta
SPLK #0000h, theta
SPLK #0000h, Ia_out
SPLK #0000h, Ib_out
RET
;======================================================================
I_GEN:
;======================================================================
;计算 theta_a
ldp #theta
LACC theta
ADD delt_theta ;加偏移角
AND #07FFFh ;强制正数循环
SACL GPR0_i1 ;
LACC GPR0_i1,9
SACH t_ptr1
LACC #SINTAB_360
ADD t_ptr1
TBLR theta_a ;theta_a = Sin(theta+delt_theta) Q15
;-----------------------------------
;计算 theta_b
ldp #theta
LACC theta
ADD delt_theta ;加偏移角
SUB #10922 ;加120度
AND #07FFFh
SACL GPR0_i1
LACC GPR0_i1,9
SACH t_ptr1
LACC #SINTAB_360
ADD t_ptr1
TBLR theta_b ;theta_b = Sin(theta+delt_theta-120) Q15
;-----------------------------------
;计算 Ia_out/Ib_out
SETC SXM ; 允许符号扩展
SPM 1 ; 设置SPM 以完成 Q15乘法运算
LACC #0 ; 清零 ACC
LT Ia_gain ; TREG = ia0_gain
MPY theta_a ; PREG = theta_a * Ia_gain
PAC
ADD Ia_offset,16
SACH Ia_out ; Ia_out = theta_a * Ia_gain + Ia_offset
LACC #0 ; 清零 ACC
LT Ib_gain ; TREG = Ib_gain
MPY theta_b ; PREG = theta_b * Ib_gain
PAC
ADD Ib_offset,16
SACH Ib_out ; Ib_out = theta_a * Ib_gain + Ib_offset
SPM 0 ; SPM 复位
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -