📄 spwm.asm.bak
字号:
.include "LF2407.h"
.include "vectors.h"
;每个载波周期采样两次K<=2N 半个载波周期为25us 而dsp的指令周期25ns 故1000个计数周期即为25us
;寄存器地址
;--------------------------------------以下定义变量-----------------------------------------------------------
.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格式
.bss M_,1 ;调制系数
;--------------------------------------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 #0000001100000100B,SCSR1 ;2倍频,CLKOUT 40MHz clock in 20Mhz 0(保留位)0(clkout引脚源cpu)00 cpu低功耗 001(2倍频) 0保留位 0ad 0 sci 0 spi 0 can 0 evb 1 eva 0保留位 0 illadr
SPLK #68H,WDCR ;不用看门狗
LDP #225
splk #0fc0h,MCRA
;LACC MCRA
;OR #0800H ;设置PWM1-6引脚 0000 1111 1100 0000b 00001000 0000 0000
;SACL MCRA
;--------------------------------------中断初始化程序------------------------------------------------
LDP #0
SPLK #0FFH,IFR ;清所有系统中断标志 写1清除
SPLK #00000010B,IMR ;开INT2中断
LDP #232
SPLK #0FFFH,EVAIFRA ;清事件管理器A所有中断标志
SPLK #0FH,EVAIFRB
SPLK #0FH,EVAIFRC
SPLK #0200H,EVAIMRA ;开T1下溢中断 每个载波(50us)有一次下溢中断,在这个中断中要算出下一个周期中的采样的值
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 32*1*50ns=1.6us)
SPLK #1000001000000000B,COMCONA ;允许比较,比较寄存器CMPRX重载条件为T1CNT=0(下溢)时重载,动作控制寄存器也是当T1CNT=0时下溢重载
SPLK #0000100001000010B,T1CON ;连续增减计数方式,预分频=1
CLRC INTM ;开总中断
;--------------------------------------变量初始化---------------------------------------------------------
LDP #5 ;这么说 K_在第五页 WHY?
SPLK #0,K_ ;K=0
SPLK #42166,PITC ;π*T_carr =42166,Q28格式 PI乘以载波周期 3.14 *50*10e-6
SPLK 37749,F2M ;F-M转换系数,Q21格式 0.018000125885009765625=0.9/50# 37749 0.6/50=1.2=25166
SPLK #1000,T_HALF ;T_carr/2的定时器计数脉冲个数,Q0格式 由于载波周期为50us 而定时器计数周期为25NS 故一个载波周期有2000次 而半个为1000次
SPLK #40000,F_CARR ;载波频率,Q1格式
SPLK #120,PMIN ;最小正脉宽(脉冲个数),Q0格式 3us/25ns=120个
SPLK #1880,PMAX ;最小负脉宽时的最大正脉宽,Q0格式 47us/25ns=1880
splk # 192,F_MODU ; 输入50hz q4格式 1100100000
;--------------------------------------主循环-------------------------------------------------------------
CYCLE LDP #5
LACC F_MODU,13 ;调制波频率,Q4格式1100100 0000000000000000
SACH TEMP ;右移3位,Q1格式
LACC F_CARR ;载波频率,Q1格式 就是为了得到Q1格式
RPT #15
SUBC TEMP ;计算N=F_carr/F_modu 该指令由减法实现了除法 商存在低位 余数在高位
SACL N_ ;保存N,Q0格式
LACC N_,1 ;2N
SACL KMAX ;保存,Q0格式 2N
LT F2M ; F-M转换系数 25166/37749,Q21格式
MPY F_MODU ;Q4格式
PAC
SACH M_ ;保存M,Q9格式 调制系数
B CYCLE ;循环
;--------------------------------------假中断子程序---------------------------------------------------------
PHANTOM RET ;假中断
;--------------------------------------T1下溢中断处理子程序-----------------------------------------
_C_INT2
SST #0,ST0_SAVE ;#ST0,ST0_SAVE ;保存现场ST0
SST #1,ST1_SAVE ; #ST1,ST1_SAVE ;保存ST1
LDP #5
SACH ACCH
SACL ACCL ;保存ACC
SPH P_HI ;保存p寄存器高位指令
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,EVAIFRA ;清中断标志
LDP #5
LT PITC ;π*T_carr =42166,Q28格式
MPY K_ ;Q0格式
PAC ;计算K*π*T_carr p寄存器送入累加器指令
SACH TEMP1 ;保存乘积,Q12格式 存高位
LT TEMP1 ;存入temp1
MPY F_MODU ;乘调制波频率,Q4格式
PAC ;计算K*π*T_carr*f_modu t_carr=1/f_carr t_carr*f_modu=1/n
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格式
BCND WXM3 ,LEQ ;小于2π跳转
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -