📄 zhtest1.asm
字号:
;==============================================================================
; 控制系统名称: Zhtest1
;
; 程序文件名: Zhtest1.ASM
;
; 功能描述: 带速度传感器的三相异步电动机磁场定向控制
;
; 公司: 达盛科技
;
; 目标板:x2407
;=====================================================================================
; 修改记录:
;-------------------------------------------------------------------------------------
; 最后修改日期:2005.07.20 版本号: Ver.1.0
;==============================================================================
;******************************************************************************
; 系统选项
;******************************************************************************
real_time .set 1 ; '1' 代表实时模式, '0'代表非实时模式
* 选择编译选项
step1 .set 0 ; 磁链给定和正弦信号发生
step2 .set 1 ; 开环启动,功率单元测试
step3 .set 0 ; 电流和速度测量模块测试
step4 .set 0 ; 电流调节器功能测试
step5 .set 0 ; 电流磁链模块插入及功能测试
step6 .set 0 ; 速度环插入及完整系统功能测试
PWM_PERIOD .set 100 ; PWM 周期设置,单位是微秒 (10KHz)
;T1PER_ .set PWM_PERIOD*10 ; *1000nS/(2*50nS)
T1PER_ .set PWM_PERIOD*20 ; *1000nS/(2*25nS)
;******************************************************************************
* 选择编译内部选项
.if (step4)
constant_current .set 0
; Theta_p/Theta_ip 开关 ('1'代表连接到0,'0'代表连接到'rmp_out').
.endif
.if (step5)
test_cur_mod .set 0
; Theta_p/Theta_ip 开关 ('1'代表连接到'rmp_out','0'代表连接到'theta_cur_mod').
.endif
;-----------------------------------------------------------------------------
; 外部参量声明
;-----------------------------------------------------------------------------
.include "x24x_app.h"
.global MON_RT_CNFG
.ref SYS_INIT
.ref RAMP_GEN, RAMP_GEN_INIT ;磁链给定子程序
.ref rmp_gain, rmp_offset, rmp_freq ;输入参量
.ref step_angle_max ;输入参量
.ref rmp_out ;输出参量
.ref I_PARK, I_PARK_INIT ;PARK逆变换子程序
.ref ipark_D, ipark_Q, theta_ip ;输入参量
.ref ipark_d, ipark_q ;输出参量
.ref SVGEN_DQ,SVGEN_DQ_INIT ;矢量计算子程序
.ref Ualfa,Ubeta ;输入参量
.ref Ta,Tb,Tc ;输出参量
.ref FC_PWM_DRV,FC_PWM_DRV_INIT ;PWM波形产生子程序
.ref Mfunc_c1,Mfunc_c2,Mfunc_c3,Mfunc_p ;输入参量
.ref n_period ;输出参量
.ref ILEG2DRV, ILEG2DRV_INIT ;电流采样子程序
.ref Ia_gain,Ib_gain,Ia_offset,Ib_offset ;输入参量
.ref Ia_out, Ib_out,V_ref ;输出参量
.ref CLARKE, CLARKE_INIT ;CLARKE变换子程序
.ref clark_a, clark_b ;输入参量
.ref clark_d, clark_q ;输出参量
.ref PARK, PARK_INIT ;PARK变换子程序
.ref park_d, park_q, theta_p ;输入参量
.ref park_D, park_Q ;输出参量
.ref QEP_THETA_DRV,QEP_THETA_DRV_INIT ;编码器脉冲计数子程序
.ref polepairs,cal_angle,mech_scale ;输入参量
.ref theta_elec,theta_mech,dir_QEP ;输出参量
.ref QEP_INDEX_ISR_DRV ;编码器复位子程序
.ref index_sync_flg,QEP_cnt_idx ;输出参量
.ref SPEED_FRQ, SPEED_FRQ_INIT ;速度计算子程序
.ref shaft_angle, direction ;输入参量
.ref speed_frq, speed_frq_rpm ;输出参量
.ref pid_reg_id,pid_reg_id_init ;d轴电流调节子程序
.ref id_fdb,id_ref,Kp_d,Ki_d,Kc_d ;输入变量
.ref ud_int ;输入参量
.ref ud_out ;输出参量
.ref pid_reg_iq,pid_reg_iq_init ;q轴电流调节子程序
.ref iq_fdb,iq_ref,Kp_q,Ki_q,Kc_q ;输入参量
.ref uq_int ;输入参量
.ref uq_out ;输出参量
.ref CURRENT_MODEL,CURRENT_MODEL_INIT ;电流磁链模型子程序
.ref i_cur_mod_D,i_cur_mod_Q ;输入参量
.ref spd_cur_mod ;输入参量
.ref theta_cur_mod ;输出参量
.ref pid_reg_spd,pid_reg_spd_init ;速度调节子程序
.ref spd_fdb,spd_ref ;输入参量
.ref spd_out ;输出参量
.ref DATA_LOG_INIT,DATA_LOG ;图形显示数据获取子程序
.ref dlog_iptr1,dlog_iptr2 ;输出参量
;-----------------------------------------------------------------------------
; 输入参量声明
;-----------------------------------------------------------------------------
.def GPR0 ;通用寄存器
.bss GPR0,1 ;通用寄存器 ;为未初始化变量 在.bss段内保留空间
.bss my_iq_ref,1 ;参考转矩输入
.bss my_id_ref,1 ;参考励磁输入
.bss speed_reference,1 ;参考速度输入
.bss isr_ticker,1
.bss data_tmp,1 ;临时变量
;==============================================================================
;向量表( 包括实时模式监控程序 )
;==============================================================================
.include "c200mnrt.i" ; 条件编译选项
.sect "vectors"
.def _c_int0
.def _c_int4 ; int4-EV group C dispatcher/service
RESET B _c_int0 ; 00
INT1 B PHANTOM ; 02
INT2 B T1_PERIOD_ISR ; 04
INT3 B PHANTOM ; 06
INT4 B _c_int4 ; 08
INT5 B PHANTOM ; 0A
INT6 B PHANTOM ; 0C
.include "rtvecs.h"
; Note : 上面的 include 行必须放在用户可设置的变量之后
;==============================================================================
; 主程序代码
;==============================================================================
.text;text[value],value 为(section programe counter spc)的起始值,缺省为0
_c_int0:
CALL SYS_INIT
CALL FC_PWM_DRV_INIT ;初始化定时器
;
CALL DATA_LOG_INIT ;
.if (step1)
CALL RAMP_GEN_INIT
CALL I_PARK_INIT
.endif
.if (step2)
CALL RAMP_GEN_INIT
CALL I_PARK_INIT
CALL SVGEN_DQ_INIT
.endif
.if (step3)
CALL RAMP_GEN_INIT
CALL I_PARK_INIT
CALL SVGEN_DQ_INIT
CALL ILEG2DRV_INIT
CALL CLARKE_INIT
CALL PARK_INIT
CALL QEP_THETA_DRV_INIT
CALL SPEED_FRQ_INIT
.endif
.if (step4)
CALL RAMP_GEN_INIT
CALL I_PARK_INIT
CALL SVGEN_DQ_INIT
CALL ILEG2DRV_INIT
CALL CLARKE_INIT
CALL PARK_INIT
CALL QEP_THETA_DRV_INIT
CALL SPEED_FRQ_INIT
CALL pid_reg_id_init
CALL pid_reg_iq_init
.endif
.if (step5)
CALL RAMP_GEN_INIT
CALL I_PARK_INIT
CALL SVGEN_DQ_INIT
CALL ILEG2DRV_INIT
CALL CLARKE_INIT
CALL PARK_INIT
CALL QEP_THETA_DRV_INIT
CALL SPEED_FRQ_INIT
CALL pid_reg_id_init
CALL pid_reg_iq_init
CALL CURRENT_MODEL_INIT
.endif
.if (step6)
CALL I_PARK_INIT
CALL SVGEN_DQ_INIT
CALL ILEG2DRV_INIT
CALL CLARKE_INIT
CALL PARK_INIT
CALL QEP_THETA_DRV_INIT
CALL SPEED_FRQ_INIT
CALL pid_reg_id_init
CALL pid_reg_iq_init
CALL CURRENT_MODEL_INIT
CALL pid_reg_spd_init
.endif
;---实时模式选项---------------
.if (real_time)
CALL MON_RT_CNFG
.endif
;----------------------------------
;-----------------------------------
; 用户初始化参量输入
;----------------------------------
LDP #n_period
SPLK #T1PER_,n_period ;初始化 PWM 频率10kHz
LDP #rmp_freq
SPLK #2A00h,rmp_freq ;磁场频率设定
LDP #my_iq_ref
SPLK #0000h,my_iq_ref ;转矩设定
LDP #my_id_ref
SPLK #2400H,my_id_ref ;励磁设定
LDP #speed_reference
splk #600h,speed_reference ;速度设定
.if (step6)
POINT_B0
SPLK #2400H,my_id_ref ;励磁设定
.endif
;----------------------------------------------------------
; 系统中断初始化
;----------------------------------------------------------
;事件管理器
POINT_EV
SPLK #0000001000000000b,IMRA ;使能 T1 定时器下溢中断
SPLK #0000000000000100b,IMRC ;使能 CAP3 中断 (编码器z信号)
;||||!!!!||||!!!!
;5432109876543210
SPLK #0FFFFh,IFRA ; 清所有 A 组中断标志
SPLK #0FFFFh,IFRB ; 清所有 B 组中断标志
SPLK #0FFFFh,IFRC ; 清所有 C 组中断标志
;C2xx Core
POINT_PG0
;---实时模式选项 --------------------------------------------------
.if (real_time)
SPLK #0000000001001010b,IMR ;En Int lvl 3,7 (T2 ISR)
;5432109876543210
.endif
.if (real_time != 1)
SPLK #0000000000001010b,IMR ;En Int lvl 4 (CAP3/QEP ISR)
;||||!!!!||||!!!!
;5432109876543210
.endif
SPLK #0FFFFh, IFR ;清所有未响应中断
EINT ;使能中断
POINT_B0
;-----------------------------------------------------------------------
;使能 PWM 信号
;-----------------------------------------------------------------------
POINT_PF2
LACC OCRC
AND #03FFFh
SACL OCRC ;选择 IOPF6 第二功能
LACC PFDATDIR
OR #04000h
SACL PFDATDIR ;将IOPF6设置为输出
LACC PFDATDIR
AND #0FFBFh ;IOPF6 为低使能 PWM
; OR #00040h ;IOPF6 为高禁止 PWM
SACL PFDATDIR
;======================================================
MAIN: ;系统主程序循环
;======================================================
M_1 NOP
NOP
NOP
CLRC XF
B MAIN
;======================================================
;===========================================================================
; 程序名: T1_PERIOD_ISR 程序类型: ISR
;
; 功能描述:断点保护
;
; 公司: 达盛科技
; 修改记录:
; 最后修改日期: 2005.7.10
;===========================================================================
T1_PERIOD_ISR:
;断点保护
MAR *,AR1 ; AR1 作为栈指针
MAR *+ ; 指针加1
SST #1, *+ ; 保存 ST1
SST #0, *+ ; 保存 ST0
SACH *+ ; 保存 acc 高16位
SACL * ; 保存 acc 低16位
POINT_EV
SPLK #0FFFFh,IFRA; 清所有A组中断标志 (T1 ISR)
SETC XF
SETC SXM ; 允许符号扩展
CLRC OVM ; 清除溢出标志
POINT_B0
; 校验 ISR
LACC isr_ticker
ADD #1
SACL isr_ticker
;=========================================================
;主循环中断服务程序开始
;=========================================================
.if (step1)
; Ramp 产生模块
CALL RAMP_GEN
; Park 逆变换模块
LDP #theta_ip
BLDD #rmp_out,theta_ip
CALL I_PARK
; PWM 模块
CALL FC_PWM_DRV ;设置 PWM 频率为10kHz
.endif
******************************************
.if (step2)
; Ramp产生模块
CALL RAMP_GEN
; Park逆变换模块
LDP #theta_ip
BLDD #rmp_out,theta_ip
CALL I_PARK
; 电压空间是两计算模块
LDP #Ualfa
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -