?? 采樣spwm程序.asm.bak
字號:
;《采用不對稱規則采樣法生成三相SPWM波的開環調速控制程序》
; 本例載波頻率為20KHz,或載波周期為50μs。DSP晶振10MHz,內部4倍頻,時鐘頻率為40MHz,計數周期為25ns/時鐘頻率為20MHz,計數周期為50ns。假設調制波頻率由外部輸入(1~50Hz),并轉換成合適的格式(本例為Q4格式)。調制系數M為0~0.9。死區時間1.6μs。最小刪除脈寬3μs。
; 主程序的工作是根據輸入的調制波頻率計算N、2N和M值。
; 定時器采用連續增減計數方式。利用下溢中斷,每個載波周期都產生一次中斷,在每次中斷都根據以下公式分別計算出下一個載波周期的三個比較值。并比較正負脈寬是否小于3μs,如果小于3μs則刪除該脈沖。
; 本例中的常數:
; π倍載波周期:π50*10e-6*2^28=42166秒,Q28格式
; 載波頻率:20000Hz*2=40000Hz,Q1格式;
; 定時器周期值:50μs/2/25ns=1000個計數周期; 因為個載波周期內 計數器兩次溢出 所以只計算一次的時間即25μs
; 調制系數對調制波頻率的比例系數:0.9/50=0.018×221=37749,Q21格式;
; 最小正脈寬:3μs/25ns=120個計數周期;
; 最小負脈寬:47μs/25ns=1880個計數周期;
; 弧度換算成度系數:360/2π*2^4=917,Q4格式;
; 2π/3*2^12=8579弧度,Q12格式;
; 4π/3*2^12=17157弧度,Q12格式;
; 2π*2^12=25736弧度,Q12格式;
.INCLUDE "240X.H" ;寄存器地址
;--------------------------------------以下定義變量-----------------------------------------------------------
.bss TEMP,1 ;中間變量 .bss 變量符號,空間(word單位)[,塊標記]
.BSS TEMP1,1 ;中間變量
.BSS TEMP2,1 ;中間變量
.BSS TEMP3,1 ;中間變量
.BSS TEMP4,1 ;中間變量
.BSS TEMP5,1 ;中間變量
.BSS TEMP6,1 ;中間變量
.BSS K_,1 ;第K個采樣點
.BSS PITC,1 ;π乘載波周期=42166,Q28格式
.BSS F2M,1 ;調制系數對調制波頻率的比例系數, Q21格式
.BSS T_HALF,1 ; T_carr/2的定時器計數脈沖個數,Q0格式
.BSS F_CARR,1 ;載波頻率,Q1格式
.BSS PMIN,1 ;最小正脈寬(脈沖個數),Q0格式
.BSS PMAX,1 ;最小負脈寬(脈沖個數),Q0格式
.BSS F_MODU,1 ;調制波頻率,Q4格式
.BSS N_,1 ;每個調制波周期的載波脈沖數,Q0格式
.BSS KMAX,1 ;2N,Q0格式
;--------------------------------------CONTEXT段,定義保護現場數據區----------------------------
ST0_SAVE .USECT ".CONTEXT",1 ;狀態寄存器ST0保存單元 .USECT 表示為未初始化變量在指定段名的斷中保留空間
ST1_SAVE .USECT ".CONTEXT",1 ;狀態寄存器ST1保存單元 用法 變量符號 .usect'
ACCH .USECT ".EXTCONT",1 ;ACC高字保存單元
ACCL .USECT ".EXTCONT",1 ;ACC低字保存單元
P_HI .USECT ".EXTCONT",1 ;P寄存器高字保存單元
P_LO .USECT ".EXTCONT",1 ;P寄存器低字保存單元
T_SAVE .USECT ".EXTCONT",1 ;T保存單元
;--------------------------------------以下是主程序-----------------------------------------------------
.TEXT
;--------------------------------------系統初始化程序--------------------------------------------------
_C_INT0 SETC INTM ;禁止中斷
CLRC CNF ;B0為數據存儲區
LDP #224
SPLK #0000001000000100B,SCSR1 ;2倍頻,CLKOUT 40MHz
SPLK #68H,WDCR ;不用看門狗
LDP #225
LACC MCRA
OR #0FC0H ;設置PWM1-6引腳 1111 1100 0000b
SACL MCRA
;--------------------------------------中斷初始化程序------------------------------------------------
LDP #0
SPLK #0FFH,IFR ;清所有系統中斷標志
SPLK #00000010B,IMR ;開INT2中斷
LDP #232
SPLK #0FFFH,EVAIFRA ;清事件管理器A所有中斷標志
SPLK #0FH,EVAIFRB
SPLK #0FH,EVAIFRC
SPLK #0200H,EVAIMRA ;開T1下溢中斷
SPLK #0,EVAIMRB ;屏蔽所有中斷
SPLK #0,EVAIMRC ;屏蔽所有中斷
;--------------------------------------初始化事件管理器A程序-----------------------------------------
SPLK #1000,T1PR ;T1周期值=1000
SPLK #1000,CMPR1 ;占空比初值 0%
SPLK #1000,CMPR2
SPLK #1000,CMPR3
SPLK #0000011001100110B,ACTRA ;引腳PWM1,3,5高有效,2,4,6低有效11~10位為cmp6 00為強制低 01為低有效 10為高有效 11強制高
SPLK #01F4H,DBTCONA ;死區時間1*32*50ns=1.6μs 0000 0001(m=1) 111(全部使能) 101(p=32) 00 p=32 m=1 (1×32*25ns=50)
SPLK #1000001000000000B,COMCONA ;允許比較,下溢重載
SPLK #0000100001000010B,T1CON ;連續增減計數方式,預分頻=1
CLRC INTM ;開總中斷
;--------------------------------------變量初始化---------------------------------------------------------
LDP #5
SPLK #0,K_ ;K=0
SPLK #42166,PITC ;π*T_carr =42166,Q28格式
SPLK #37749,F2M ;F-M轉換系數,Q21格式
SPLK #1000,T_HALF ;T_carr/2的定時器計數脈沖個數,Q0格式
SPLK #40000,F_CARR ;載波頻率,Q1格式
SPLK #120,PMIN ;最小正脈寬(脈沖個數),Q0格式
SPLK #1880,PMAX ;最小負脈寬時的最大正脈寬,Q0格式
;--------------------------------------主循環-------------------------------------------------------------
CYCLE LDP #5
LACC F_MODU,13 ;調制波頻率,Q4格式
SACH TEMP ;右移3位,Q1格式
LACC F_CARR ;載波頻率,Q1格式
RPT #15
SUBC TEMP ;計算N=F_carr/F_modu
SACL N_ ;保存N,Q0格式
LACC N_,1 ;2N
SACL KMAX ;保存,Q0格式
LT F2M ; F-M轉換系數37749,Q21格式
MPY F_MODU ;Q4格式
PAC
SACH M_ ;保存M,Q9格式
B CYCLE ;循環
;--------------------------------------假中斷子程序---------------------------------------------------------
PHANTOM RET ;假中斷
;--------------------------------------T1下溢中斷處理子程序-----------------------------------------
_C_INT2 SST #ST0,ST0_SAVE ;保存現場ST0
SST #ST1,ST1_SAVE ;保存ST1
LDP #5
SACH ACCH
SACL ACCL ;保存ACC
SPH P_HI
SPL P_LO ;保存 P
MPY #1 ;P<=T
SPL T_SAVE ;保存 T
LDP #224
LACC PIVR,1 ;讀偏移地址
ADD # PVECTORS ;子向量表首地址
BACC
WXM LDP #232
SPLK #0200H,EVIFRA ;清中斷標志
LDP #5
LT PITC ;π*T_carr =42166,Q28格式
MPY K_ ;Q0格式
PAC ;計算K*π*T_carr
SACH TEMP1 ;保存乘積,Q12格式
LT TEMP1
MPY F_MODU ;乘調制波頻率,Q4格式
PAC ;計算K*π*T_carr*T_modu
RPT #3
ROR ;右移4位,Q12格式
SACL TEMP1 ;保存第1個角度值
LACC TEMP1
ADD #8579 ;加2π/3,Q12格式
SACL TEMP2 ;保存第2個角度值
SUB #25736 ;檢測是否小于2π,Q12格式
BCND WXM1 ,LEQ ;小于2π跳轉
SACL TEMP2 ;否則保存
WXM1 LACC TEMP1
ADD #17157 ;加4π/3,Q12格式
SACL TEMP3 ;保存第3個角度值
SUB #25736 ;檢測是否小于2π,Q12格式
BCND WXM2 ,LEQ ;小于2π跳轉
SACL TEMP3 ; 否則保存
WXM2 LT TEMP1 ;開始將第1個角度轉換成度
MPY #917 ;乘轉換系數,Q4格式
PAC
SACH TEMP1 ;保存第1個角度值,Q0格式
LACC #SIN_ENTRY ;SIN表入口地址
ADD TEMP1 ;偏移量
TBLR TEMP1 ;保存第1個SIN值,Q14格式有符號數
LT TEMP1
MPY M_ ;乘M,Q9格式
PAC ;Q23格式
SACH TEMP1,7 ;相當于右移9位,Q14格式有符號數
LACC TEMP1
ADD #1,14 ;加+1
SACL TEMP1 ;保存, Q14格式
LT T_HALF ;T_carr/2=1000,Q0格式
MPY TEMP1
PAC
SACH TEMP1,2 ;相當于右移14位,保存為Q0格式
LT TEMP2 ;開始將第2個角度轉換成度
MPY #917
PAC
SACH TEMP2 ;保存第2個角度值,Q0格式
LACC #SIN_ENTRY ;SIN表入口地址
ADD TEMP2 ;偏移量
TBLR TEMP2 ;保存第2個SIN值,Q14格式有符號數
LT TEMP2
MPY M_ ;乘M,Q9格式
PAC ;Q23格式
SACH TEMP2,7 ;相當于右移9位,Q14格式有符號數
LACC TEMP2
ADD #1,14 ;加+1
SACL TEMP2 ;保存, Q14格式
LT T_HALF ;T_carr/2=1000,Q0格式
MPY TEMP2
PAC
SACH TEMP2,2 ;相當于右移14位,保存為Q0格式
LT TEMP3 ;開始將第3個角度轉換成度
MPY #917
PAC
SACH TEMP3 ;保存第3個角度值,Q0格式
LACC #SIN_ENTRY ;SIN表入口地址
ADD TEMP3 ;偏移量
TBLR TEMP3 ;保存第3個SIN值,Q14格式有符號數
LT TEMP3
MPY M_ ;乘M,Q9格式
PAC ;Q23格式
SACH TEMP3,7 ;相當于右移9位,Q14格式有符號數
LACC TEMP3
ADD #1,14 ;加+1
SACL TEMP3 ;保存, Q14格式
LT T_HALF ;T_carr/2=1000,Q0格式
MPY TEMP3
PAC
SACH TEMP3,2 ;相當于右移14位,保存為Q0格式
LACC K_
ADD #1 ;K+1
SACL K_
LT PITC ;π*T_carr =42166,Q28格式
MPY K_ ;Q0格式
PAC ;計算K*π*T_carr
SACH TEMP4 ;保存乘積,Q12格式
LT TEMP4
MPY F_MODU ;乘調制波頻率,Q4格式
PAC ;計算K*π*T_carr*T_modu
RPT #3
ROR ;右移4位,Q12格式
SACL TEMP4 ;保存第4個角度值
LACC TEMP4
ADD #8579 ;加2π/3,Q12格式
SACL TEMP5 ;保存第5個角度值
SUB #25736 ;檢測是否小于2π,Q12格式
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -