📄 zhtest3_2.asm
字号:
;PWM波形发生模块
LDP #Mfunc_c1
BLDD #Ta,Mfunc_c1
BLDD #Tb,Mfunc_c2
BLDD #Tc,Mfunc_c3
CALL FC_PWM_DRV
;电流采样模块
CALL ILEG2_DCBUS_DRV
;CLARKE变换模块
LDP #clark_a
BLDD #Imeas_a,clark_a
BLDD #Imeas_b,clark_b
CALL CLARKE
;PARK变换模块
LDP #park_d
BLDD #clark_d,park_d
BLDD #clark_q,park_q
BLDD #rmp_out,theta_p
CALL PARK
SKIP_CC_MODE
;正交脉冲捕获及角度计算模块
CALL QEP_THETA_DRV
;速度计算模块
LDP #theta_elec_fr
BLDD #theta_elec,theta_elec_fr
CALL SPEED_FRQ
.endif
;---------------------------------------------------------
;---------------------------------------------------------
.if (step5) ;测试步骤五控制程序代码
;---------------------------------------------------------
;检测闭环控制标志
LDP #cl_flg
lacc cl_flg
bcnd OPENLOOP,eq
;开环磁链控制模块,此步骤不用
; LDP #target_value
; BLDD #speed_ref,target_value
; CALL RAMP_CNTL
;判断是否跳过速度调节模块
POINT_B0
LACC sp_loop_max
SUB sp_loop_cnt
BCND SKIP_SP_PID,GEQ
SPLK #0,sp_loop_cnt ; 复位 sp_loop_cnt
;速度调节模块
LDP #spd_ref
; BLDD #setpt_value,spd_ref
BLDD #speed_ref,spd_ref
BLDD #speed_frq,spd_fdb
CALL PID_REG3_SPD
SKIP_SP_PID
;跳过速度调节计数器加1
LACC sp_loop_cnt
ADD #1h
SACL sp_loop_cnt
;d轴电流调节模块
LDP #id_ref
BLDD #Id_ref,id_ref
BLDD #park_D,id_fdb
CALL PID_REG3_ID
;q轴电流调节模块
LDP #iq_ref
BLDD #t_out,iq_ref
BLDD #park_Q,iq_fdb
CALL PID_REG3_IQ
;PARK逆变换模块
LDP #theta_ip
BLDD #ud_out,ipark_D
BLDD #uq_out,ipark_Q
BLDD #theta_elec,theta_ip
CALL I_PARK
;电压空间矢量计算模块
LDP #Ualfa
BLDD #ipark_d,Ualfa
BLDD #ipark_q,Ubeta
CALL SVGEN_DQ
;PWM波形发生模块
LDP #Mfunc_c1
BLDD #Ta,Mfunc_c1
BLDD #Tb,Mfunc_c2
BLDD #Tc,Mfunc_c3
CALL FC_PWM_DRV
;电流采样模块
CALL ILEG2_DCBUS_DRV
;CLARKE变换模块
LDP #clark_a
BLDD #Imeas_a,clark_a
BLDD #Imeas_b,clark_b
CALL CLARKE
;PARK变换模块
LDP #park_d
BLDD #clark_d,park_d
BLDD #clark_q,park_q
BLDD #theta_elec,theta_p
B ENDSTEP5
OPENLOOP ;启动时采用开环控制,同步后切入闭环
;开环磁链控制模块
LDP #target_value
BLDD #speed_ref,target_value
CALL RAMP_CNTL
;开环磁链产生模块
LDP #rmp_freq
BLDD #setpt_value,rmp_freq
CALL RAMP_GEN
;d轴电流调节模块
LDP #id_ref
BLDD #Id_ref,id_ref
BLDD #park_D,id_fdb
CALL PID_REG3_ID
;q轴电流调节模块
LDP #iq_ref
BLDD #Iq_ref,iq_ref
BLDD #park_Q,iq_fdb
CALL PID_REG3_IQ
;PARK逆变换模块
LDP #theta_ip
BLDD #ud_out,ipark_D
BLDD #uq_out,ipark_Q
BLDD #rmp_out,theta_ip
CALL I_PARK
;电压空间矢量计算模块
LDP #Ualfa
BLDD #ipark_d,Ualfa
BLDD #ipark_q,Ubeta
CALL SVGEN_DQ
;PWM波形发生模块
LDP #Mfunc_c1
BLDD #Ta,Mfunc_c1
BLDD #Tb,Mfunc_c2
BLDD #Tc,Mfunc_c3
CALL FC_PWM_DRV
;电流采样模块
CALL ILEG2_DCBUS_DRV
;CLARKE变换模块
LDP #clark_a
BLDD #Imeas_a,clark_a
BLDD #Imeas_b,clark_b
CALL CLARKE
;PARK变换模块
LDP #park_d
BLDD #clark_d,park_d
BLDD #clark_q,park_q
BLDD #rmp_out,theta_p
ENDSTEP5
CALL PARK
;正交脉冲捕获及角度计算模块
CALL QEP_THETA_DRV
;速度计算模块
LDP #theta_elec_fr
BLDD #theta_elec,theta_elec_fr
CALL SPEED_FRQ
.endif
;---------------------------------------------------------
;---------------------------------------------------------
;测试 ISR 带宽
SETC XF
CALL DATA_LOG
; 将速度参考值转换成rpm转速 (Q15 -> Q0)
POINT_B0
SPLK #3000, GPR1 ; GPR1 = 基本 rpm 转速 (Q0)
LT GPR1 ; TREG = GPR1 (Q0)
MPY speed_ref ; PREG = GPR1*speed_ref (Q15)
PAC ; ACC = GPR1*speed_ref (Q15)
SACH speed_ref_rpm,1 ; speed_ref_rpm = GPR1*speed_ref (Q0)
; 检测 enable_flg 信号使,能/禁止 PWM 驱动信号(本系统中未使用)
LACC enable_flg
BCND ENABLE_DRIVE,GT
CALL DIS_DRIVE ; 禁止驱动
B SKIP_DRIVE
ENABLE_DRIVE
CALL EN_DRIVE ; 使能驱动
SKIP_DRIVE
;检测 ISR 带宽
SETC XF
;=========================================================
;主 ISR 程序代码结束
;=========================================================
;恢复现场
END_ISR:
POINT_PG0
MAR *, AR1 ; 激活栈指针
MAR *- ; 指向栈顶
;如果需要可恢复更多现场信息
PSHD *- ; 恢复 TOS
LAR AR6,*- ; 恢复 AR6
LACL *- ; 恢复 Acc 低16位
ADD *-,16 ; 恢复 Acc 高16位
LST #0, *- ; 恢复 ST0
LST #1, *- ; 恢复 ST1 栈指针
EINT
RET
.if x243|x2407
*******************************************************
* INT1 - PDP 和系统外围中断服务程序
* PDPINT
*******************************************************
PDPINT_ID .set 020h ; PDPINT 向量 ID
PDPINT_CLR .set 01h ; PDPINT 标志清除
_c_int1:
MAR *,AR1 ; 断点保护
MAR *+ ; 指向未被使用的位置
SST #1, *+ ; 保存 ST1
SST #0, *+ ; 保存 ST0
SACH *+ ; 保存 acc 高16位
SACL *+ ; 保存 acc 低16位并把栈指针指向未用的地址.
;如果需要可保护更多现场信息
SETC SXM ; 允许符号扩暂
CLRC OVM ; 清溢出标志
LDP #PIVR>>7 ; 加载数据页
LACC PIVR ; 加载外围中断向量地址偏移量
SUB #PDPINT_ID ; 判断示否为PDPINT
BCND PDP_INT,EQ ; 如果为0则转向 PDPISR 中断服务程序
CALL PHANTOM ; 否则转到哑中断服务程序 phantom
B REST_INT1 ; 返回
PDP_INT
LDP #EVIFRA>>7 ; 设置数据页
SPLK #PDPINT_CLR,EVIFRA ; 清 PDPINT 中断标志
LDP #pdpint_flg ; 设置数据页
SPLK #1,pdpint_flg ; 设置标志位
REST_INT1
;如果需要可恢复更多现场信息
MAR *, AR1 ; 激活栈指针
MAR *- ; 指向栈顶
LACL *- ; 恢复 Acc 低16位
ADD *-,16 ; 恢复 Acc 高16位
LST #0, *- ; 恢复 ST0
LST #1, *- ; 恢复 ST1 和栈指针
EINT ; 使能中断
RET ; 返回
*** INT1 - PDP 和系统外围中断服务程序结束
.endif
*******************************************************
* INT4 - 事件管理器C组中断处理程序
* Cap3 中断同步QEP
*******************************************************
CAP3_ID .set 035H ; Cap3 中断向量地址
CAP3_CLR .set 04H ; Cap3 中断标志清除
QEP_ISR:
MAR *,AR1 ; 保护断点
MAR *+ ; 指向未被使用的位置
SST #1, *+ ; 保存 ST1
SST #0, *+ ; 保存 ST0
SACH *+ ; 保存 acc 高16位
SACL *+ ; 保存 acc 低16位并且把栈指针指向未用的地址.
;如果需要可保存更多现场信息
.if x243 | x2407
LDP #PIVR>>7 ; 设置数据页
LACC PIVR ; 加载外围中断向量地址偏移量
.endif
.if x240
LDP #EVIVRC>>7
lACC EVIVRC
.endif
SUB #CAP3_ID ; 判断是否Cap3 中断
BCND CAP3_INT,EQ ; 是则转到 CAP3_INT 中断服务程序
CALL PHANTOM ; 否则转到哑中断 phantom
B END_INT4 ; 返回
CAP3_INT
.if x243 | x2407
LDP #EVIFRC>>7
SPLK #CAP3_CLR,EVIFRC ; 清 Cap3 中断标志
.endif
CALL QEP_INDEX_ISR_DRV ; QEP 同步程序
;=========================================================
;INT4 -事件管理器 C 组中断代码结束
;=========================================================
;恢复断点
END_INT4
POINT_PG0
MAR *, AR1 ; 激活栈指针
MAR *- ; 指向栈顶
;如果需要可恢复更多现场信息
LACL *- ; 恢复 Acc 低16位
ADD *-,16 ; 恢复 Acc 高16位
LST #0, *- ; 恢复 ST0
LST #1, *- ; 恢复 ST1 和栈指针
EINT
RET ; 返回
;==============================================================================
; 程序名: PHANTOM 类型:ISR
;
; 功能: 哑中断,用于处理异常中断
;
; 修改纪录:
; 最后修改时间: 2005.07.20 版本:Ver1.0
;==============================================================================
PHANTOM B PHANTOM
PHANTOM1 B PHANTOM1
PHANTOM2 B PHANTOM2
PHANTOM3 B PHANTOM3
PHANTOM4 B PHANTOM4
PHANTOM5 B PHANTOM5
PHANTOM6 B PHANTOM6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -