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

📄 zhtest3_2.asm

📁 这个是关于实现同步电机FOC的控制程序源代码
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;PWM波形发生模块		
    	LDP		#Mfunc_c1
		BLDD	#Ta,Mfunc_c1
 		BLDD	#Tb,Mfunc_c2
		BLDD	#Tc,Mfunc_c3      
		CALL   	FC_PWM_DRV	
;电流采样模块
        CALL	ILEG2_DCBUS_DRV
;CLARKE变换模块        
        LDP		#clark_a
        BLDD	#Imeas_a,clark_a
        BLDD	#Imeas_b,clark_b
		CALL	CLARKE        
;PARK变换模块        
        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 (step5)	;测试步骤五控制程序代码
;---------------------------------------------------------
;检测闭环控制标志
		LDP		#cl_flg
		lacc	cl_flg
		bcnd	OPENLOOP,eq
;开环磁链控制模块,此步骤不用
; 		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         ; 复位 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  
;跳过速度调节计数器加1
        LACC	sp_loop_cnt
        ADD		#1h
        SACL	sp_loop_cnt            
;d轴电流调节模块
       	LDP		#id_ref
        BLDD	#Id_ref,id_ref
        BLDD	#park_D,id_fdb
       	CALL	PID_REG3_ID
;q轴电流调节模块
        LDP		#iq_ref
        BLDD	#t_out,iq_ref
        BLDD	#park_Q,iq_fdb
       	CALL	PID_REG3_IQ 
;PARK逆变换模块
   		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  
;PWM波形发生模块		
    	LDP		#Mfunc_c1
		BLDD	#Ta,Mfunc_c1
 		BLDD	#Tb,Mfunc_c2
		BLDD	#Tc,Mfunc_c3      
		CALL   	FC_PWM_DRV	
;电流采样模块
        CALL	ILEG2_DCBUS_DRV
;CLARKE变换模块        
        LDP		#clark_a
        BLDD	#Imeas_a,clark_a
        BLDD	#Imeas_b,clark_b
		CALL	CLARKE        
;PARK变换模块
       	LDP		#park_d
        BLDD	#clark_d,park_d
        BLDD	#clark_q,park_q
        BLDD	#theta_elec,theta_p
		B 		ENDSTEP5
		
OPENLOOP								;启动时采用开环控制,同步后切入闭环
;开环磁链控制模块
		LDP		#target_value				
		BLDD	#speed_ref,target_value
        CALL	RAMP_CNTL
;开环磁链产生模块
		LDP		#rmp_freq
		BLDD	#setpt_value,rmp_freq	    
        CALL	RAMP_GEN
;d轴电流调节模块
        LDP		#id_ref
        BLDD	#Id_ref,id_ref
        BLDD	#park_D,id_fdb
       	CALL	PID_REG3_ID
;q轴电流调节模块       	
		LDP		#iq_ref
	  	BLDD	#Iq_ref,iq_ref
        BLDD	#park_Q,iq_fdb
       	CALL	PID_REG3_IQ      
;PARK逆变换模块
		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  
;PWM波形发生模块		
    	LDP		#Mfunc_c1
		BLDD	#Ta,Mfunc_c1
 		BLDD	#Tb,Mfunc_c2
		BLDD	#Tc,Mfunc_c3      
		CALL   	FC_PWM_DRV	
;电流采样模块
        CALL	ILEG2_DCBUS_DRV
;CLARKE变换模块        
        LDP		#clark_a
        BLDD	#Imeas_a,clark_a
        BLDD	#Imeas_b,clark_b
		CALL	CLARKE        
;PARK变换模块
        LDP		#park_d
        BLDD	#clark_d,park_d
        BLDD	#clark_q,park_q
        BLDD	#rmp_out,theta_p	
ENDSTEP5       
        CALL	PARK
;正交脉冲捕获及角度计算模块      
       	CALL 	QEP_THETA_DRV        	
;速度计算模块
        LDP		#theta_elec_fr
        BLDD	#theta_elec,theta_elec_fr
        CALL	SPEED_FRQ	    

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

;---------------------------------------------------------
;测试 ISR 带宽 
		SETC   	XF

        CALL	DATA_LOG       	

; 将速度参考值转换成rpm转速 (Q15 -> Q0)
		POINT_B0
		SPLK	#3000, GPR1      		; GPR1 = 基本 rpm 转速     (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)

; 检测 enable_flg 信号使,能/禁止 PWM 驱动信号(本系统中未使用)
		LACC	enable_flg
		BCND	ENABLE_DRIVE,GT
       	CALL	DIS_DRIVE       		; 禁止驱动
       	B		SKIP_DRIVE
ENABLE_DRIVE       	
        CALL	EN_DRIVE				; 使能驱动
SKIP_DRIVE 

;检测 ISR 带宽
		SETC   	XF

;=========================================================
;主 ISR 程序代码结束
;=========================================================
;恢复现场
END_ISR:
	POINT_PG0
    
    MAR		*, AR1    			; 激活栈指针
	MAR		*-          		; 指向栈顶
	
	;如果需要可恢复更多现场信息
	PSHD	*-					; 恢复 TOS
	LAR		AR6,*-				; 恢复 AR6
	LACL	*-					; 恢复 Acc 低16位
	ADD		*-,16				; 恢复 Acc 高16位
	LST		#0, *-      		; 恢复 ST0
	LST  	#1, *-     			; 恢复 ST1 栈指针

	EINT
		
	RET

		.if	x243|x2407
*******************************************************
* INT1 - PDP 和系统外围中断服务程序
* PDPINT
*******************************************************
PDPINT_ID	.set	020h		; PDPINT 向量 ID
PDPINT_CLR	.set	01h			; PDPINT 标志清除
		
_c_int1:
	
		MAR		*,AR1			; 断点保护
		MAR		*+				; 指向未被使用的位置
		SST		#1, *+      	; 保存 ST1
		SST  	#0, *+      	; 保存 ST0
		SACH	*+          	; 保存 acc 高16位
		SACL	*+				; 保存 acc 低16位并把栈指针指向未用的地址.
		
		;如果需要可保护更多现场信息
		SETC	SXM				; 允许符号扩暂
		CLRC	OVM				; 清溢出标志
		LDP		#PIVR>>7		; 加载数据页
		LACC	PIVR			; 加载外围中断向量地址偏移量
		SUB		#PDPINT_ID		; 判断示否为PDPINT
		BCND	PDP_INT,EQ		; 如果为0则转向 PDPISR 中断服务程序
		CALL	PHANTOM			; 否则转到哑中断服务程序 phantom
		B		REST_INT1		; 返回
PDP_INT	
		LDP		#EVIFRA>>7		; 设置数据页
		SPLK	#PDPINT_CLR,EVIFRA  ; 清 PDPINT 中断标志
		LDP		#pdpint_flg		; 设置数据页
		SPLK	#1,pdpint_flg	; 设置标志位
REST_INT1		
 		;如果需要可恢复更多现场信息
		MAR		*, AR1    		; 激活栈指针
		MAR		*-          	; 指向栈顶
		LACL	*-				; 恢复 Acc 低16位
		ADD		*-,16			; 恢复 Acc 高16位
		LST		#0, *-      	; 恢复 ST0
		LST  	#1, *-     		; 恢复 ST1 和栈指针
		EINT					; 使能中断					
		RET						; 返回
***  INT1 - PDP 和系统外围中断服务程序结束
		.endif


*******************************************************
* INT4 - 事件管理器C组中断处理程序
* Cap3 中断同步QEP
*******************************************************
CAP3_ID	 .set 035H			; Cap3 中断向量地址
CAP3_CLR .set 04H			; Cap3 中断标志清除
	
QEP_ISR:	

        MAR		*,AR1			; 保护断点
		MAR		*+				; 指向未被使用的位置
		SST		#1, *+      	; 保存 ST1
		SST  	#0, *+      	; 保存 ST0
		SACH	*+          	; 保存 acc 高16位
		SACL	*+				; 保存 acc 低16位并且把栈指针指向未用的地址.
		
		;如果需要可保存更多现场信息
		.if	x243 | x2407
		LDP	#PIVR>>7			; 设置数据页
		LACC	PIVR			; 加载外围中断向量地址偏移量
		.endif
		
		.if	x240
		LDP	#EVIVRC>>7
		lACC	EVIVRC
		.endif
		
		SUB		#CAP3_ID		; 判断是否Cap3 中断
		BCND	CAP3_INT,EQ		; 是则转到 CAP3_INT 中断服务程序
		CALL	PHANTOM			; 否则转到哑中断 phantom
		B		END_INT4		; 返回
CAP3_INT
    	.if	x243 | x2407
		LDP	#EVIFRC>>7
		SPLK	#CAP3_CLR,EVIFRC	; 清 Cap3 中断标志
		.endif
		
		CALL	QEP_INDEX_ISR_DRV	; QEP 同步程序 
		
;=========================================================
;INT4 -事件管理器 C 组中断代码结束
;=========================================================
;恢复断点		

END_INT4		
		POINT_PG0
		MAR		*, AR1    		; 激活栈指针
		MAR		*-          	; 指向栈顶
		
		;如果需要可恢复更多现场信息
		LACL	*-				; 恢复 Acc 低16位
		ADD		*-,16			; 恢复 Acc 高16位
		LST		#0, *-      	; 恢复 ST0
		LST  	#1, *-     		; 恢复 ST1 和栈指针
		
		EINT
		
		RET				    	; 返回

;==============================================================================
; 程序名:  PHANTOM 			类型:ISR
;
; 功能:	哑中断,用于处理异常中断
;
; 修改纪录:
; 最后修改时间:	2005.07.20   版本:Ver1.0
;==============================================================================
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 + -