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

📄 pmsm3_1.asm

📁 本程序来自TI公司网站原程序,其功能是通过传统的矢量控制算法来实现对永磁同步电机的控制,矢量控制采用双闭环结构
💻 ASM
📖 第 1 页 / 共 2 页
字号:
		
    	LDP		#Mfunc_c1
		BLDD	#Ta,Mfunc_c1
 		BLDD	#Tb,Mfunc_c2
		BLDD	#Tc,Mfunc_c3      
		
		CALL   	FC_PWM_DRV	

 	.endif
;---------------------------------------------------------

;---------------------------------------------------------
	.if (phase2_inc_build)
;---------------------------------------------------------
 		LDP		#target_value
		BLDD	#speed_ref,target_value
		
        CALL	RAMP_CNTL
		
		LDP		#rmp_freq
		BLDD	#setpt_value,rmp_freq	
        
        CALL	RAMP_GEN
        
		LDP		#theta_ip
 		BLDD	#rmp_out,theta_ip
 		BLDD	#Vd_testing,ipark_D
 		BLDD	#Vq_testing,ipark_Q
 		 		
 		CALL	I_PARK
 		
 		LDP		#Ualfa  
      	BLDD	#ipark_d,Ualfa
   		BLDD	#ipark_q,Ubeta
   		
  		CALL   	SVGEN_DQ  
		
    	LDP		#Mfunc_c1
		BLDD	#Ta,Mfunc_c1
		BLDD	#Tb,Mfunc_c2
		BLDD	#Tc,Mfunc_c3      
		
		CALL   	FC_PWM_DRV	

        CALL	ILEG2_DCBUS_DRV
        
        LDP		#clark_a
        BLDD	#Imeas_a,clark_a
        BLDD	#Imeas_b,clark_b
		
		CALL	CLARKE        
        
        LDP		#park_d
        BLDD	#clark_d,park_d
        BLDD	#clark_q,park_q
        BLDD	#rmp_out,theta_p
                
        CALL	PARK

	.endif
;---------------------------------------------------------

;---------------------------------------------------------
	.if (phase3_inc_build)
;---------------------------------------------------------

 		LDP		#target_value
		BLDD	#speed_ref,target_value
		
        CALL	RAMP_CNTL

		LDP		#rmp_freq
		BLDD	#setpt_value,rmp_freq	    ; using step ramp control
        
        CALL	RAMP_GEN

        LDP		#id_ref
        BLDD	#Id_ref,id_ref
        BLDD	#park_D,id_fdb
        
       	CALL	PID_REG3_ID
       	
		LDP		#iq_ref
	  	BLDD	#Iq_ref,iq_ref
        BLDD	#park_Q,iq_fdb
         
       	CALL	PID_REG3_IQ      

		LDP		#theta_ip
		BLDD	#ud_out,ipark_D
 		BLDD	#uq_out,ipark_Q
 		BLDD	#rmp_out,theta_ip
 		 		
 		CALL	I_PARK
 		
 		LDP		#Ualfa  
      	BLDD	#ipark_d,Ualfa
   		BLDD	#ipark_q,Ubeta
   		
  		CALL   	SVGEN_DQ  
		
    	LDP		#Mfunc_c1
		BLDD	#Ta,Mfunc_c1
 		BLDD	#Tb,Mfunc_c2
		BLDD	#Tc,Mfunc_c3      
		
		CALL   	FC_PWM_DRV	

        CALL	ILEG2_DCBUS_DRV
        
        LDP		#clark_a
        BLDD	#Imeas_a,clark_a
        BLDD	#Imeas_b,clark_b
		
		CALL	CLARKE        

        LDP		#park_d
        BLDD	#clark_d,park_d
        BLDD	#clark_q,park_q
        BLDD	#rmp_out,theta_p
        
        CALL	PARK
         
    .endif
;---------------------------------------------------------

;---------------------------------------------------------
	.if (phase4_inc_build)
;---------------------------------------------------------
 		LDP		#target_value
		BLDD	#speed_ref,target_value
		
        CALL	RAMP_CNTL
		
		LDP		#rmp_freq
		BLDD	#setpt_value,rmp_freq	
        
        CALL	RAMP_GEN
        
        LDP		#id_ref
        BLDD	#Id_ref,id_ref
        BLDD	#park_D,id_fdb
        
       	CALL	PID_REG3_ID
       	
		LDP		#iq_ref
        BLDD	#Iq_ref,iq_ref
        BLDD	#park_Q,iq_fdb

                
       	CALL	PID_REG3_IQ        

; checking the lockrtr_flg here
		POINT_B0
        LACC	lockrtr_flg   			; lockrtr_flg=0 for constant current mode (angle=0)
		BCND	NON_CC_MODE,EQ			; Branch to NON_CC_MODE if lockrtr_flg=0

CC_MODE
	
		LDP		#theta_ip
        BLDD	#ud_out,ipark_D      
 		BLDD	#uq_out,ipark_Q      
  		SPLK	#0000h,theta_ip
 		 		
 		CALL	I_PARK
 		
 		LDP		#Ualfa  
      	BLDD	#ipark_d,Ualfa
  		BLDD	#ipark_q,Ubeta
  		
  		CALL   	SVGEN_DQ  
		
    	LDP		#Mfunc_c1
		BLDD	#Ta,Mfunc_c1
 		BLDD	#Tb,Mfunc_c2
		BLDD	#Tc,Mfunc_c3      
		
		CALL   	FC_PWM_DRV	

        CALL	ILEG2_DCBUS_DRV
        
        LDP		#clark_a
        BLDD	#Imeas_a,clark_a
        BLDD	#Imeas_b,clark_b
		
		CALL	CLARKE        
        
        LDP		#park_d
        BLDD	#clark_d,park_d
        BLDD	#clark_q,park_q
        SPLK	#0000h,theta_p
                
        CALL	PARK
        
        B		SKIP_CC_MODE

NON_CC_MODE        

		LDP		#theta_ip
        BLDD	#ud_out,ipark_D
 		BLDD	#uq_out,ipark_Q
 		BLDD	#rmp_out,theta_ip
 		
       	CALL	I_PARK
 		
 		LDP		#Ualfa  
      	BLDD	#ipark_d,Ualfa
   		BLDD	#ipark_q,Ubeta
 		   		
  		CALL   	SVGEN_DQ  
		
    	LDP		#Mfunc_c1
		BLDD	#Ta,Mfunc_c1
 		BLDD	#Tb,Mfunc_c2
		BLDD	#Tc,Mfunc_c3      
		
		CALL   	FC_PWM_DRV	

        CALL	ILEG2_DCBUS_DRV
        
        LDP		#clark_a
        BLDD	#Imeas_a,clark_a
        BLDD	#Imeas_b,clark_b
		
		CALL	CLARKE        
        
        LDP		#park_d
        BLDD	#clark_d,park_d
        BLDD	#clark_q,park_q
        BLDD	#rmp_out,theta_p
                
        CALL	PARK
        
SKIP_CC_MODE

       	CALL 	QEP_THETA_DRV
        	    
        LDP		#theta_elec_fr
        BLDD	#theta_elec,theta_elec_fr
        
        CALL	SPEED_FRQ	    
        	    
 	.endif
;---------------------------------------------------------

;---------------------------------------------------------
	.if (phase5_inc_build)
;---------------------------------------------------------

 		LDP		#target_value
		BLDD	#speed_ref,target_value
        
        CALL	RAMP_CNTL
                              
        POINT_B0
		LACC	sp_loop_max
        SUB		sp_loop_cnt
        BCND	SKIP_SP_PID,GEQ
        SPLK	#0,sp_loop_cnt         ; reset sp_loop_cnt
        
        LDP		#spd_ref
;		BLDD	#setpt_value,spd_ref
		BLDD	#speed_ref,spd_ref
        BLDD	#speed_frq,spd_fdb

       	CALL	PID_REG3_SPD

SKIP_SP_PID  

        LACC	sp_loop_cnt
        ADD		#1h
        SACL	sp_loop_cnt            ; keep counting sp_loop_cnt

       	LDP		#id_ref
        BLDD	#Id_ref,id_ref
        BLDD	#park_D,id_fdb
        
       	CALL	PID_REG3_ID

        LDP		#iq_ref
        BLDD	#t_out,iq_ref
        BLDD	#park_Q,iq_fdb
        
       	CALL	PID_REG3_IQ 

   		LDP		#theta_ip
		BLDD	#ud_out,ipark_D
		BLDD	#uq_out,ipark_Q
		BLDD	#theta_elec,theta_ip
		 		
 		CALL	I_PARK
 		
 		LDP		#Ualfa  
      	BLDD	#ipark_d,Ualfa
  		BLDD	#ipark_q,Ubeta

  		CALL   	SVGEN_DQ  
		
    	LDP		#Mfunc_c1
		BLDD	#Ta,Mfunc_c1
 		BLDD	#Tb,Mfunc_c2
		BLDD	#Tc,Mfunc_c3      
		
		CALL   	FC_PWM_DRV	

        CALL	ILEG2_DCBUS_DRV
        
        LDP		#clark_a
        BLDD	#Imeas_a,clark_a
        BLDD	#Imeas_b,clark_b
		
		CALL	CLARKE        

       	LDP		#park_d
        BLDD	#clark_d,park_d
        BLDD	#clark_q,park_q
        BLDD	#theta_elec,theta_p
        
        CALL	PARK
       
       	CALL 	QEP_THETA_DRV        	

        LDP		#theta_elec_fr
        BLDD	#theta_elec,theta_elec_fr
        
        CALL	SPEED_FRQ	    

 	.endif
;---------------------------------------------------------

;---------------------------------------------------------
;Checking bandwidth of ISR 
		SETC   	XF

        CALL	DAC_VIEW_DRV       	

; Change reference speed from pu value to rpm value (Q15 -> Q0)
		POINT_B0
		SPLK	#6000, GPR1      		; GPR1 = base rpm speed     (Q0)
		LT		GPR1				    ; TREG = GPR1  				(Q0)
		MPY	    speed_ref             	; PREG = GPR1*speed_ref	(Q15)
		PAC							    ; ACC = GPR1*speed_ref	(Q15)
		SACH	speed_ref_rpm,1		    ; speed_ref_rpm = GPR1*speed_ref	(Q0)

; Check enable_flg to enable/disable PWM drive signals
		LACC	enable_flg
		BCND	ENABLE_DRIVE,GT
       	CALL	DIS_DRIVE       		; Disable drive
       	B		SKIP_DRIVE
ENABLE_DRIVE       	
        CALL	EN_DRIVE				; Enable drive
SKIP_DRIVE 


;Checking bandwidth of ISR 
		SETC   	XF

;=========================================================
;End main section of ISR
;=========================================================
;Context restore regs
END_ISR:
	POINT_PG0
    
    MAR		*, AR1    			; make stack pointer active
	MAR		*-          		; point to top of stack
	
	;More context restore if needed
	PSHD	*-					; restore TOS
	LAR		AR6,*-				; restore AR6
	LACL	*-					; Restore Acc low
	ADD		*-,16				; Restore Acc high
	LST		#0, *-      		; Restore ST0
	LST  	#1, *-     			; Restore ST1 and pointer

	EINT
		
	RET

		.if	x243|x2407
*******************************************************
* INT1 - PDP & Sys Peripheral Ints
* Enabled: PDPINT
*******************************************************
PDPINT_ID	.set	020h		; PDPINT vector ID
PDPINT_CLR	.set	01h			; PDPINT flag clear
		
_c_int1:
	
		MAR		*,AR1			; Save context
		MAR		*+				; point to a guaranteed unused location
		SST		#1, *+      	; save ST1
		SST  	#0, *+      	; save ST0
		SACH	*+          	; save acc high
		SACL	*+				; save acc low and point at an unused loca.
		
		;More context save if needed
		SETC	SXM				; set sign extension mode
		CLRC	OVM				; clear overflow mode
		LDP		#PIVR>>7		; set DP
		LACC	PIVR			; load peripheral int vector/ID/offset
		SUB		#PDPINT_ID		; PDPINT?
		BCND	PDP_INT,EQ		; to PDPISR if zero
		CALL	PHANTOM			; got a phantom int if not
		B		REST_INT1		; return
PDP_INT	
		LDP		#EVIFRA>>7		; set DP
		SPLK	#PDPINT_CLR,EVIFRA  ; Clear PDPINT flag
		LDP		#pdpint_flg		; set DP
		SPLK	#1,pdpint_flg	; set flag
REST_INT1		
 		;More context restore if needed
		MAR		*, AR1    		; make stack pointer active
		MAR		*-          	; point to top of stack
		LACL	*-				; Restore Acc low
		ADD		*-,16			; Restore Acc high
		LST		#0, *-      	; restore ST0
		LST  	#1, *-     		; restore ST1 and pointer
		
		EINT					
		
		RET						; return
*** END INT1 - PDP & Sys Peripheral Ints
		.endif


*******************************************************
* INT4 - EV group C Ints
* Enabled: Capture 3 int as QEP index
*******************************************************
CAP3_ID	 .set 035H			; Capture 3 int vector ID
CAP3_CLR .set 04H			; Capture 3 int flag clear
	
QEP_ISR:	

        MAR		*,AR1			; Save context
		MAR		*+				; point to a guaranteed unused location
		SST		#1, *+      	; save ST1
		SST  	#0, *+      	; save ST0
		SACH	*+          	; save acc high
		SACL	*+				; save acc low and point to an unused loca.
		
		;More context save if needed
		.if	x243 | x2407
		LDP	#PIVR>>7			; set DP
		LACC	PIVR			; load peripheral int vector/ID/offset
		.endif
		
		.if	x240
		LDP	#EVIVRC>>7
		lACC	EVIVRC
		.endif
		
		SUB		#CAP3_ID		; Capture 1 int?
		BCND	CAP3_INT,EQ		; to PDPISR if zero
		CALL	PHANTOM			; got a phantom int if not
		B		END_INT4		; return
CAP3_INT
    	.if	x243 | x2407
		LDP	#EVIFRC>>7
		SPLK	#CAP3_CLR,EVIFRC	; Clear Capture 1 int flag
		.endif
		
		CALL	QEP_INDEX_ISR_DRV	; QEP index routine 
		
;=========================================================
;End main section of ISR INT4 -EV GROUP C INTS
;=========================================================
;Context restore regs		

END_INT4		
		POINT_PG0
		MAR		*, AR1    		; make stack pointer active
		MAR		*-          	; point to top of stack
		
		;More context restore if needed
		LACL	*-				; Restore Acc low
		ADD		*-,16			; Restore Acc high
		LST		#0, *-      	; restore ST0
		LST  	#1, *-     		; restore ST1 and pointer
		
		EINT
		
		RET				    	; return

;==============================================================================
; I S R  -  PHANTOM
;
; Description:	Dummy ISR, used to trap spurious interrupts.
;
; Modifies:
;
; Last Update:	16-06-95
;==============================================================================
PHANTOM 	B	PHANTOM
PHANTOM1 	B	PHANTOM1
PHANTOM2 	B	PHANTOM2
PHANTOM3 	B	PHANTOM3
PHANTOM4 	B	PHANTOM4
PHANTOM5 	B	PHANTOM5
PHANTOM6 	B	PHANTOM6

⌨️ 快捷键说明

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