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

📄 zhtest1.asm

📁 这是实现三相异步电动机FOC的DSP开发源代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;==============================================================================
; 控制系统名称:  Zhtest1
;
; 程序文件名:	Zhtest1.ASM
;
; 功能描述:	带速度传感器的三相异步电动机磁场定向控制
;
; 公司:	达盛科技
;
; 目标板:x2407
;=====================================================================================
; 修改记录:
;-------------------------------------------------------------------------------------
; 最后修改日期:2005.07.20	版本号: Ver.1.0
;==============================================================================
;******************************************************************************
;					  系统选项
;******************************************************************************
real_time	          .set	  1     ; '1' 代表实时模式, '0'代表非实时模式  

* 选择编译选项

step1  .set    0    ; 磁链给定和正弦信号发生
step2  .set    1    ; 开环启动,功率单元测试
step3  .set    0     ; 电流和速度测量模块测试
step4  .set    0     ; 电流调节器功能测试
step5  .set    0     ; 电流磁链模块插入及功能测试
step6  .set    0     ; 速度环插入及完整系统功能测试   
                                    
PWM_PERIOD	.set	100		; PWM 周期设置,单位是微秒 (10KHz) 
;T1PER_	    .set	PWM_PERIOD*10	; *1000nS/(2*50nS)
T1PER_	    .set	PWM_PERIOD*20	; *1000nS/(2*25nS)
;****************************************************************************** 

* 选择编译内部选项
         .if (step4)
constant_current       .set      0   
; Theta_p/Theta_ip 开关 ('1'代表连接到0,'0'代表连接到'rmp_out').
         .endif
                   
         .if (step5)
test_cur_mod           .set      0    
; Theta_p/Theta_ip 开关 ('1'代表连接到'rmp_out','0'代表连接到'theta_cur_mod').
         .endif
         
;-----------------------------------------------------------------------------
; 外部参量声明
;-----------------------------------------------------------------------------
		.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	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    FC_PWM_DRV,FC_PWM_DRV_INIT		    ;PWM波形产生子程序
		.ref    Mfunc_c1,Mfunc_c2,Mfunc_c3,Mfunc_p	;输入参量
		.ref    n_period			            	;输出参量   
		
		.ref	ILEG2DRV, ILEG2DRV_INIT				;电流采样子程序
		.ref	Ia_gain,Ib_gain,Ia_offset,Ib_offset	;输入参量
		.ref	Ia_out, Ib_out,V_ref				;输出参量
		
    	.ref	CLARKE, CLARKE_INIT					;CLARKE变换子程序
		.ref	clark_a, clark_b					;输入参量
		.ref	clark_d, clark_q					;输出参量
		
		.ref	PARK, PARK_INIT						;PARK变换子程序
		.ref	park_d, park_q, theta_p				;输入参量
		.ref	park_D, park_Q						;输出参量   
		
    	.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	pid_reg_id,pid_reg_id_init	    	;d轴电流调节子程序
		.ref	id_fdb,id_ref,Kp_d,Ki_d,Kc_d		;输入变量
		.ref	ud_int				            	;输入参量
		.ref	ud_out				            	;输出参量 
		
		.ref	pid_reg_iq,pid_reg_iq_init			;q轴电流调节子程序
    	.ref	iq_fdb,iq_ref,Kp_q,Ki_q,Kc_q		;输入参量
	    .ref	uq_int								;输入参量
     	.ref	uq_out								;输出参量 
     	
    	.ref	CURRENT_MODEL,CURRENT_MODEL_INIT	;电流磁链模型子程序
		.ref	i_cur_mod_D,i_cur_mod_Q				;输入参量  
		.ref	spd_cur_mod							;输入参量
		.ref	theta_cur_mod						;输出参量 
		
    	.ref	pid_reg_spd,pid_reg_spd_init 		;速度调节子程序
		.ref	spd_fdb,spd_ref						;输入参量
		.ref	spd_out								;输出参量
		
		.ref 	DATA_LOG_INIT,DATA_LOG				;图形显示数据获取子程序
		.ref	dlog_iptr1,dlog_iptr2				;输出参量
;-----------------------------------------------------------------------------
; 输入参量声明
;-----------------------------------------------------------------------------
		.def	GPR0				;通用寄存器 

		.bss	GPR0,1				;通用寄存器 ;为未初始化变量 在.bss段内保留空间
		.bss    my_iq_ref,1			;参考转矩输入  
		.bss    my_id_ref,1    		;参考励磁输入
		.bss    speed_reference,1	;参考速度输入
		.bss	isr_ticker,1
		.bss	data_tmp,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 : 上面的 include 行必须放在用户可设置的变量之后 
;==============================================================================
; 主程序代码
;==============================================================================
		.text;text[value],value 为(section programe counter spc)的起始值,缺省为0
_c_int0:
						
		CALL	SYS_INIT 
		CALL	FC_PWM_DRV_INIT ;初始化定时器
								;
		CALL    DATA_LOG_INIT	;
						
	.if (step1)
		CALL    RAMP_GEN_INIT  
		CALL    I_PARK_INIT
	.endif
		
	.if (step2)
		CALL    RAMP_GEN_INIT  
		CALL    I_PARK_INIT
		CALL	SVGEN_DQ_INIT
	.endif  
		
	.if (step3)
   		CALL    RAMP_GEN_INIT  
		CALL    I_PARK_INIT
		CALL	SVGEN_DQ_INIT
        CALL    ILEG2DRV_INIT
		CALL    CLARKE_INIT
		CALL    PARK_INIT	
		CALL    QEP_THETA_DRV_INIT
		CALL    SPEED_FRQ_INIT
	.endif
		
	.if (step4)
		CALL    RAMP_GEN_INIT  
		CALL    I_PARK_INIT
		CALL	SVGEN_DQ_INIT
        CALL    ILEG2DRV_INIT
		CALL    CLARKE_INIT
		CALL    PARK_INIT	
		CALL    QEP_THETA_DRV_INIT
		CALL    SPEED_FRQ_INIT
		CALL    pid_reg_id_init
		CALL    pid_reg_iq_init
	.endif
			  
	.if (step5)
		CALL    RAMP_GEN_INIT  
		CALL    I_PARK_INIT
		CALL	SVGEN_DQ_INIT
        CALL    ILEG2DRV_INIT
		CALL    CLARKE_INIT
		CALL    PARK_INIT	
		CALL    QEP_THETA_DRV_INIT
		CALL    SPEED_FRQ_INIT
		CALL    pid_reg_id_init
		CALL    pid_reg_iq_init
		CALL    CURRENT_MODEL_INIT	
     .endif
        
     .if (step6)
		CALL    I_PARK_INIT
		CALL	SVGEN_DQ_INIT
        CALL    ILEG2DRV_INIT
		CALL    CLARKE_INIT
		CALL    PARK_INIT	
		CALL    QEP_THETA_DRV_INIT
		CALL    SPEED_FRQ_INIT
		CALL    pid_reg_id_init
		CALL    pid_reg_iq_init
		CALL    CURRENT_MODEL_INIT	
        CALL    pid_reg_spd_init
     .endif
       
;---实时模式选项---------------
	.if (real_time)
		CALL	MON_RT_CNFG		
	.endif
;----------------------------------    

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

       LDP   #my_iq_ref				
       SPLK  #0000h,my_iq_ref		;转矩设定
       LDP   #my_id_ref				
       SPLK  #2400H,my_id_ref		;励磁设定
       LDP   #speed_reference		
       splk  #600h,speed_reference	;速度设定

     .if (step6)
       POINT_B0
       SPLK  #2400H,my_id_ref 		;励磁设定
     .endif
     	
;----------------------------------------------------------
; 系统中断初始化
;----------------------------------------------------------
	;事件管理器
		POINT_EV
		SPLK	#0000001000000000b,IMRA ;使能 T1 定时器下溢中断
		SPLK	#0000000000000100b,IMRC ;使能 CAP3 中断 (编码器z信号)
			    ;||||!!!!||||!!!!		
			    ;5432109876543210

		SPLK	#0FFFFh,IFRA	; 清所有 A 组中断标志
		SPLK	#0FFFFh,IFRB	; 清所有 B 组中断标志
		SPLK	#0FFFFh,IFRC	; 清所有 C 组中断标志

	;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		;清所有未响应中断
		EINT				    	;使能中断
		POINT_B0
;-----------------------------------------------------------------------
;使能 PWM 信号   
;-----------------------------------------------------------------------
		POINT_PF2
		LACC	OCRC
		AND		#03FFFh	
		SACL	OCRC			;选择 IOPF6 第二功能

		LACC	PFDATDIR
		OR		#04000h
		SACL	PFDATDIR		;将IOPF6设置为输出

		LACC	PFDATDIR
		AND		#0FFBFh     	;IOPF6 为低使能 PWM
;       OR		#00040h     	;IOPF6 为高禁止 PWM
		SACL	PFDATDIR  	

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

M_1	  NOP
      NOP
	  NOP
      CLRC XF	
      B	MAIN
;======================================================
;===========================================================================
; 程序名: T1_PERIOD_ISR				    程序类型: ISR
;
; 功能描述:断点保护
;
; 公司: 达盛科技
; 修改记录:
; 最后修改日期:	2005.7.10
;===========================================================================
T1_PERIOD_ISR:
;断点保护
		MAR	*,AR1			; AR1 作为栈指针
		MAR	*+          	; 指针加1
		SST	#1, *+      	; 保存 ST1
		SST   #0, *+      	; 保存 ST0
		SACH	*+          ; 保存 acc 高16位
		SACL	*			; 保存 acc 低16位

		POINT_EV
		SPLK	#0FFFFh,IFRA; 清所有A组中断标志 (T1 ISR)
        SETC    XF  
        SETC	SXM			; 允许符号扩展
		CLRC	OVM			; 清除溢出标志
        
        POINT_B0
        
        ; 校验 ISR
		LACC 	isr_ticker	
		ADD		#1			
		SACL    isr_ticker
		          
;=========================================================
;主循环中断服务程序开始
;=========================================================
     .if (step1) 
; Ramp 产生模块
	    CALL    RAMP_GEN
; Park 逆变换模块 
		LDP		#theta_ip  
		BLDD	#rmp_out,theta_ip  
        CALL     I_PARK
; PWM 模块
        CALL     FC_PWM_DRV     ;设置 PWM 频率为10kHz
      .endif
******************************************        
      .if (step2)
; Ramp产生模块
	    CALL    RAMP_GEN
; Park逆变换模块
		LDP		#theta_ip  
		BLDD	#rmp_out,theta_ip  
        CALL     I_PARK 
; 电压空间是两计算模块
		LDP		#Ualfa

⌨️ 快捷键说明

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