📄 采样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 + -