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