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

📄 trap_gen.asm

📁 无刷直流电机的无传感器控制TI程序
💻 ASM
字号:
;===========================================================================
; File Name:	trap_gen.asm
;
; Module Name: 	TRAPEZOIDAL_GEN				      
;                    
; Initialization Routine: TRAPEZOIDAL_GEN_INIT
;
; Originator:	Digital Control Systems Group
;			Texas Instruments
;
; Description:	This module generates trapezoidal output of adjustable maximum, 
;               minimum and frequency.
;
;				        |~~~~~~~~~~~~~~~~~|
;	   trap_min	o------>|       		  |
;	   trap_max o------>| TRAPEZOIDAL_GEN |----->o trap_out
;  trap_dly_max o------>|		          |
;				        |_________________|
;
;
;=====================================================================================
; History:
;-------------------------------------------------------------------------------------
; 11-03-2000    Release Rev 1.1
;===========================================================================
;(To use this Module, copy this section to main system file)
;		.ref	TRAPEZOIDAL_GEN, TRAPEZOIDAL_GEN_INIT	;Function call
;		.ref	trap_min, trap_max, trap_dly_max		;Inputs
;		.ref	trap_out								;Output
;===========================================================================
		.def	TRAPEZOIDAL_GEN, TRAPEZOIDAL_GEN_INIT	;Function call
		.def	trap_min, trap_max, trap_dly_max 		;Inputs
		.def	trap_out								;Output
;===========================================================================
		.include 	"x24x_app.h"  

trap_min		.usect "trap_gen",1
trap_max		.usect "trap_gen",1
trap_dly_max    .usect "trap_gen",1
trap_out		.usect "trap_gen",1
trap_out_lo     .usect "trap_gen",1
trap_min_tmp    .usect "trap_gen",1
trap_max_tmp    .usect "trap_gen",1
trap_dly_max_tmp .usect "trap_gen",1
trap_timer      .usect "trap_gen",1
trap_delay_cntr .usect "trap_gen",1

trap_8192inv    .usect "trap_gen",1
trap_flag		.usect "trap_gen",1 
trap_tmp1       .usect "trap_gen",1 

TRAPEZOIDAL_GEN_INIT:
		LDP		#trap_timer
		
		SPLK	#0, trap_flag              ; Starting point flag
		SPLK    #0, trap_timer   		   ; Timer                 (Q15)
		SPLK	#0, trap_delay_cntr        ; Delay counter         (Q0)
        SPLK	#6, trap_dly_max           ; Maximum delay counter (Q0)
        SPLK	#6, trap_dly_max_tmp       ; Maximum delay counter (Q0)        
        SPLK	#0004h, trap_8192inv       ; Constant = 1/8192     (Q15)
		SPLK	#2000h, trap_min	 	   ; Initialize minimum trapezoidal (Q15)	
		SPLK	#2000h, trap_max 		   ; Initialize maximum trapezoidal (Q15)
		       
		RET

TRAPEZOIDAL_GEN:
		
		SPM		0					; Reset product mode		
		SETC	SXM					; Sign extension mode
		SETC	OVM					; Set Overflow mode
        
        ; Updating the time delay
		LDP		#trap_delay_cntr
		LACC	trap_delay_cntr
		ADD		#1
		SACL	trap_delay_cntr
		SUB		trap_dly_max_tmp
		BCND	TRAP_EXIT, LT
		
		; Updating the timer
        LACC	trap_timer			; ACC = trap_timer       (Q15)	
        ADD		#1
        AND		#7FFFh				; Force "wrap" around for positive Q15
        SACL	trap_timer

		; Checking the timer to update trap_max at trap_timer = 0
		LACC	trap_timer          ; ACC = trap_timer     (Q15)
		BCND	SKIP_UPDATE_MAX, NEQ ; Branch to SKIP_UPDATE_MAX if trap_timer != 0
        LACC	trap_max     		; ACC = trap_max           (Q15)
        SACL	trap_max_tmp        ; trap_max_tmp = trap_max  (Q15)
		LACC	trap_dly_max        ; ACC = trap_dly_max               (Q0)
		SACL	trap_dly_max_tmp    ; trap_dly_max_tmp = trap_dly_max  (Q0)
SKIP_UPDATE_MAX
		; Checking the timer to update trap_min at trap_timer = 0.50
		LACC	trap_timer			; ACC = trap_timer        (Q15)
		SUB		#4000h              ; ACC = trap_timer - 0.50  (Q15)
		BCND	SKIP_UPDATE_MIN, NEQ ; Branch to SKIP_UPDATE_MIN if trap_timer != 0.50
	    LACC	trap_min     		; ACC = trap_min           (Q15)
        SACL	trap_min_tmp        ; trap_min_tmp = trap_min  (Q15)
         
SKIP_UPDATE_MIN

		; Checking the timer
		LACC	trap_timer
		SUB		#2000h				; ACC = trap_timer - 0.25  (Q15)
		BCND	INCREASE_TRAP,LT    ; Branch to INCREASE_TRAP if 0 < trap_timer < 0.25
		LACC	trap_timer
		SUB		#4000h              ; ACC = trap_timer - 0.5  (Q15)
		BCND	MAX_TRAP,LT			; Branch to MAX_TRAP if 0.25 < trap_timer < 0.5
		LACC	trap_timer
		SUB		#6000h              ; ACC = trap_timer - 0.75  (Q15)
		BCND	DECREASE_TRAP,LT    ; Branch to DECREASE_TRAP if 0.5 < trap_timer < 0.75
		B		MIN_TRAP		    ; Branch to MIN_TRAP if 0.75 < trap_timer < 1
INCREASE_TRAP
		LACC	trap_max_tmp,15     ; ACC = trap_max                   (Q14)
		SUB		trap_min_tmp,15		; ACC = trap_max - trap_min        (Q14)
		SACH	trap_tmp1			; trap_tmp1 = trap_max - trap_min  (Q14)		
		LT		trap_8192inv		; TREG = 1/8192                               (Q15)
		MPY		trap_tmp1			; PREG = (1/8192)*(trap_max-trap_min)         (Q29)
        PAC							; ACC = (1/8192)*(trap_max-trap_min)          (Q29)
        SFL							; ACC = (1/8192)*(trap_max-trap_min)          (Q30)   
        SFL							; ACC = (1/8192)*(trap_max-trap_min)          (Q31)
        ADDS	trap_out_lo			; ACC = trap_out+(1/8192)*(trap_max-trap_min) (Q31)
        ADDH	trap_out			; ACC = trap_out+(1/8192)*(trap_max-trap_min) (Q31)
        SACH	trap_out			; trap_out = trap_out+(1/8192)*(trap_max-trap_min) (Q31)
        SACL	trap_out_lo			; trap_out = trap_out+(1/8192)*(trap_max-trap_min) (Q31)
        B       RESET_DELAY

MAX_TRAP
		LACC	trap_max_tmp,16     ; ACC = trap_max        (Q15)
		SACH	trap_out			; trap_out = trap_max   (Q15)
		SACL	trap_out_lo        
        B       RESET_DELAY

DECREASE_TRAP
		LACC	trap_max_tmp,15     ; ACC = trap_max                   (Q14)
		SUB		trap_min_tmp,15     ; ACC = trap_max - trap_min        (Q14)
		SACH	trap_tmp1			; trap_tmp1 = trap_max - trap_min  (Q14)		
		LT		trap_8192inv		; TREG = 1/8192                               (Q15)
		MPY		trap_tmp1			; PREG = (1/8192)*(trap_max-trap_min)         (Q29)
        PAC							; ACC = (1/8192)*(trap_max-trap_min)          (Q29)
        NEG	                        ; ACC = -(1/8192)*(trap_max-trap_min)         (Q29)
        SFL							; ACC = -(1/8192)*(trap_max-trap_min)         (Q30)   
        SFL							; ACC = -(1/8192)*(trap_max-trap_min)         (Q31)		
        ADDS	trap_out_lo			; ACC = trap_out-(1/8192)*(trap_max-trap_min) (Q31)
        ADDH	trap_out			; ACC = trap_out-(1/8192)*(trap_max-trap_min) (Q31)
        SACH	trap_out			; trap_out = trap_out-(1/8192)*(trap_max-trap_min) (Q31)
        SACL	trap_out_lo			; trap_out = trap_out-(1/8192)*(trap_max-trap_min) (Q31)
        B       RESET_DELAY

MIN_TRAP
		LACC	trap_min_tmp,16     ; ACC = trap_min         (Q15)
		SACH	trap_out            ; trap_out = trap_min    (Q15)
		SACL	trap_out_lo
        B       RESET_DELAY
                
RESET_DELAY
		SPLK	#0,trap_delay_cntr  ; reset delay counter  (Q0)       

TRAP_EXIT
		RET
        
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -