📄 spwm.asm
字号:
.include "LF2407.h"
.include "vectors.h"
.def _c_int0
;--------------------------------------以下定义变量-----------------------------------------------------------
.bss TEMP,1 ;中间变量 0280h
.BSS TEMP1,1 ;中间变量 0281h
.BSS TEMP2,1 ;中间变量 0282H
.BSS TEMP3,1 ;中间变量 0283H
.BSS K_,1 ;第K个采样点 0284H
.BSS T_HALF,1 ; T_carr/2的定时器计数脉冲个数,Q0格式 0285H
.BSS F_CARR,1 ;载波频率,Q1格式 0286H
.BSS PMIN,1 ;最小正脉宽(脉冲个数),Q0格式 0287H
.BSS PMAX,1 ;最小负脉宽(脉冲个数),Q0格式 0288H
.BSS N_,1 ;每个调制波周期的载波脉冲数,Q0格式 0289H
.bss M_,1 ;调制系数 028aH
.bss softtime_,1 ;软启动时间*0.5s 028bH
.bss delay,1 ;延时计数器 028cH
;--------------------------------------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为数据存储区
clrc sxm ;进行符号扩展
LDP #224
SPLK #0304h,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 ;开放EVA中PWM1~6
;--------------------------------------中断初始化程序------------------------------------------------
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下溢中断 每个载波(50us)有一次下溢中断,在这个中断中要算出下一个周期中的采样的值
SPLK #0,EVAIMRB ;屏蔽所有中断
SPLK #0,EVAIMRC ;屏蔽所有中断
;--------------------------------------初始化事件管理器A程序-----------------------------------------
SPLK #1000,T1PR ;T1周期值=1000 半个载波周期值
SPLK #0,CMPR1 ;占空比初值 0%
SPLK #0,CMPR2
SPLK #0,CMPR3
SPLK #0000100110011001B,ACTRA ;引脚PWM1,3,5高有效,2,4,6低有效11~10位为cmp6 00为强制低 01为低有效 10为高有效 11强制高
SPLK #05F4H,DBTCONA ;死区时间4*32*25ns=3.2μs 0000 0101(m ) 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
;--------------------------------------变量初始化---------------------------------------------------------
LDP #5 ;这么说 K_在第五页
SPLK #0,K_ ;K=0
SPLK #1000,T_HALF ;T_carr/2的定时器计数脉冲个数,Q0格式
SPLK #40000,F_CARR ;载波频率,Q1格式
SPLK #120,PMIN ;最小正脉宽(脉冲个数),Q0格式 3us/25ns=120个
SPLK #1880,PMAX ;最小负脉宽时的最大正脉宽,Q0格式 47us/25ns=1880
SPLK #400,N_ ;载波比Q0格式
splk #64,M_ ;调制比初值为0.125 额定值应为0.8 448 q9格式
splk #6,softtime_ ;软启动步进次数7次 64 128 192 256 320 384 448 512 每次加0.125 Q9格式
splk #0,TEMP1;
SPLK #0,TEMP2;
SPLK #0,TEMP3;
splk #0ffffh,delay;延时计数器;
;;--------------------------------------开机信号检测-------------------------------------------------------------
CLRC INTM ;开总中断 随后进入软启动
;--------------------------------------软启动-------------------------------------------------------------
softstart LDP #5 ;软启动
LACL M_
ADD #64
SACL M_ ;保存所改变的调制比M_
; LAR AR1,#0f0H ;延时2s
; CALL delay_s ; delay_s
nop
LDP #5
lacl softtime_ ;循环9次把频率加起来
sub #1
sacl softtime_
bcnd softstart,gt
;--------------------------------------主循环-------------------------------------------------------------
CYCLE
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 ;读偏移地址LACC PIVR,1 ;
ADD #PVECTORS ;子向量表首地址
BACC
WXM LDP #232
SPLK #0200H,EVAIFRA ;清中断标志
LDP #5
LACC K_ ;Q0格式
SACL TEMP1 ;保存第1个角度值
LACC TEMP1
ADD #133 ;加2π/3,Q0格式
SACL TEMP2 ;保存第2个角度值
SUB #400 ;检测是否小于2π,Q12格式
BCND WXM1 ,LEQ ;小于2π跳转
SACL TEMP2 ;否则保存
WXM1 LACC TEMP1
ADD #267 ;加4π/3,Q12格式
SACL TEMP3 ;保存第3个角度值
SUB #400 ;检测是否小于2π,Q12格式
BCND WXM2 ,LEQ ;小于2π跳转
SACL TEMP3 ; 否则保存
WXM2 LACC #SIN_ENTRY ;SIN表入口地址
ADD TEMP1 ;偏移量
TBLR TEMP1 ;保存第1个SIN值,Q14格式有符号数
setc sxm
LT TEMP1 ;q14格式有符号数
MPY M_ ;乘M,Q9格式!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
PAC ;Q23格式
SACH TEMP1,7 ;相当于右移9位,Q14格式有符号数
LACC TEMP1
ADD #1,14 ;加+1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -