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

📄 zhtest4.asm

📁 这个是直流无刷电机的基于DSP2407的速度控制源代码
💻 ASM
字号:
;=========================================================================================
; 系统名:	直流无刷电机控制系统
;
; 文件名:	Zhtest4.ASM 
;
; 功能描述:	通过霍尔传感器的换相信号实现直流无刷电动机的控制	
;
; 公司:	达盛科技
;
; 目标板: F2407
;=====================================================================================
; 修改记录:
;-------------------------------------------------------------------------------------
; 2005.08.25	版本	Ver 1.0
;==========================================================================================

;系统选项
;******************************************************************************************

real_time			.set	1   ;实时模式运行选择'1'

		.include	"x24x_app.h"                                     

 ;-----------------------------------------------------------------------------
; 外部变量及函数声明
;-----------------------------------------------------------------------------

		.global MON_RT_CNFG

		.ref	SYS_INIT

		.ref	RMP2CNTL, RMP2CNTL_INIT				;给定子程序调用
		.ref	rmp2_dly, rmp2_desired				;输入 
        .ref	rmp2_out    						;输出
		.ref	rmp2_max, rmp2_min

		.ref	MOD6_CNT, MOD6_CNT_INIT				;模6计数器子程序调用
		.ref	m6_trig_in, m6_cntr					;输入输出
        
		.ref	HALL3_DRV, HALL3_DRV_INIT			;霍尔换相驱动子程序调用
		.ref	cmtn_trig_hall, hall_map_ptr		;输入

		.ref	BLDC_3PWM_DRV, BLDC_3PWM_DRV_INIT	;三相无刷电机pwm子程序调用
		.ref	cmtn_ptr_bd, D_func, Mfunc_p		;输入

		.ref	DATA_LOG, DATA_LOG_INIT				;显示数据获取子程序调用
		.ref	dlog_iptr1, dlog_iptr2				;输出
		.ref	trig_value							;输入
  
;************************************************************

;-----------------------------------------------------------------------------
; 内部变量声明
;-----------------------------------------------------------------------------

;SYSTEM_INT_PERIOD	.set	758		;25 uS 采样周期 @33nS CPU clock           
SYSTEM_INT_PERIOD	.set	1000	;25 uS 采样周期 @25nS CPU clock           
		
		.def	_c_int0, PHANTOM, T2_PERIOD_ISR		
		.def	GPR0				;通用寄存器.
		.def	v_timer		

BLDC_vars		.usect	"BLDChall",3,1
GPR0			.set	BLDC_vars+0
v_timer			.set	BLDC_vars+1         
D_func_desired	.set	BLDC_vars+2
                                                                                        
        		.bss 	isr_ticker,1
         
;==============================================================================
; 主程序代码开始
;==============================================================================
		.text
_c_int0:  		
		CALL	SYS_INIT
		CALL	BLDC_3PWM_DRV_INIT
       	CALL    RMP2CNTL_INIT  
		CALL	MOD6_CNT_INIT
        CALL    HALL3_DRV_INIT       

		CALL	DATA_LOG_INIT
;------------------------------------------------------
;系统时基初始化
;------------------------------------------------------
;	时基取决于 T2 下溢中断 (也就是系统周期)
;	in BLDC_PWM_DRV module.

	;初始化周期寄存器
		POINT_EV
		SPLK	#SYSTEM_INT_PERIOD, T2PR

				;5432109876543210
				;||||!!!!||||!!!!
		SPLK	#1001000001000000b, T2CON  	;通用定时器初始化

            		            		
;----------------------------------------------------------
; 实时监控程序初始化
;---实时监控程序使能---------------
	.if (real_time)
		CALL	MON_RT_CNFG			;实时监控程序调用
	.endif
;----------------------------------------------------------

;----------------------------------------------------------
; 系统中断初始化.
;----------------------------------------------------------

	;事件管理器初始化
		POINT_EV
;		SPLK	#0000001000000000b,EVIMRA ;使能 T1 下溢中断 
		SPLK	#0000000000000100b,EVIMRB ;使能 T2 下溢中断
		SPLK	#0000000000000000b,EVIMRC 
;		SPLK	#0000000000000111b,EVIMRC ;使能 CAP1,2,3 中断
				;||||!!!!||||!!!!		
				;5432109876543210

		SPLK	#0FFFFh,EVIFRA	; 清所有 A 组中断标志
		SPLK	#0FFFFh,EVIFRB	; 清所有 B 组中断标志
		SPLK	#0FFFFh,EVIFRC	; 清所有 C 组中断标志

	;C2xx cpu
		POINT_PG0

;---实时模式使能---------------

	.if (real_time)
;		SPLK	#0000000001000010b,IMR	;En Int lvl 2 & 7 (T1 ISR)
		SPLK	#0000000001000100b,IMR	;En Int lvl 3 & 7 (T2 ISR)
;		SPLK	#0000000001001100b,IMR	;En Int lvl 3,4&7 (T2 & CAP ISR) 
				;5432109876543210
	.else
;		SPLK	#0000000000000010b,IMR	;En Int lvl 2 (T1 ISR)
	    SPLK	#0000000000000100b,IMR	;En Int lvl 3 (T2 ISR)
;		SPLK	#0000000000001100b,IMR	;En Int lvl 3&4 (T2 & CAP ISR)
				;||||!!!!||||!!!!		
				;5432109876543210
	.endif

		SPLK	#0FFFFh, IFR		;Clear any pending Ints
		EINT						;Enable global Ints

;------------------------------------------------------------------------------------------
;硬件初始化
;------------------------------------------------------------------------------------------
;使能 PWM 信号   

		POINT_PF2
		LACC	OCRA
		AND	#0BFFFh	
		SACL	OCRA		;设置第二功能 IOPB6

		LACC	PBDATDIR
		OR	#04000h
		SACL	PBDATDIR	;设置 IOPB6 为输出

		LACC	PBDATDIR
		AND	#0FFBFh     	;设置 IOPB6 为低, 使能 PWM
;       OR	#00040h 		;设置 IOPB6 为高, 禁止 PWM
		SACL	PBDATDIR  	
;----------------------------------------------------------
;参数初始化
;----------------------------------------------------------
	LDP		#D_func
	SPLK	#1000h, D_func     		;在 BLDC_3PWM_DRV 模块中定义
	
	LDP		#BLDC_vars
	BLDD	#D_func, D_func_desired
	SPLK	#0,v_timer				;设置计数器初始值为0
                
;----------------------------------------------------------
;初始化参数传递
;---------------------------------------------------------- 		
	LDP		#rmp2_out
	BLDD	#D_func, rmp2_out
	
	;DLOG 指针初始化
	LDP		#dlog_iptr1
	SPLK	#m6_cntr, dlog_iptr1
;---------------------------------------------------------


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

M_1:	NOP
		B	M_1
;======================================================

;-------------------------------------------------------------------------------------------
;T2 定时中断服务程序
;-------------------------------------------------------------------------------------------
T2_PERIOD_ISR:
;断点保护
	MAR	*,AR1		;AR1 作为堆栈指针
	MAR	*+          ;skip one position
	SST	#1, *+      ;保存 ST1
	SST   #0, *+    ;保存 ST0
	SACH	*+      ;保存 acc 高16位
	SACL	*		;保存 acc 低16位   
	
	POINT_EV
;	SPLK	#0FFFFh,EVIFRA  	; 清所有 A 组中断标志 (T1 ISR)
	SPLK	#0FFFFh,EVIFRB  	; 清所有 B 组中断标志 (T2 ISR)
;===========================================================================     

		POINT_B0

		; 校验中断服务程序
		LACC 	isr_ticker	
		ADD		#1			
		SACL    isr_ticker 

;----------------------------
;开始中断服务程序代码
;----------------------------
RUN_MODE  

	LDP		#hall_map_ptr
	BLDD	#m6_cntr, hall_map_ptr
	
	CALL	HALL3_DRV              	
	
	LDP		#m6_trig_in
	BLDD	#cmtn_trig_hall, m6_trig_in 	;利用霍尔信号的切换触发控制状态切换
	BLDD	#hall_map_ptr, m6_cntr 			;使输出与霍尔状态对应 
	                                        
	CALL	MOD6_CNT
	
	LDP		#cmtn_ptr_bd                    ;通过更新指针从状态表中获取输出指令
	BLDD	#m6_cntr, cmtn_ptr_bd           
	        
	LDP		#rmp2_desired                   ;斜坡过渡至预期 PWM 占空比
	BLDD	#D_func_desired, rmp2_desired
	         
	CALL	RMP2CNTL
	
	LDP		#D_func
	BLDD	#rmp2_out, D_func
	
	CALL	BLDC_3PWM_DRV                   ;产生新的 PWM 状态
		
;---------------------------------------------------------
;更新计数器
;--------------------------
updat_v_timer		
		LDP		#v_timer
		LACC	v_timer			;计数器加1
		ADD	#1			
		AND	#07FFFh				;强制15位循环计数
		SACL	v_timer			;

		CALL	DATA_LOG        ;更新显示数据 

;--------------------------
;主中断服务程序代码结束
;--------------------------
;恢复断点
END_ISR:
		MAR	*, AR1    	;激活堆栈指针
		LACL	*-		;恢复 Acc 低位字
		ADDH	*-		;恢复 Acc 高位字
		LST	#0, *-      ;加载 ST0
		LST   #1, *-    ;加载 ST1
		CLRC	INTM
		RET  

;===========================================================================================
; 哑中断服务程序
;
; 功能:	处理意外原因产生的中断
;===========================================================================================
PHANTOM 	CLRC	INTM 	;允许实时监控程序中断.通常此类中断由不可屏蔽中断引起
			B	PHANTOM     ;无效地址,错误数据页以及缺失的连接段都是产生中断的原因
							

⌨️ 快捷键说明

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