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

📄 bldc3pwm.asm

📁 这个是直流无刷电机的基于DSP2407的速度控制源代码
💻 ASM
字号:
; 文件名:  Bldc3pwm.asm
; 模块名:  BLDC_3PWM_DRV				      
; 初始化程序: BLDC_3PWM_DRV_INIT
;
; 公司:	达盛科技
;
; 功能描述:	控制逆变器开关状态驱动一个直流无刷电动机 	
;
;						 |~~~~~~~~~~~~~~~|
;     cmtn_ptr_bd o----->|				 |----->o  CMPR1 (EV register)
;		  D_func  o----->| BLDC_3PWM_DRV |----->o  CMPR2 (EV register)
;		 Mfunc_p  o----->|				 |----->o  CMPR3 (EV register)
;						 |				 |----->o  T1PER (EV register)
;						 |_______________|
;
;=============================================================================
; 历史记录:
;-----------------------------------------------------------------------------
; 2005.08.20	版本:	Ver 1.0
;=============================================================================
;(要调用模块,就将下面声明语句复制到主程序代码中相应位置)
;		.ref	BLDC_3PWM_DRV, BLDC_3PWM_DRV_INIT	;子程序调用
;		.ref	cmtn_ptr_bd, D_func, Mfunc_p		;输入
;CMPR1, CMPR2, CMPR3, T1PR 在头文件中已经定义
;=============================================================================
;外部变量声明
		.def	BLDC_3PWM_DRV, BLDC_3PWM_DRV_INIT	;子程序调用
		.def	cmtn_ptr_bd, D_func, Mfunc_p		;输入
;=============================================================================
		.include	x24x_app.h

ACTIVE_HI	.set	0	;通过置1设定输出有效电平,同时必须且只能有一个参数为1,
ACTIVE_LO	.set	1	;另外一个则必须为0			
;此项设置取决于所采用的功率器件. ACTIVE_HI 代表功率器件高电平开通,ACTIVE_LO 代 
;表功率器件低电平开通. 这里的极性设定不同于 PWM 的极性设置,PWM极性设置是通过寄
;存器(x24x/x24xx)的ACTR相应控制位来设置的(Active High 或者 Active Low)。这个设   
;置只有当 ACTR 被设置成 Active Low PWM 时才是正确的。

;==============================================================================
;内部变量声明
;------------------------------------------------------------------------------
;cmtn_ptr_bd	.usect	"bldc3pwm",1	;换相指针   
;D_func			.usect	"bldc3pwm",1 
;Mfunc_p		.usect	"bldc3pwm",1
;period_max		.usect	"bldc3pwm",1
;period			.usect	"bldc3pwm",1
;GPR0_BLDC_PWM	.usect	"bldc3pwm",1  

bldc3pwm_vars	.usect	"bldc3pwm",6,1
cmtn_ptr_bd		.set	bldc3pwm_vars+0	;换相指针   
D_func			.set	bldc3pwm_vars+1
Mfunc_p			.set	bldc3pwm_vars+2
period_max		.set	bldc3pwm_vars+3
period			.set	bldc3pwm_vars+4
GPR0_BLDC_PWM	.set	bldc3pwm_vars+5  
		
;===============================================================================
BLDC_3PWM_DRV_INIT:		;初始化程序
;===============================================================================
;---x240目标板设置-----------------------------------------------------------
	.if (x240)	;x240 cpu
FPERIOD	.set	1000		;1000 x 50nS = 50uS, 对应 20KHz PWM

; 初始化事件管理器
	;PWM 单元设置

		ldp	#Mfunc_p
		SPLK	#FPERIOD, period_max
		SPLK	#7FFFh, Mfunc_p

	;设置全比较寄存器
		POINT_EV
		SPLK	#FPERIOD, T1PER				;临时初始化		
		SPLK	#0fffh,ACTR
		SPLK	#1000001000000000b,COMCON	;比较控制
		SPLK	#1001000001000000b,T1CON  	;通用定时器1初始化
		SPLK	#0000000000000000b,GPTCON 
				;||||!!!!||||!!!!
				;5432109876543210
	.endif
;-------------------------------------------------------------------------------

;---x243目标板设置-----------------------------------------------------------
	.if (x243)	;x243 cpu

FPERIOD	.set	1000		;1000 x 50nS = 50uS, 对应 20KHz PWM

; 初始化事件管理器
	
	;PWM 单元设置
		ldp	#Mfunc_p
		SPLK	#FPERIOD, period_max
		SPLK	#7FFFh, Mfunc_p

	;设置全比较寄存器
		POINT_EV
		SPLK	#FPERIOD, T1PER				;临时初始化		
		SPLK	#0fffh,ACTR
		SPLK	#1000001000000000b,COMCON	;比较控制设定
		SPLK	#1001000001000000b,T1CON  	;通用定时器1初始化
		SPLK	#0000000000000000b,GPTCON 
				;||||!!!!||||!!!!
				;5432109876543210

	;使能 CMP1-CMP6 PWM 输出功能	
		POINT_PF2				;OCRA.6 - OCRA.11
		LACC	OCRA
		OR	#0000111111000000b
			;||||!!!!||||!!!!
			;5432109876543210
		SACL	OCRA

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

;---x2407目标板设置------------------------------------------------------------
	.if (x2407)	;x2407 cpu

FPERIOD	.set	2000		;2000 x 25nS = 50uS,  对应 20KHz PWM

; 初始化事件管理器
	
	;PWM 单元设置
		ldp	#Mfunc_p
		SPLK	#FPERIOD, period_max
		SPLK	#7FFFh, Mfunc_p

	;设置全比较寄存器
		POINT_EV
		SPLK	#FPERIOD, T1PER				;临时初始化		
		SPLK	#0fffh,ACTR
		SPLK	#1000001000000000b,COMCON	;比较控制
		SPLK	#1001000001000000b,T1CON  	;Asym
		SPLK	#0000000000000000b,GPTCON 
			    ;||||!!!!||||!!!!
			    ;5432109876543210

	;使能 CMP1-CMP6 PWM 输出功能
		POINT_PF2					;OCRA.6 - OCRA.11
		LACC	OCRA
		OR	#0000111111000000b
			;||||!!!!||||!!!!
			;5432109876543210
		SACL	OCRA

	.endif
;--------------------------------------------------------------------------------
	
		RET			;初始化完成

;================================================================================
BLDC_3PWM_DRV:		;控制程序
;================================================================================
		spm 0
		ldp	#cmtn_ptr_bd
		LACC	#COMMUTATION_TBL
		ADD	cmtn_ptr_bd
		TBLR	GPR0_BLDC_PWM
		LACC	GPR0_BLDC_PWM
		BACC
STATE_ANB					;电流从A相流入,从B相流出,C相关断
		POINT_EV			;
		SPLK	#0f3dH,ACTR	;
		B	STATE_END

STATE_ANC					;电流从A相流入,从C相流出,B相关断
		POINT_EV			;
		SPLK	#03fdH,ACTR	;
		B	STATE_END

STATE_BNC					;电流从B相流入,从C相流出,A相关断		
		POINT_EV			; 
		SPLK	#03dfH,ACTR	; 
		B	STATE_END

STATE_BNA					;电流从B相流入,从A相流出,C相关断	
		POINT_EV			;
		SPLK	#0fd3H,ACTR	;
		B	STATE_END

STATE_CNA					;电流从C相流入,从A相流出,B相关断
		POINT_EV			;
		SPLK	#0df3H,ACTR	;
		B	STATE_END

STATE_CNB					;电流从C相流入,从B相流出,A相关断
		POINT_EV			;
		SPLK	#0d3fH,ACTR	;

STATE_END:
	;将 "Period" 从(Q15)格式转换到 Q0 格式
		ldp	#Mfunc_p
		LT	Mfunc_p
		MPY	period_max			;P = period x period_max
		PAC
		SACH	period,1

	;将 "D_func" 从(Q15) 格式转换到 Q0 格式
	.if (ACTIVE_LO)				;有效电平处理
		LACC	#7FFFh
		SUB	D_func
		SACL	GPR0_BLDC_PWM  
	.endif     

	.if (ACTIVE_HI)				;有效电平处理
		LACC	D_func
		SACL	GPR0_BLDC_PWM 
	.endif                

        LT      GPR0_BLDC_PWM
		MPY	period				; P = D_func x period
		PAC			

		POINT_EV
		SACH	CMPR1,1
		SACH	CMPR2,1
		SACH	CMPR3,1
		RET

;换相表 - 按 BAC 循环.
;----------------------------------------------------------------------------
COMMUTATION_TBL:
ANB	.word	STATE_ANB	;COMMUTATION_PTR = 0, de-energized phase = C
ANC	.word	STATE_ANC	;COMMUTATION_PTR = 1, de-energized phase = B
BNC	.word	STATE_BNC	;COMMUTATION_PTR = 2, de-energized phase = A
BNA	.word	STATE_BNA	;COMMUTATION_PTR = 3, de-energized phase = C
CNA	.word	STATE_CNA	;COMMUTATION_PTR = 4, de-energized phase = B
CNB	.word	STATE_CNB	;COMMUTATION_PTR = 5, de-energized phase = A

⌨️ 快捷键说明

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