📄 bldc3pwm.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 + -