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

📄 zhtest3_2.asm

📁 这个是关于实现同步电机FOC的控制程序源代码
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;==============================================================================
; 文件名:	Zhtest3_2.ASM  
;
; 系统名:  Zhtest3_2(永磁同步电机FOC控制系统)
;
; 功能:	带速度传感器的三相永磁同步电机磁场定向控制 
;              
; 公司:	达盛科技
;
; 目标CPU:	x2407
;
; 修改记录:	
; ____________________________________________________________________________
; 最后更新时间: 2005.08.21   版本:Ver1.0
;==============================================================================

;******************************************************************************
;					  系统选项
;******************************************************************************
real_time	        .set	1      	; 选择'1'代表实时模式, '0'代表非实时模式
;******************************************************************************
;-----------------------------------------------------------------------------
step1	.set    1 		; 矢量计算和pwm产生模块测试
step2	.set	0     	; 电流测量模块测试
step3	.set	0  		; 两组 PI电流调节器测试
step4	.set	0	    ; QEP模块和角度计算模块测试
step5	.set	0       ; 速度闭环完整系统测试
    								
;-----------------------------------------------------------------------------
; 全局变量声明
;-----------------------------------------------------------------------------

        .include	"x24x_app.h"
            
		.global 	MON_RT_CNFG
        
		.ref	SYS_INIT

		.ref	RAMP_CNTL, RAMP_CNTL_INIT				; 子程序调用
		.ref	target_value 							; 输入
		.ref	rmp_dly_max, rmp_lo_limit				; 输入参数
		.ref	rmp_hi_limit							; 输入参数
		.ref	setpt_value, s_eq_t_flg					; 输出

 		.ref	FC_PWM_DRV, FC_PWM_DRV_INIT				;子程序调用
		.ref	Mfunc_c1, Mfunc_c2, Mfunc_c3, Mfunc_p	;输入
 
		.ref	CLARKE, CLARKE_INIT						;子程序调用
		.ref	clark_a, clark_b						;输入
		.ref	clark_d, clark_q						;输出

		.ref	ILEG2_DCBUS_DRV, ILEG2_DCBUS_DRV_INIT				;子程序调用	
		.ref	Ch_sel, Imeas_a_gain, Imeas_b_gain, Vdc_meas_gain  	;输入参数
		.ref	Imeas_a_offset, Imeas_b_offset, Vdc_meas_offset   	;输入参数
		.ref	Imeas_a,Imeas_b,Imeas_c								;输出
		.ref	Vdc_meas											;输出

		.ref	I_PARK, I_PARK_INIT						;子程序调用
		.ref	ipark_D, ipark_Q, theta_ip				;输入
		.ref	ipark_d, ipark_q						;输出
                                                    	
		.ref	PARK, PARK_INIT							;子程序调用
		.ref	park_d, park_q, theta_p					;输入
		.ref	park_D, park_Q							;输出

		.ref	RAMP_GEN, RAMP_GEN_INIT					;子程序调用
		.ref	rmp_gain, rmp_offset, rmp_freq			;输入
		.ref	step_angle_max							;输入
		.ref	rmp_out									;输出

		.ref	SVGEN_DQ,SVGEN_DQ_INIT					;子程序调用
		.ref	Ualfa,Ubeta								;输入
		.ref	Ta,Tb,Tc								;输出

		.ref	PID_REG3_ID,PID_REG3_ID_INIT			; 子程序调用
		.ref	id_fdb,id_ref							; 输入
		.ref	ud_out									; 输出

		.ref	PID_REG3_IQ,PID_REG3_IQ_INIT			; 子程序调用
		.ref	iq_fdb,iq_ref							; 输入
		.ref	uq_out									; 输出

		.ref	PID_REG3_SPD,PID_REG3_SPD_INIT			; 子程序调用
		.ref	spd_fdb,spd_ref							; 输入
		.ref	t_out									; 输出
		
		.ref	EN_DRIVE,DIS_DRIVE,DRIVE_INIT			; 子程序调用

		.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	theta_elec_fr          					; 输入
		.ref	speed_frq, speed_frq_rpm	    		; 输出
		
		.ref	DATA_LOG, DATA_LOG_INIT					; 子程序调用
;
;-----------------------------------------------------------------------------
; 局部变量定义
;-----------------------------------------------------------------------------
		.def	GPR0			;通用寄存器.
		.def	GPR1
		.def	GPR2
		.def	GPR3
		.def	GPR4
        .def	COMCON
        		
		.bss	GPR0,1			;通用寄存器.
		.bss	GPR1,1
		.bss	GPR2,1
		.bss	GPR3,1
		.bss	GPR4,1
        
		.bss	speed_ref,1		;输入参数及标志位
	    .bss	speed_ref_rpm,1
		.bss	Vd_testing,1
		.bss	Vq_testing,1
		.bss	Id_ref,1
		.bss	Iq_ref,1
	    .bss	lockrtr_flg,1
        .bss	enable_flg,1
        .bss	cl_flg,1
        .bss	pdpint_flg,1
        
        .bss	sp_loop_cnt,1	;计数器参数
        .bss	sp_loop_max,1
        .bss	isr_ticker,1
        .bss	data_tmp,1			;临时变量
      
;==============================================================================
; 中断向量表
;==============================================================================
		.include "c200mnrt.i"  	; 包含汇编条件选项.
		.sect "vectors"  
		.def 	_c_int0
		.def	QEP_ISR			; int4-事件管理器 C 组中断服务

RESET	    B	  _c_int0 	 	; 00
INT1	    B	  _c_int1	 	; 02
INT2	    B	  T1UF_ISR   	; 04
INT3	    B	  PHANTOM	 	; 06
INT4	    B	  QEP_ISR		; 08
INT5	    B	  PHANTOM	 	; 0A
INT6	    B	  PHANTOM	 	; 0C

 		.include	"rtvecs.h"

; 注意 : 上面的 include 行 必须放置在用户可设定的变量之后 
;==============================================================================
; 主程序代码开始
;==============================================================================
		.text
_c_int0:								;公共初始化子程序调用
		CALL	SYS_INIT				;系统初始化
		CALL	DATA_LOG_INIT			;显示数据获取程序初始化
        CALL	RAMP_GEN_INIT			;开环磁链产生模块初始化
		CALL	RAMP_CNTL_INIT			;磁链控制模块初始化
		CALL	SVGEN_DQ_INIT			;电压空间矢量模块初始化
		CALL	FC_PWM_DRV_INIT			;PWM波形发生模块初始化
        CALL	ILEG2_DCBUS_DRV_INIT   	;电流采样模块初始化
        CALL	CLARKE_INIT  			;CLARKE变换模块初始化
        CALL	I_PARK_INIT				;PARK逆变换模块初始化
        CALL	PARK_INIT  				;PARK变换模块初始化
        CALL	PID_REG3_ID_INIT		;d轴电流调节模块初始化
        CALL	PID_REG3_IQ_INIT		;q轴电流调节模块初始化
        CALL	PID_REG3_SPD_INIT 		;速度调节模块初始化
 		CALL	DRIVE_INIT				;驱动使能模块初始化
		CALL	QEP_THETA_DRV_INIT		;QEP及角度计算模块初始化
        CALL	SPEED_FRQ_INIT      	;速度计算模块初始化
              
;------------------------------------------------------------------------------------------
;系统时基初始化
;------------------------------------------------------------------------------------------
;时基通过 T1 下溢中断产生,初始化在pwm初始化程序FC_PWM_DRV_INIT中完成 
;----------------------------------------------------------
; 实时监控程序初始化
;----------------------------------------------------------
;---实时模式选项---------------
	.if (real_time)
		CALL	MON_RT_CNFG		;实时监控程序
	.endif
;----------------------------------

	.if	(real_time)				; 等待手动使能
			POINT_B0
			SPLK	#1,enable_flg
			SPLK	#0,cl_flg

WAIT_ENABLE	LACC	enable_flg
			BCND	WAIT_ENABLE,EQ
	.endif
        	
        CALL	EN_DRIVE		; 驱动使能程序,本系统中未用
            
;----------------------------------------------------------
; 系统中断初始化
;----------------------------------------------------------
	;事件管理器
		POINT_EV
;		SPLK	#0000001000000000b,IMRA ;Enable T1 Underflow Int (i.e. Period)
		SPLK	#0000001000000001b,IMRA ;Enable T1 Underflow Int (i.e. Period)
;		SPLK	#0000000000000100b,IMRB ;Enable T2 Underflow Int (i.e. Period)
		SPLK	#0000000000000100b,IMRC ;Enable CAP3 int (i.e. QEP index pulse)
			    ;||||!!!!||||!!!!		
			    ;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 2,4,7 (T1 ISR, CAP3 ISR)
	.endif


	.if (real_time != 1)
		SPLK	#0000000000001010b,IMR	;En Int lvl 2,4 (T1 ISR, CAP3 ISR)
;		SPLK	#0000000000000100b,IMR	;En Int lvl 3 (T2 ISR)
				;||||!!!!||||!!!!		
				;5432109876543210
	.endif

		SPLK	#0FFFFh, IFR		;清所用未决中断
		EINT						;使能中断
 
;-----------------------------------------------------------------------
;使能 PWM 信号输出(本系统中未使用,techv cpu板可通过转接板指示灯观测)  
;-----------------------------------------------------------------------
	.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     ;Set IOPB6 low, Enable PWM
;       OR		#00040h     ;Set IOPB6 high, Disable PWM
		SACL	PBDATDIR  	
	.endif

;---------------------------------------------------------
;系统初始化程序编译选项
;---------------------------------------------------------
		POINT_B0   
;---------------------------------------------------------
	.if (step1)	;测试步骤一初始化程序代码
;---------------------------------------------------------
        SPLK	#01000h, speed_ref        ; 转速参考值初始化Q15
        SPLK	#00800h, Vd_testing       ; d轴电压分量初始化Q15
        SPLK	#00000h, Vq_testing       ; q轴电压分量初始化Q15
        SPLK	#0,pdpint_flg             ; 复位 PDPINT_FLG
              
       	LDP		#step_angle_max           ; 开环磁链发生模块初始化
      	SPLK	#1638,step_angle_max      ; 对应 fbase=250Hz, fs=10kHz

   		LDP		#rmp_dly_max      		  ; 磁链控制模块初始化
       	SPLK	#120,rmp_dly_max		  ; 延迟周期数初始化
       	SPLK	#8000h,rmp_lo_limit		  ; 输出下限
		SPLK	#7FFFh,rmp_hi_limit		  ; 输出上限

	.endif

;---------------------------------------------------------
	.if (step2)	;测试步骤二初始化程序代码
;---------------------------------------------------------
        SPLK	#01000h, speed_ref        ; 转速参考值初始化Q15
        SPLK	#01000h, Vd_testing       ; d轴电压分量初始化Q15
        SPLK	#01000h, Vq_testing       ; q轴电压分量初始化Q15
        SPLK	#0,pdpint_flg             ; 复位 PDPINT_FLG
                        
       	LDP		#step_angle_max           ; 磁链发生模块初始化
      	SPLK	#1638,step_angle_max      ; 对应 fbase=250Hz, fs=10kHz        

       	LDP		#cal_angle                ; QEP模块初始化
		SPLK	#350,cal_angle            ; 根据编码器连接情况确定

   		LDP		#rmp_dly_max      		  ; 磁链控制模块初始化
       	SPLK	#120,rmp_dly_max		  ; 延迟周期数初始化
       	SPLK	#8000h,rmp_lo_limit		  ; 输出下限
		SPLK	#7FFFh,rmp_hi_limit		  ; 输出上限
		
	.endif
;---------------------------------------------------------

;---------------------------------------------------------
	.if (step3) ;测试步骤三初始化程序代码
;---------------------------------------------------------
        SPLK	#01000h, speed_ref        ; 转速参考值初始化Q15 
        SPLK	#0,pdpint_flg             ; 复位 PDPINT_FLG
        SPLK	#0000h, Id_ref            ; 励磁电流参考值初始化Q15
       	SPLK	#1000h, Iq_ref            ; 转矩电流参考值初始化Q15

       	LDP		#step_angle_max           ; 磁链发生模块初始化
      	SPLK	#1638,step_angle_max      ; 对应 fbase=250Hz, fs=10kHz        

   		LDP		#rmp_dly_max      		  ; 磁链控制模块初始化
       	SPLK	#120,rmp_dly_max		  ; 延迟周期数初始化
       	SPLK	#8000h,rmp_lo_limit		  ; 输出下限
		SPLK	#7FFFh,rmp_hi_limit		  ; 输出上限

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

;---------------------------------------------------------
	.if (step4)	;测试步骤四初始化程序代码
;---------------------------------------------------------
       	SPLK	#01000h, speed_ref        ; 速度参考值初始化Q15 
        SPLK	#0,lockrtr_flg            ; lockrtr_flg初始化 
        SPLK	#0,pdpint_flg             ; pdpint_flg初始化

        SPLK	#0000h, Id_ref            ; 励磁电流参考值初始化Q15
       	SPLK	#1000h, Iq_ref            ; 转矩电流参考值初始化Q15

       	LDP		#step_angle_max           ; 磁链发生模块初始化
      	SPLK	#1638,step_angle_max      ; 对应 fbase=250Hz, fs=10kHz        
 
       	LDP		#cal_angle                ; QEP模块初始化

⌨️ 快捷键说明

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