⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 field_prof.asm

📁 TI的digital motor control lib的源代码。了解TI的编程规范
💻 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 + -