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

📄 zhtest2b.asm

📁 这是关于有刷直流电动机PWM控制方案的源码
💻 ASM
字号:
;==============================================================================
; 系统名:双闭环pwm直流调速系统
;
; 程序文件名:	Zhtest2.ASM
;
; 功能描述:	转速电流双闭环控制的双极性pwm有刷直流电机调速系统
;
; 公司:	达盛科技
;
; 目标板:x2407
;=====================================================================================
; 修改记录:
;-------------------------------------------------------------------------------------
; 最后修改日期:2005.07.20	版本号: Ver.1.0
;==============================================================================
;******************************************************************************
;					  系统选项
;******************************************************************************
real_time	          .set	  1     ; '1' 代表实时模式, '0'代表非实时模式  

* 选择编译选项

step1  .set    1     ; 开环启动,功率单元测试
step2  .set    0     ; 电流和速度测量模块测试
step3  .set    0     ; 电流调节器功能测试
step4  .set    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,rmp_out_abs					;输出参量   
		
		.ref    DC_PWM_DRV,DC_PWM_DRV_INIT		    ;PWM波形产生子程序
		.ref    Mfunc,Mfunc_p						;输入参量
		.ref    n_period			            	;输出参量   

		.ref	GI_A,GI_A_INIT  ; 给定积分子程序
		.ref	gi_ref,gi_step	; 输入参量
		.ref	gi_out			; 输出参量

		.ref	ILEG2DRV, ILEG2DRV_INIT				;电流采样子程序
		.ref	Ia_gain,Ib_gain,Ia_offset,Ib_offset	;输入参量
		.ref	Ia_out, Ib_out					    ;输出参量		

    	.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_iq,pid_reg_iq_init	    	;q轴电流调节子程序
		.ref	iq_fdb,iq_ref,Kp_q,Ki_q,Kc_q		;输入变量
		.ref	uq_int				            	;输入参量
		.ref	uq_out				            	;输出参量
		
		.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	isr_ticker,1
		.bss	Dir_ref,1			;参考方向
		.bss	Ton_ref,1			;参考占空比
		.bss	step_ref,1			;给定积分步长
		.bss	speed_ref,1			;速度给定
		.bss	my_iq_ref,1			;电流参考给定
	
;==============================================================================
;向量表( 包括实时模式监控程序 )
;==============================================================================
        .include "c200mnrt.i" 	; 条件编译选项

		.sect "vectors"  
		.def 	_c_int0 

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	DC_PWM_DRV_INIT 	;初始化定时器
		CALL    RAMP_GEN_INIT		;显示触发程序初始化
		CALL    DATA_LOG_INIT		;显示程序初始化

	.if (step1)
		CALL    GI_A_INIT			;斜坡给定程序初始化
	.endif
		
	.if (step2)
		CALL    GI_A_INIT			;斜坡给定程序初始化
        CALL    ILEG2DRV_INIT		;电流采样程序初始化
		CALL    QEP_THETA_DRV_INIT 	;脉冲计数程序初始化
		CALL    SPEED_FRQ_INIT  	;速度计算程序初始化
 	.endif
		
	.if (step3)
;		CALL    GI_A_INIT			;斜坡给定程序初始化
        CALL    ILEG2DRV_INIT		;电流采样程序初始化
		CALL    QEP_THETA_DRV_INIT	;脉冲计数程序初始化
		CALL    SPEED_FRQ_INIT		;速度计算程序初始化
		CALL    pid_reg_iq_init		;电流调节程序初始化
	.endif
			  
    .if (step4)
		CALL    GI_A_INIT			;斜坡给定程序初始化
        CALL    ILEG2DRV_INIT		;电流采样程序初始化
		CALL    QEP_THETA_DRV_INIT	;脉冲计数程序初始化
		CALL    SPEED_FRQ_INIT		;速度计算程序初始化
		CALL    pid_reg_iq_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   #Ton_ref
	   SPLK	 #3000H,Ton_ref			;初始化 PWM 输出占空比

	   LDP   #step_ref
	   SPLK	 #1H,step_ref			;给定信号步长	   

	   LDP   #rmp_freq
	   SPLK  #5000h,rmp_freq 		;显示刷新频率设定
	   
	   LDP   #speed_ref
	   SPLK  #0500,speed_ref 		;转速设定
	   
	   LDP   #my_iq_ref
	   SPLK  #0500h,my_iq_ref 		;转矩设定	   	   							 							 	   							 							 

;----------------------------------------------------------
; 系统中断初始化
;----------------------------------------------------------
	;事件管理器
		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		;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
		          
;=========================================================
;主循环中断服务程序开始
;=========================================================
	 .if (step1) 			;测试步骤一控制程序
     
; 积分给定模块 
		LDP		#gi_ref  
		BLDD	#Ton_ref,gi_ref
		BLDD	#step_ref,gi_step		  
        CALL     GI_A
; PWM 模块
 	    LDP		#Mfunc	  
		BLDD	#gi_out,Mfunc
      	CALL     DC_PWM_DRV     ;设置 PWM 频率为10kHz
       
     .endif
     
******************************************

     .if (step2) 			;测试步骤二控制程序
     
; 电流采样
        CALL      ILEG2DRV 

; 脉冲计数模块 
        CALL QEP_THETA_DRV

; 积分给定模块 
		LDP		#gi_ref  
		BLDD	#Ton_ref,gi_ref
		BLDD	#step_ref,gi_step		  
        CALL     GI_A   

; 速度计算模块    
        LDP  #shaft_angle
        BLDD #theta_mech,shaft_angle
        BLDD #dir_QEP,direction 
        CALL SPEED_FRQ             
	
; PWM 模块
 	    LDP		#Mfunc	  
		BLDD	#gi_out,Mfunc
      	CALL     DC_PWM_DRV     ;设置 PWM 频率为10kHz

     .endif  
******************************************
        
     .if (step3) 		;测试步骤三控制程序
     
; 电流采样及测量模块
        CALL      ILEG2DRV 
   
; 脉冲计数模块 
        CALL QEP_THETA_DRV  

; 速度测量模块    
        LDP  #shaft_angle
        BLDD #theta_mech,shaft_angle
        BLDD #dir_QEP,direction 
        CALL SPEED_FRQ  

; 电流调节
        LDP      #iq_ref  
        BLDD     #my_iq_ref,iq_ref
        BLDD     #Ia_out,iq_fdb
        CALL     pid_reg_iq  
	
; PWM 模块
		LDP		#Mfunc
		BLDD	#uq_out,Mfunc	
		CALL    DC_PWM_DRV   
		
     .endif   
******************************************
    
     .if (step4) 			;测试步骤四控制程序
        
; Ileg2drv module
        CALL      ILEG2DRV 	;电流采样计算控制程序
 
; 脉冲计数 
        CALL QEP_THETA_DRV  ;速度采样控制程序
; 积分给定模块 
;		LDP		#gi_ref 			;测试用代码start 
;		BLDD	#Ton_ref,gi_ref		;
;		BLDD	#step_ref,gi_step	;	  
;       CALL     GI_A				;end
; 速度调节 
        LDP     #spd_ref
;        bldd    #gi_out,spd_ref    ;测试速度参考输入
        bldd    #speed_ref,spd_ref  ;速度参考输入
        bldd    #speed_frq,spd_fdb	;速度反馈输入
;		bldd    #spd_out,spd_fdb	;测试速度反馈输入
        CALL    pid_reg_spd                 

; 速度计算    
        LDP  #shaft_angle
        BLDD #theta_mech,shaft_angle
        BLDD #dir_QEP,direction 
        CALL SPEED_FRQ 
             
; 电流调节
        LDP      #iq_ref  
        BLDD     #spd_out,iq_ref	  ;电流参考输入
        BLDD     #Ia_out,iq_fdb 	  ;电流反馈输入
;		BLDD     #uq_out,iq_fdb 	  ;测试
        CALL     pid_reg_iq  

; pwm模块
		LDP		#Mfunc
;		BLDD	#gi_out,Mfunc      	  ;测试
		BLDD	#uq_out,Mfunc		  ;参考占空比输入,有电流环
;		BLDD	#spd_out,Mfunc		  ;参考占空比输入,无电流环
		CALL    DC_PWM_DRV   

     .endif     

; 显示触发信号  
        CALL    RAMP_GEN

; 显示模块
        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 + -