?? zhtest2.asm
字號(hào):
;==============================================================================
; 系統(tǒng)名:雙閉環(huán)pwm直流調(diào)速系統(tǒng)
;
; 程序文件名: Zhtest2.ASM
;
; 功能描述: 轉(zhuǎn)速電流雙閉環(huán)控制的雙極性pwm有刷直流電機(jī)調(diào)速系統(tǒng)
;
; 公司: 達(dá)盛科技
;
; 目標(biāo)板:x2407
;=====================================================================================
; 修改記錄:
;-------------------------------------------------------------------------------------
; 最后修改日期:2005.07.20 版本號(hào): Ver.1.0
;==============================================================================
;******************************************************************************
; 系統(tǒng)選項(xiàng)
;******************************************************************************
real_time .set 1 ; '1' 代表實(shí)時(shí)模式, '0'代表非實(shí)時(shí)模式
* 選擇編譯選項(xiàng)
step1 .set 1 ; 開環(huán)啟動(dòng),功率單元測(cè)試
step2 .set 0 ; 電流和速度測(cè)量模塊測(cè)試
step3 .set 0 ; 電流調(diào)節(jié)器功能測(cè)試
step4 .set 0 ; 速度環(huán)插入及完整系統(tǒng)功能測(cè)試
PWM_PERIOD .set 100 ; PWM 周期設(shè)置,單位是微秒 (10KHz)
;T1PER_ .set PWM_PERIOD*10 ; *1000nS/(2*50nS)
T1PER_ .set PWM_PERIOD*20 ; *1000nS/(2*25nS)
;******************************************************************************
;-----------------------------------------------------------------------------
; 外部參量聲明
;-----------------------------------------------------------------------------
.include "x24x_app.h"
.global MON_RT_CNFG
.ref SYS_INIT
.ref RAMP_GEN, RAMP_GEN_INIT ;鋸齒波發(fā)生子程序
.ref rmp_gain, rmp_offset, rmp_freq ;輸入?yún)⒘? .ref step_angle_max ;輸入?yún)⒘? .ref rmp_out,rmp_out_abs ;輸出參量
.ref DC_PWM_DRV,DC_PWM_DRV_INIT ;PWM波形產(chǎn)生子程序
.ref Mfunc,Mfunc_p ;輸入?yún)⒘? .ref n_period ;輸出參量
.ref GI_A,GI_A_INIT ; 給定積分子程序
.ref gi_ref,gi_step ; 輸入?yún)⒘? .ref gi_out ; 輸出參量
.ref ILEG2DRV, ILEG2DRV_INIT ;電流采樣子程序
.ref Ia_gain,Ib_gain,Ia_offset,Ib_offset ;輸入?yún)⒘? .ref Ia_out, Ib_out,V_ref ;輸出參量
.ref QEP_THETA_DRV,QEP_THETA_DRV_INIT ;編碼器脈沖計(jì)數(shù)子程序
.ref polepairs,cal_angle,mech_scale ;輸入?yún)⒘? .ref theta_elec,theta_mech,dir_QEP ;輸出參量
.ref QEP_INDEX_ISR_DRV ;編碼器復(fù)位子程序
.ref index_sync_flg,QEP_cnt_idx ;輸出參量
.ref SPEED_FRQ, SPEED_FRQ_INIT ;速度計(jì)算子程序
.ref shaft_angle, direction ;輸入?yún)⒘? .ref speed_frq, speed_frq_rpm ;輸出參量
.ref pid_reg_iq,pid_reg_iq_init ;q軸電流調(diào)節(jié)子程序
.ref iq_fdb,iq_ref,Kp_q,Ki_q,Kc_q ;輸入變量
.ref uq_int ;輸入?yún)⒘? .ref uq_out ;輸出參量
.ref pid_reg_spd,pid_reg_spd_init ;速度調(diào)節(jié)子程序
.ref spd_fdb,spd_ref ;輸入?yún)⒘? .ref spd_out ;輸出參量
.ref DATA_LOG_INIT,DATA_LOG ;圖形顯示數(shù)據(jù)獲取子程序
.ref dlog_iptr1,dlog_iptr2 ;輸出參量
;-----------------------------------------------------------------------------
; 輸入?yún)⒘柯暶?;-----------------------------------------------------------------------------
.def GPR0 ;通用寄存器
.bss GPR0,1 ;通用寄存器
.bss isr_ticker,1
.bss Dir_ref,1 ;參考方向
.bss Ton_ref,1 ;參考占空比
.bss step_ref,1 ;給定積分步長(zhǎng)
.bss speed_ref,1 ;速度給定
.bss my_iq_ref,1 ;電流參考給定
;==============================================================================
;向量表( 包括實(shí)時(shí)模式監(jiān)控程序 )
;==============================================================================
.include "c200mnrt.i" ; 條件編譯選項(xiàng)
.sect "vectors"
.def _c_int0
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"
; 注意 : The above include line must be AFTER the user configurable
; vectors. Do not change the place where this line is included.
;==============================================================================
; 主程序代碼
;==============================================================================
.text
_c_int0:
CALL SYS_INIT ;系統(tǒng)初始化
CALL DC_PWM_DRV_INIT ;初始化定時(shí)器
CALL RAMP_GEN_INIT ;顯示觸發(fā)程序初始化
CALL DATA_LOG_INIT ;顯示程序初始化
CALL ILEG2DRV_INIT ;AD采樣程序初始化
.if (step1)
CALL GI_A_INIT ;斜坡給定程序初始化
.endif
.if (step2)
CALL GI_A_INIT ;斜坡給定程序初始化
CALL QEP_THETA_DRV_INIT ;脈沖計(jì)數(shù)程序初始化
CALL SPEED_FRQ_INIT ;速度計(jì)算程序初始化
.endif
.if (step3)
; CALL GI_A_INIT ;斜坡給定程序初始化
CALL QEP_THETA_DRV_INIT ;脈沖計(jì)數(shù)程序初始化
CALL SPEED_FRQ_INIT ;速度計(jì)算程序初始化
CALL pid_reg_iq_init ;電流調(diào)節(jié)程序初始化
.endif
.if (step4)
CALL GI_A_INIT ;斜坡給定程序初始化
CALL QEP_THETA_DRV_INIT ;脈沖計(jì)數(shù)程序初始化
CALL SPEED_FRQ_INIT ;速度計(jì)算程序初始化
CALL pid_reg_iq_init ;電流調(diào)節(jié)程序初始化
CALL pid_reg_spd_init ;轉(zhuǎn)速調(diào)節(jié)程序初始化
.endif
;---實(shí)時(shí)模式選項(xiàng)---------------
.if (real_time)
CALL MON_RT_CNFG ;調(diào)用實(shí)時(shí)監(jiān)控程序
.endif
;----------------------------------
;-----------------------------------
; 用戶初始化參量輸入
;----------------------------------
LDP #n_period
SPLK #T1PER_,n_period ;初始化 PWM 頻率10kHz
LDP #Ton_ref
SPLK #3000H,Ton_ref ;PWM 輸出占空比設(shè)為常量
LDP #step_ref
SPLK #10H,step_ref ;給定信號(hào)步長(zhǎng)
LDP #rmp_freq
SPLK #5000h,rmp_freq ;顯示刷新頻率設(shè)定
LDP #speed_ref
SPLK #0500,speed_ref ;轉(zhuǎn)速設(shè)定為常量
LDP #my_iq_ref
SPLK #0500h,my_iq_ref ;轉(zhuǎn)矩設(shè)定
;----------------------------------------------------------
; 系統(tǒng)中斷初始化
;----------------------------------------------------------
;事件管理器
POINT_EV
SPLK #0000001000000000b,IMRA ;使能 T1 定時(shí)器下溢中斷
SPLK #0000000000000100b,IMRC ;使能 CAP3 中斷 (編碼器z信號(hào))
;||||!!!!||||!!!!
;5432109876543210
SPLK #0FFFFh,IFRA ; 清除A組中斷標(biāo)志
SPLK #0FFFFh,IFRB ; 清除B組中斷標(biāo)志
SPLK #0FFFFh,IFRC ; 清除C組中斷標(biāo)志
;C2xx Core
POINT_PG0
;---實(shí)時(shí)模式選項(xiàng) --------------------------------------------------
.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 ;Clear any pending Ints
EINT ;Enable global Ints
POINT_B0
;-----------------------------------------------------------------------
;使能 PWM 信號(hào)
;-----------------------------------------------------------------------
POINT_PF2
LACC OCRA
AND #0BFFFh
SACL OCRA ;選擇 IOPB6 第二功能
LACC PBDATDIR
OR #04000h
SACL PBDATDIR ;Set IOPB6 as output
LACC PBDATDIR
AND #0FFBFh ;IOPB6 為低使能 PWM
; OR #00040h ;IOPB6 為高禁止 PWM
SACL PBDATDIR
;======================================================
MAIN: ;系統(tǒng)主程序循環(huán)
;======================================================
M_1 NOP
NOP
NOP
CLRC XF
B MAIN
;======================================================
;===========================================================================
; 程序名: T1_PERIOD_ISR 程序類型: ISR
;
; 功能描述:斷點(diǎn)保護(hù)
;
; 公司: 達(dá)盛科技
; 修改記錄:
; 最后修改日期: 2005.7.10
;===========================================================================
T1_PERIOD_ISR:
;Context save regs
MAR *,AR1 ;AR1 is stack pointer
MAR *+ ;skip one position
SST #1, *+ ;save ST1
SST #0, *+ ;save ST0
SACH *+ ;save acc high
SACL * ;save acc low
POINT_EV
SPLK #0FFFFh,IFRA ; Clear all Group A interrupt flags (T1 ISR)
SETC XF
SETC SXM ; 允許符號(hào)擴(kuò)展
CLRC OVM ; 清除溢出標(biāo)志
POINT_B0
; 校驗(yàn) ISR
LACC isr_ticker
ADD #1
SACL isr_ticker
;=========================================================
;主循環(huán)中斷服務(wù)程序開始
;=========================================================
.if (step1) ;測(cè)試步驟一控制程序
; 電流采樣
CALL ILEG2DRV
; 積分給定模塊
LDP #gi_ref
BLDD #speed_ref,gi_ref
BLDD #step_ref,gi_step
CALL GI_A
; PWM 模塊
LDP #Mfunc
BLDD #gi_out,Mfunc
CALL DC_PWM_DRV ;設(shè)置 PWM 頻率為10kHz
.endif
******************************************
.if (step2) ;測(cè)試步驟二控制程序
; 電流采樣
CALL ILEG2DRV
; 脈沖計(jì)數(shù)模塊
CALL QEP_THETA_DRV
; 積分給定模塊
LDP #gi_ref
BLDD #Ton_ref,gi_ref
BLDD #step_ref,gi_step
CALL GI_A
; 速度計(jì)算模塊
LDP #shaft_angle
BLDD #theta_mech,shaft_angle
BLDD #dir_QEP,direction
CALL SPEED_FRQ
; PWM 模塊
LDP #Mfunc
BLDD #gi_out,Mfunc
CALL DC_PWM_DRV ;設(shè)置 PWM 頻率為10kHz
.endif
******************************************
.if (step3) ;測(cè)試步驟三控制程序
; 電流采樣及測(cè)量模塊
CALL ILEG2DRV
; 脈沖計(jì)數(shù)模塊
CALL QEP_THETA_DRV
; 速度測(cè)量模塊
LDP #shaft_angle
BLDD #theta_mech,shaft_angle
BLDD #dir_QEP,direction
CALL SPEED_FRQ
; 電流調(diào)節(jié)
LDP #iq_ref
BLDD #my_iq_ref,iq_ref
BLDD #Ia_out,iq_fdb
CALL pid_reg_iq
; PWM 模塊
LDP #Mfunc
BLDD #uq_out,Mfunc
CALL DC_PWM_DRV
.endif
******************************************
.if (step4) ;測(cè)試步驟四控制程序
; Ileg2drv module
CALL ILEG2DRV ;電流采樣計(jì)算控制程序
; 脈沖計(jì)數(shù)
CALL QEP_THETA_DRV ;速度采樣控制程序
; 積分給定模塊
; LDP #gi_ref ;測(cè)試用代碼start
; BLDD #Ton_ref,gi_ref ;
; BLDD #step_ref,gi_step ;
; CALL GI_A ;end
; 速度調(diào)節(jié)
LDP #spd_ref
; bldd #gi_out,spd_ref ;測(cè)試速度參考輸入
bldd #speed_ref,spd_ref ;速度參考輸入
bldd #speed_frq,spd_fdb ;速度反饋輸入
; bldd #spd_out,spd_fdb ;測(cè)試速度反饋輸入
CALL pid_reg_spd
; 速度計(jì)算
LDP #shaft_angle
BLDD #theta_mech,shaft_angle
BLDD #dir_QEP,direction
CALL SPEED_FRQ
; 電流調(diào)節(jié)
LDP #iq_ref
BLDD #spd_out,iq_ref ;電流參考輸入
BLDD #Ia_out,iq_fdb ;電流反饋輸入
; BLDD #uq_out,iq_fdb ;測(cè)試
CALL pid_reg_iq
; pwm模塊
LDP #Mfunc
; BLDD #gi_out,Mfunc ;測(cè)試
BLDD #uq_out,Mfunc ;參考占空比輸入,有電流環(huán)
; BLDD #spd_out,Mfunc ;參考占空比輸入,無電流環(huán)
CALL DC_PWM_DRV
.endif
; 顯示觸發(fā)信號(hào)
CALL RAMP_GEN
; 顯示模塊
CALL DATA_LOG ;顯示程序調(diào)用
;=========================================================
;主循環(huán)中斷服務(wù)程序結(jié)束
;=========================================================
;斷點(diǎn)恢復(fù)
END_ISR:
POINT_PG0
MAR *, AR1 ;make stack pointer active
LACL *- ;Restore Acc low
ADDH *- ;Restore Acc high
LST #0, *- ;load ST0
LST #1, *- ;load ST1
EINT
RET
*******************************************************
* INT4 - EV group C Ints開始
* Cap3 中斷使能
*******************************************************
CAP3_ID .set 035H ; Cap3 中斷向量
CAP3_CLR .set 04H ; Cap3 中斷標(biāo)志清除
_c_int4
MAR *,AR1 ; Save context
MAR *+ ; point to a guaranteed unused location
SST #1, *+ ; save ST1
SST #0, *+ ; save ST0
SACH *+ ; save acc high
SACL *+ ; save acc low and point to an unused loca.
;More context save if needed
LDP #PIVR>>7 ; set DP
LACC PIVR ; load peripheral int vector/ID/offset
SUB #CAP3_ID ; Capture 1 int?
BCND CAP3_INT,EQ ; to PDPISR if zero
CALL PHANTOM ; got a phantom int if not
B REST_INT4 ; return
CAP3_INT
LDP #EVIFRC>>7
SPLK #CAP3_CLR,EVIFRC ; Clear Capture 1 int flag
CALL QEP_INDEX_ISR_DRV ; QEP index routine
;=========================================================
;End main section of ISR INT4 -EV GROUP C INTS 結(jié)束
;=========================================================
;斷點(diǎn)恢復(fù)
REST_INT4 ;More context restore if needed
MAR *, AR1 ; make stack pointer active
MAR *- ; point to top of stack
LACL *- ; Restore Acc low
add *-,16 ; Restore Acc high
LST #0, *- ; restore ST0
LST #1, *- ; restore ST1 and pointer
EINT
RET ; return
;==============================================================================
; I S R - PHANTOM
;
; 功能描述: 啞中斷服務(wù)程序
;
; 修改記錄:
; 最后更新日期: 2005.6.23
;==============================================================================
PHANTOM B PHANTOM
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -