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

📄 speed_fr.asm

📁 TI公司24X系列DSP控制永磁同步电机PMSM
💻 ASM
字号:
;=======================================================================
; File Name:	speed_fr.asm			      
;
; Module Name: 	SPEED_FRQ	
;
; Initialization Routine: SPEED_FRQ_INIT
;
; Originator:	Digital Control Systems Group
;			Texas Instruments
;
; Description:  Speed Calculation based on electrical angle 	    	
;
;
;			          |~~~~~~~~~~~~~~~~~~~~|
;	                  |                 Q15|----->o speed_frq 
;theta_elec_fr o----->|Q15    SPEED_FRQ	 Q0|----->o speed_frq_rpm
;	         	      |____________________|
;
; Target dependency:	C2xx core only
;
;===========================================================================
; History:
;---------------------------------------------------------------------------
; 08-26-2002	Release	Rev 1.00
;===========================================================================
;(To use this Module, copy this section to main system file)
;		.ref	SPEED_FRQ, SPEED_FRQ_INIT		;function call
;		.ref	theta_elec_fr          			;Inputs
;		.ref	speed_frq, speed_frq_rpm	    ;Outputs
;===========================================================================
;Module definitions for external reference.
		.def	SPEED_FRQ, SPEED_FRQ_INIT		;function call
		.def	theta_elec_fr          			;Inputs
		.def	speed_frq, speed_frq_rpm	    ;Outputs
;===========================================================================
K1_fr_		.set	6400		; for K1_fr (Q6) 
K2_fr_		.set	32162		; for K2_fr (Q15)	
K3_fr_		.set	606 	    ; for K3_fr (Q15)

BASE_RPM_FR_ 	 .set 	6000		; Base rpm speed (Q0)	
DIFF_MAX_LIMIT   .set   7333h       ; The maximum limit to differentiate theta_r_se (Q15)
DIFF_MIN_LIMIT   .set   0CCDh       ; The minimum limit to differentiate theta_r_se (Q15)
         
		.include	x24x_app.h
            
theta_elec_fr   .usect	"speed_fr",1 	; Electrical angle                      (Q15)
speed_frq       .usect	"speed_fr",1 	; Estimated rotor speed                 (Q15)
speed_frq_rpm   .usect	"speed_fr",1    ; Estimated rotor speed in rpm          (Q0)
K1_fr			.usect	"speed_fr",1	; Constant using in differentiator      (Q6)
K2_fr			.usect	"speed_fr",1	; Constant using in low-pass filter     (Q15)
K3_fr			.usect	"speed_fr",1	; Constant using in low-pass filter     (Q15)
rpm_max_fr      .usect	"speed_fr",1    ; Base speed in rpm                        (Q0)
theta_old       .usect	"speed_fr",1	; Previous rotor flux angle               (Q15)
min_theta_fr    .usect	"speed_fr",1    ; Minimum limit for diffirential rotor flux angle (Q15)
max_theta_fr    .usect	"speed_fr",1    ; Maximum limit for diffirential rotor flux angle (Q15)
tmp1_fr			.usect	"speed_fr",1	; Temporary variable

;=========================
SPEED_FRQ_INIT:
;=========================    
	LDP		#K1_fr    
	SPLK	#K1_fr_,K1_fr	     	; K1 = 1/(fb*T)                (Q6)
  	SPLK	#K2_fr_,K2_fr       	; K2 = Tau/(Tau+T)             (Q15)
  	SPLK	#K3_fr_,K3_fr       	; K3 = T/(Tau+T)               (Q15)
	SPLK	#BASE_RPM_FR_,rpm_max_fr  ; Initialize the base speed  (Q0)	
    SPLK	#DIFF_MAX_LIMIT,max_theta_fr ; Initialize the max limit of rotor flux angle  (Q15)	
    SPLK	#DIFF_MIN_LIMIT,min_theta_fr ; Initialize the min limit of rotor flux angle  (Q15)    
    SPLK	#0h,theta_old           ; Initialize the rotor flux angle  (Q15)
 
    RET
                   
;=========================
SPEED_FRQ:
;=========================    
   		SPM		0 				; Reset product mode 
		SETC	SXM				; Set sign extension mode
		SETC	OVM				; Set overflow mode

		LDP		#max_theta_fr
		
; Differentiator
; Check theta_r_se is within the differentiable range (min_theta,max_theta)
		LACC	max_theta_fr
		SUB		theta_elec_fr
		BCND	LESS_MAX_FR,GT		; Branch to LESS_MAX if max_theta > theta_elec 
        B		SKIP_DIFF_FR
LESS_MAX_FR
    	LACC	min_theta_fr
    	SUB		theta_elec_fr
    	BCND	MORE_MIN_FR,LT    ; Branch to MORE_MIN if min_theta < theta_elec 
        B		SKIP_DIFF_FR
MORE_MIN_FR	
		; Differentiating the rotor flux angle 
		; if min_theta < theta_elec < max_theta
		LT		K1_fr			; TREG = K1                (Q6)
		MPY		theta_elec_fr   ; PREG = K1*theta(k)     (Q21)
		PAC						; ACC = K1*theta(k)      (Q21)
		MPY		theta_old       ; PREG = K1*theta(k-1)   (Q21)
		SPAC					; ACC = K1*theta(k)-K1*theta(k-1)   (Q21)
		SFL               		; ACC = K1*theta(k)-K1*theta(k-1)   (Q22)
		SFL               		; ACC = K1*theta(k)-K1*theta(k-1)   (Q23)
		SFL               		; ACC = K1*theta(k)-K1*theta(k-1)   (Q24)
		SACH	tmp1_fr,7       ; tmp1_fr = K1*theta(k)-K1*theta(k-1)   (Q15)
		; Low-pass filter
		LT		K2_fr			; TREG = K2                (Q15)
		MPY		speed_frq       ; PREG = K2*speed_frq(k-1)   (Q30)
        PAC						; ACC =  K2*w_psi_r(k-1)     (Q30)
        LT		K3_fr			; TREG = K3                  (Q15)
        MPY		tmp1_fr         ; PREG = K3*tmp1_fr          (Q30)
        APAC					; ACC = K2*speed_frq(k-1)+K3*tmp1_fr           (Q30)
        SACH	speed_frq,1     ; speed_frq(k) = K2*speed_frq(k-1)+K3*tmp1_fr  (Q15)
SKIP_DIFF_FR

; Update the rotor flux angle
		LACC	theta_elec_fr	; ACC = theta_elec             (Q15)
		SACL	theta_old       ; theta_old = theta_elec      (Q15)
; Change motor speed from pu value to rpm value (Q15 -> Q0)
		LT		rpm_max_fr   	; TREG = rpm_max_fr             (Q0)
		MPY	    speed_frq    	; PREG = rpm_max_fr*speed_frq    (Q15)
		PAC						; ACC = rpm_max_fr*speed_frq     (Q15)	
		SACH	speed_frq_rpm,1	; speed_frq_rpm = rpm_max_fr*speed_frq  (Q0)
       
	    RET
 

⌨️ 快捷键说明

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