📄 pwm_drv.asm
字号:
;======================================================================
; 文件名: pwm_drv.asm
;
; 模块名: FC_PWM_DRV
;
; 初始化程序名: FC_PWM_DRV_INIT
;
; 公司: 达盛科技
;
; 功能描述: 根据输入的占空比参数产生PWM波,也可以修改PWM周期
;
; |~~~~~~~~~~~~~~~~|
; Mfunc_c1 o------>| |----->o CMPR1 (EV register)
; Mfunc_c2 o------>| FC_PWM_DRV |----->o CMPR2 (EV register)
; Mfunc_c3 o------>| |----->o CMPR3 (EV register)
; Mfunc_p o------>| |----->o T1PER (EV register)
; n_period o------>|________________|
;
; 目标板CPU: x240/243/2407
;
;=====================================================================================
; 修改纪录:
;-------------------------------------------------------------------------------------
; 最后更新日期:2005.6.22 版本号: Ver 1.0
;======================================================================
;----------------------
; 变量声明
;----------------------
; .ref FC_PWM_DRV,FC_PWM_DRV_INIT ;函数调用
; .ref Mfunc_c1,Mfunc_c2,Mfunc_c3,Mfunc_p ;输入参量
; .ref n_period ;输入
;---------------------------------
; 变量定义
;---------------------------------
.include "x24x_app.h"
;-------------------------
; 默认 PWM 周期
;-------------------------
PWM_PERIOD .set 100 ; PWM 周期 单位uS (10KHz)
;PWM_PERIOD .set 67 ; PWM 周期 单位uS (15KHz)
;-------------------------
; 变量声明
;-------------------------
.def FC_PWM_DRV,FC_PWM_DRV_INIT ;函数调用
.def Mfunc_c1,Mfunc_c2,Mfunc_c3,Mfunc_p ;输入参量
.def n_period ;输入参量
;------------
; 变量定义
;------------
Mfunc_c1 .usect "pwm_drv",1 ; Phase 1 mod function Q15
Mfunc_c2 .usect "pwm_drv",1 ; Phase 2 mod function Q15
Mfunc_c3 .usect "pwm_drv",1 ; Phase 3 mod function Q15
Mfunc_p .usect "pwm_drv",1 ; Period mod function Q15
n_period .usect "pwm_drv",1 ; Nominal period/compare value
m_period .usect "pwm_drv",1 ; Modulated period
;------------------------------
; 参数设置
;------------------------------
T1PER_ .set PWM_PERIOD*20 ; 10KHz pwm 对应计数周期数 对应40MHz系统时钟
;T1PER_ .set PWM_PERIOD*15 ; 10KHz pwm 对应计数周期数 对应30MHz系统时钟
T1CON_ .set 1000100001000000b ; 对称 PWM
DBTCON_ .set 09E8h ; 死区D/B = 1.8uS 对应40MHz系统时钟
ACTR_ .set 100110011001b ; 011001100110b; 1/3/5 低有效, 2/4/6 高有效
COMCON_ .set 1000001000000000b ; 使能比较,使能pwm
;----------------------------------------------------------------------
; 初始化
;----------------------------------------------------------------------
FC_PWM_DRV_INIT
LDP #T1PER>>7
SPLK #T1PER_,T1PER ;周期寄存器初始化
SPLK #T1CON_,T1CON ;
SPLK #DBTCON_,DBTCON ;信号死区初始化
SPLK #ACTR_,ACTR ;比较动作寄存器初始化
SPLK #COMCON_,COMCON ;
ldp #OCRA>>7 ; 设置管脚
LACC OCRA
OR #0000111111000000b
SACL OCRA
ldp #n_period
SPLK #T1PER_,n_period
SPLK #7FFFh,Mfunc_p
RET
;----------------------------------------------------------------------
; 控制程序
;----------------------------------------------------------------------
FC_PWM_DRV:
ldp #Mfunc_p ; 调制周期
LT Mfunc_p
MPY n_period ; Mfunc_p*n_period/2
PAC ;
add n_period,15 ; 用 n_period/2 偏置
SACH m_period; 保存备用
ldp #T1PER>>7 ;
sach T1PER ; 保存
ldp #Mfunc_c1 ; 调制通道1
LT Mfunc_c1
MPY m_period ; Mfunc_c1*m_period/2
PAC ;
add m_period,15 ; 用 m_period/2 偏置
ldp #CMPR1>>7
SACH CMPR1 ; 保存
ldp #Mfunc_c2 ; 调制通道2
LT Mfunc_c2
MPY m_period ; Mfunc_c2*m_period/2
PAC ;
add m_period,15 ; 用 m_period/2 偏置
ldp #CMPR2>>7
SACH CMPR2 ; 保存
ldp #Mfunc_c3 ; 调制通道3
LT Mfunc_c3
MPY m_period ; Mfunc_c3*m_period/2
PAC ;
add m_period,15 ; 用 m_period/2 偏置
ldp #CMPR3>>7
SACH CMPR3 ; 保存
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -