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

📄 test8.asm

📁 这是实现三相异步电动机FOC的DSP开发源代码
💻 ASM
字号:
;==============================================================================
; 程序文件名:	test8.ASM
;
; 功能描述:	基于光电编码器的速度测量模块测试实验
;
; 公司:	达盛科技
;
; 目标板:x2407
;=====================================================================================
; 修改记录:
;-------------------------------------------------------------------------------------
; 最后修改日期:2005.07.20	版本号: Ver.1.0
;==============================================================================
;******************************************************************************
;					  系统选项
;******************************************************************************
real_time	          .set	  1     ; '1' 代表实时模式, '0'代表非实时模式  

* 选择编译选项
                                    
PWM_PERIOD	.set	100		; PWM 周期设置,单位是微秒 (10KHz) 
;T1PER_	    .set	PWM_PERIOD*10	; *1000nS/(2*50nS)
T1PER_	    .set	PWM_PERIOD*20	; *1000nS/(2*25nS)
;****************************************************************************** 
;-----------------------------------------------------------------------------
; 外部参量声明
;-----------------------------------------------------------------------------
		.include	"x24x_app.h"

		.global MON_RT_CNFG

		.ref	SYS_INIT   
		
		.ref	RAMP_GEN, RAMP_GEN_INIT				;磁链给定子程序
		.ref	rmp_gain, rmp_offset, rmp_freq		;输入参量
    	.ref	step_angle_max				    	;输入参量
		.ref	rmp_out					        	;输出参量   
		
		.ref    FC_PWM_DRV,FC_PWM_DRV_INIT		    ;PWM波形产生子程序
		.ref    Mfunc_c1,Mfunc_c2,Mfunc_c3,Mfunc_p	;输入参量
		.ref    n_period			            	;输出参量   
		
		.ref	I_PARK, I_PARK_INIT					;PARK逆变换子程序
		.ref	ipark_D, ipark_Q, theta_ip			;输入参量
		.ref	ipark_d, ipark_q					;输出参量
		
		.ref	SVGEN_DQ,SVGEN_DQ_INIT				;矢量计算子程序
		.ref	Ualfa,Ubeta					    	;输入参量
		.ref	Ta,Tb,Tc					    	;输出参量
		
    	.ref	QEP_THETA_DRV,QEP_THETA_DRV_INIT	;编码器脉冲计数子程序
		.ref	polepairs,cal_angle,mech_scale		;输入参量
		.ref	theta_elec,theta_mech,dir_QEP		;输出参量

		.ref	QEP_INDEX_ISR_DRV					;编码器复位子程序
		.ref	index_sync_flg,QEP_cnt_idx			;输出参量 
		
    	.ref	SPEED_FRQ, SPEED_FRQ_INIT			;速度计算子程序
		.ref	shaft_angle, direction				;输入参量
		.ref	speed_frq, speed_frq_rpm			;输出参量

		.ref 	DATA_LOG_INIT,DATA_LOG				;图形显示数据获取子程序
		.ref	dlog_iptr1,dlog_iptr2				;输出参量
;-----------------------------------------------------------------------------
; 输入参量声明
;-----------------------------------------------------------------------------
		.def	GPR0				;通用寄存器 

		.bss	GPR0,1				;通用寄存器  
		.bss	isr_ticker,1
	
;==============================================================================
;向量表( 包括实时模式监控程序 )
;==============================================================================
        .include "c200mnrt.i" 	; 条件编译选项

		.sect "vectors"  
		.def 	_c_int0 
		.def	_c_int4		; int4-EV group C dispatcher/service

RESET	    B	  _c_int0 	 		; 00
INT1	    B	  PHANTOM	 		; 02
INT2	    B	  T1_PERIOD_ISR     ; 04
INT3	    B	  PHANTOM	 		; 06
INT4	    B	  _c_int4			; 08
INT5	    B	  PHANTOM	 		; 0A
INT6	    B	  PHANTOM	 		; 0C

		.include	"rtvecs.h"

; Note : The above include line must be AFTER the user configurable 
;        vectors. Do not change the place where this line is included.

;==============================================================================
; 主程序代码
;==============================================================================
		.text
_c_int0:
						
		CALL	SYS_INIT 
		CALL	FC_PWM_DRV_INIT ;初始化定时器
		CALL    DATA_LOG_INIT	;
		CALL    RAMP_GEN_INIT  
		CALL    I_PARK_INIT
		CALL    SVGEN_DQ_INIT
		CALL    QEP_THETA_DRV_INIT
		CALL    SPEED_FRQ_INIT

;---实时模式选项---------------
	.if (real_time)
		CALL	MON_RT_CNFG		
	.endif
;----------------------------------    

;-----------------------------------
;    用户初始化参量输入
;---------------------------------- 
       LDP   #n_period
	   SPLK	 #T1PER_,n_period		;初始化 PWM 频率10kHz
	   						
	   LDP   #rmp_freq
	   SPLK  #2a00h,rmp_freq 		;磁场频率设定							 

;----------------------------------------------------------
; 系统中断初始化
;----------------------------------------------------------
	;事件管理器
		POINT_EV
		SPLK	#0000001000000000b,IMRA ;使能 T1 定时器下溢中断
		SPLK	#0000000000000100b,IMRC ;使能 CAP3 中断 (编码器z信号)
			    ;||||!!!!||||!!!!		
			    ;5432109876543210

		SPLK	#0FFFFh,IFRA	; Clear all Group A interrupt flags
		SPLK	#0FFFFh,IFRB	; Clear all Group B interrupt flags
		SPLK	#0FFFFh,IFRC	; Clear all Group C interrupt flags

	;C2xx Core
		POINT_PG0

;---实时模式选项 --------------------------------------------------
	.if (real_time)
		SPLK	#0000000001001010b,IMR	;En Int lvl 3,7 (T2 ISR)
			     ;5432109876543210
	.endif


	.if (real_time != 1)
		SPLK	#0000000000001010b,IMR	;En Int lvl 4 (CAP3/QEP ISR)
	     	   	;||||!!!!||||!!!!		
		    	;5432109876543210
	.endif

		SPLK	#0FFFFh, IFR		;Clear any pending Ints
		EINT				    	;Enable global Ints
		POINT_B0
;-----------------------------------------------------------------------
;使能 PWM 信号   
;-----------------------------------------------------------------------
	.if (x243|x2407)			;目标板设定
		POINT_PF2
		LACC	OCRA
		AND		#0BFFFh	
		SACL	OCRA			;选择 IOPB6 第二功能

		LACC	PBDATDIR
		OR		#04000h
		SACL	PBDATDIR		;Set IOPB6 as output

		LACC	PBDATDIR
		AND		#0FFBFh     	;IOPB6 为低使能 PWM
;       OR		#00040h     	;IOPB6 为高禁止 PWM
		SACL	PBDATDIR  	
	.endif

;======================================================
MAIN:		;系统主程序循环
;======================================================

M_1	  NOP
      NOP
	  NOP
      CLRC XF	
      B	MAIN
;======================================================


;===========================================================================
; 程序名: T1_PERIOD_ISR				    程序类型: ISR
;
; 功能描述:断点保护
;
; 公司: 达盛科技
; 修改记录:
; 最后修改日期:	2005.7.10
;===========================================================================
T1_PERIOD_ISR:
;Context save regs
		MAR	*,AR1			;AR1 is stack pointer
		MAR	*+          	;skip one position
		SST	#1, *+      	;save ST1
		SST   #0, *+      	;save ST0
		SACH	*+          ;save acc high
		SACL	*			;save acc low

		POINT_EV
		SPLK	#0FFFFh,IFRA  	; Clear all Group A interrupt flags (T1 ISR)
        SETC    XF  
        SETC	SXM				; 允许符号扩展
		CLRC	OVM				; 清除溢出标志
        
        POINT_B0
        
        ; 校验 ISR
		LACC 	isr_ticker	
		ADD		#1			
		SACL    isr_ticker
		          
;=========================================================
;主循环中断服务程序开始
;=========================================================
; QEP 模块 
        CALL QEP_THETA_DRV  
; SPEED_FR 模块    
        LDP  #shaft_angle
        BLDD #theta_mech,shaft_angle
        BLDD #dir_QEP,direction 
        CALL SPEED_FRQ      
; Ramp 产生模块
	    CALL    RAMP_GEN
; I_Park 模块
		LDP		#theta_ip     
		BLDD    #rmp_out,theta_ip
        CALL     I_PARK
; 电压空间矢量计算模块
		LDP		#Ualfa
		BLDD	#ipark_d,Ualfa
		BLDD	#ipark_q,Ubeta		        
		CALL	SVGEN_DQ   
; PWM 模块
		LDP		#Mfunc_c1
		BLDD	#Ta,Mfunc_c1	
		BLDD	#Tb,Mfunc_c2
		BLDD	#Tc,Mfunc_c3		
		CALL    FC_PWM_DRV
;DATA_LOG
       ; ldp 	#dlog_iptr1			;
       ; SPLK	#rmp_out,dlog_iptr1	;
       ; SPLK	#Ib_out,dlog_iptr2	;
        CALL    DATA_LOG			;
;=========================================================
;主循环中断服务程序结束
;=========================================================
;断点恢复
END_ISR:
		POINT_PG0

		MAR	*, AR1    	;make stack pointer active
		LACL	*-		;Restore Acc low
		ADDH	*-		;Restore Acc high
		LST	#0, *-      ;load ST0
		LST     #1, *-  ;load ST1
		EINT
		RET 
*******************************************************  
* INT4 - EV group C Ints开始
* Cap3 中断使能
*******************************************************
CAP3_ID	 .set 035H			; Cap3 中断向量
CAP3_CLR .set 04H			; Cap3 中断标志清除
	
_c_int4	

        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	REST_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 结束
;=========================================================

;断点恢复		

REST_INT4		;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
				
;==============================================================================
; I S R  -  PHANTOM
;
; 功能描述:	哑中断服务程序
;
; 修改记录:
; 最后更新日期:	2005.6.23
;==============================================================================
PHANTOM 	B	PHANTOM







    

⌨️ 快捷键说明

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