📄 field_prof.asm
字号:
;=====================================================================================
; File name: FIELD_PROF.ASM
;
; Originator: Digital Control Systems Group
; Texas Instruments
;
; Description: This module generates the output command of rotating d-axis
; stator current for a specific input command of speed reference
; This is used for variable speed implementation of the vector
; control of AC induction motor drives.
;
;=====================================================================================
; History:
;-------------------------------------------------------------------------------------
; 02-08-2001 Release Rev 1.0
;================================================================================
; Applicability: F240,F241,C242,F243,F24xx. (Peripheral Independent).
;================================================================================
; Routine Name: field_profile_calc Type: C Callable
;
; C prototype : void field_profile_calc(struct FIELDPROF *p);
;
; The struct object is defined in the header file "field_prof.h" as follows:
;
; typedef struct { int spd_ref_fp; /* Input: Reference speed (Q15) */
; int spd_abs; /* Variable: Absolute reference speed (Q15) */
; int spd_1; /* Parameter: Rated speed (Q15) */
; int id_1; /* Parameter: Maximum value of d-axis stator current (Q15) */
; int id_ref_fp; /* Output: Reference d-axis stator current (Q15) */
; int (*calc)(); /* Pointer to calculation function */
; } FIELDPROF;
;
;
; Frame Usage Details:
; step | a | b | c | d
;____________|_____________|______________|______________|_____________
; AR0 | field_tmp1 | | |
;
;================================================================================
.def _field_profile_calc
;================================================================================
__field_profile_calc_framesize .set 0001h
;================================================================================
_field_profile_calc:
; Assume now ARP=AR1
POPD *+ ; Keep return address
SAR AR0,*+ ; Keep old frame pointer (FP)
SAR AR1,* ; Keep old stack pointer (SP)
LARK AR0,__field_profile_calc_framesize ; Load AR0 with frame size
LAR AR0,*0+,AR0 ; AR0->FP0 (new FP), ARP=AR0
;================================================================================
SBRK #3 ; ARP=AR0, AR0->FR0-3 (1st argument)
;----------------------------------------------------------------------------------
LAR AR2,* ; ARP=AR0, AR0->spd_ref_fp, AR2->spd_ref_fp
;----------------------------------------------------------------------------------
ADRK #3 ; ARP=AR0, AR0->FR0, AR2->spd_ref_fp
;----------------------------------------------------------------------------------
MAR *,AR2 ; ARP=AR2, AR0->FR0, AR2->spd_ref_fp
;----------------------------------------------------------------------------------
SETC SXM ; Turn sign extension mode on
; ARP=AR2, AR0->FR0, AR2->spd_ref_fp
;----------------------------------------------------------------------------------
SETC OVM ; Set overflow mode
; ARP=AR2, AR0->FR0, AR2->spd_ref_fp
;----------------------------------------------------------------------------------
SPM 0 ; Reset product mode
; ARP=AR2, AR0->FR0, AR2->spd_ref_fp
;----------------------------------------------------------------------------------
LACC *+ ; ACC = spd_ref_fp (Q15)
; ARP=AR2, AR0->FR0, AR2->spd_abs
;----------------------------------------------------------------------------------
ABS ; ACC = |spd_ref_fp| (Q15)
; ARP=AR2, AR0->FR0, AR2->spd_abs
;----------------------------------------------------------------------------------
SACL *+ ; spd_abs = |spd_ref_fp| (Q15)
; ARP=AR2, AR0->FR0, AR2->spd_1
;----------------------------------------------------------------------------------
SUB *+ ; ACC = |spd_ref_fp| - spd_1 (Q15)
; ARP=AR2, AR0->FR0, AR2->id_1
;----------------------------------------------------------------------------------
BCND FIELD_PROF1,LT ; Branch to FIELD_PROF1 if |spd_ref_fp| < spd_1
; ARP=AR2, AR0->FR0, AR2->id_1
;----------------------------------------------------------------------------------
B FIELD_PROF2 ; Branch to FIELD_PROF2 if |spd_ref_fp| >= spd_1
; ARP=AR2, AR0->FR0, AR2->id_1
;----------------------------------------------------------------------------------
FIELD_PROF1 ; ARP=AR2, AR0->FR0, AR2->id_1
;----------------------------------------------------------------------------------
LACC *+ ; ACC = id_1 (Q15)
; ARP=AR2, AR0->FR0, AR2->id_ref_fp
;----------------------------------------------------------------------------------
SACL *,AR1 ; id_ref_fp = id_1 (Q15)
; ARP=AR2, AR0->FR0, AR2->id_ref_fp, ARP=AR1
;----------------------------------------------------------------------------------
B FIELD_END ; ARP=AR2, AR0->FR0, AR2->id_ref_fp
;----------------------------------------------------------------------------------
FIELD_PROF2 ; ARP=AR2, AR0->FR0, AR2->id_1
;----------------------------------------------------------------------------------
LT *- ; TREG = id_1 (Q15)
; ARP=AR2, AR0->FR0, AR2->spd_1
;----------------------------------------------------------------------------------
MPY *-,AR0 ; PREG = id_1*spd_1 (Q30)
; ARP=AR2, AR0->FR0, AR2->spd_abs, ARP=AR0
;----------------------------------------------------------------------------------
PAC ; ACC = id_1*spd_1 (Q30)
; ARP=AR0, AR0->FR0, AR2->spd_abs
;----------------------------------------------------------------------------------
SACH *,1 ; field_tmp1 = id_1*spd_1 (Q15)
; ARP=AR0, AR0->FR0, AR2->spd_abs
;----------------------------------------------------------------------------------
LACC *,15,AR2 ; ACC = id_1*spd_1 left shifted by 15 (id_ref_fp=Q15)
; ARP=AR0, AR0->FR0, AR2->spd_abs, ARP=AR2
;----------------------------------------------------------------------------------
RPT #15 ; Repeat SUBC 16 times
; ARP=AR2, AR0->FR0, AR2->spd_abs
;----------------------------------------------------------------------------------
SUBC * ; Dividing (id_1*spd_1)/|spd_ref_fp|
; ARP=AR2, AR0->FR0, AR2->spd_abs
;----------------------------------------------------------------------------------
ADRK #3 ; ARP=AR2, AR0->FR0, AR2->id_ref_fp
;----------------------------------------------------------------------------------
SACL *,AR1 ; id_ref_fp = (id_1*spd_1)/|spd_ref_fp| (Q15)\
; ARP=AR2, AR0->FR0, AR2->id_ref_fp, ARP=AR1
;----------------------------------------------------------------------------------
FIELD_END
;----------------------------------------------------------------------------------
_field_profile_calc_exit:
;; MAR *,AR1 ; can be removed if this condition is met on
; every path to this code. (i.e., ARP=AR1 here)
CLRC OVM
CLRC SXM
SBRK #(__field_profile_calc_framesize+1)
LAR AR0,*-
PSHD *
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -