📄 main.asm
字号:
;==========================================================================*
.include "F2407.h" ;the header file
.def _c_int0,T1_INT,SCI_INT
;==========定义变量=======================
.bss TEMP,1 ;中间变量
.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 ;PI乘载波周期=42166,Q28格式
.bss F2M,1 ;调制系数对调制波频率的比例系数 Q21格式
.bss T_HALF,1
.bss F_CARR,1 ;载波频率Q1格式
.bss PMIN,1 ;最小正脉宽(脉冲个数)Q0格式
.bss PMAX,1 ;最小负脉宽(脉冲个数)Q0格式
.bss F_MODU,1 ;调制波频率,Q4格式
.bss N_,1 ;每个调制波周期的载波脉冲数,Q0格式
.bss M_,1 ;M值(调制度M的范围0~0.9)这里调制度取0.85
.bss KMAX,1 ;2N,Q0格式
.bss GPR0,1
.bss TEMP_AD,1 ;AD转换值
.bss D_FLAG,1
;==============定义保护现场数据区======================
ST0 .SET 0
ST1 .SET 1
ST0_SAVE .usect ".blk0",1
ST1_SAVE .usect ".blk0",1
ACCH .usect ".blk0",1
ACCL .usect ".blk0",1
P_HI .usect ".blk0",1
P_LO .usect ".blk0",1
T_SAVE .usect ".blk0",1
;======================================================
;系统初始化
;使能EVA,EVB,A/D模块,其他的未使能(根据要求使能)。
;======================================================
.text
.word #0ffffh
.word #0ffffh
.word #0ffffh
.word #0ffffh
_c_int0:
LDP #0H
SETC INTM
LACC IFR
SACL IFR
CLRC CNF
SETC OVM
LDP #WDCR>>7
SPLK #0068h,WDCR ;Disable WD
SPLK #00h,GPR0
OUT GPR0,WSGR
LDP #SCSR1>>7
SPLK #0000000011111100B,SCSR1 ;able eva ,evb,spi only
LDP #MCRA>>7
LACC MCRA
OR #0FC2H ;设置PWM1~6使能
SACL MCRA
;===============中断初始化======================================
LDP #IFR>>7
SPLK #0FFH,IFR ;清所有系统中断标志
SPLK #012H,IMR ;开INT2,INT5中断
LDP #EVAIFRA>>7
SPLK #0FFFH,EVAIFRA ;清事件管理器A中所有中断标志
SPLK #0FH,EVAIFRB
SPLK #0FH,EVAIFRC
SPLK #0200H,EVAIMRA ;开T1下溢中断
SPLK #0,EVAIMRB ;屏蔽EVA中T2所有中断
SPLK #0,EVAIMRC ;屏蔽EVA中捕获中断CAP1,CAP2,CAP3
;=================================================
LDP #SCICCR>>7
SPLK #027H,SCICCR
SPLK #003H,SCICTL1
SPLK #02H,SCICTL2
SPLK #0H,SCIHBAUD ;波特率为115200
SPLK #02aH,SCILBAUD
SPLK #20H,SCIPRI
SPLK #23H,SCICTL1
;===============AD初始化=========================
LDP #0E1H
SPLK #0100000000000011b,ADCTRL1 ; Reset ADC module
NOP
SPLK #0011000000000011b,ADCTRL1 ; Take ADC out of reset,不受仿真悬挂影响
SPLK #4000H,ADCTRL2
SPLK #07h, MAXCONV ; Setup for 4 conversions
SPLK #3333h, CHSELSEQ1 ; Convert Channels 3
SPLK #3333h, CHSELSEQ2 ; Convert Channels 3
;================初始化事件管理器A======================
LDP #T1PR>>7
SPLK #1000,T1PR ;T1周期值=1000个计数周期(载波周期50us,dsp时钟频率40MHz(25ns))
;定时器周期值:50us/(2*25ns)=1000个计数周期
SPLK #1000,CMPR1 ;占空比初值为0%
SPLK #1000,CMPR2
SPLK #1000,CMPR3
SPLK #666H,ACTRA ;引脚1,3,5高有效,2,4,6低有效
SPLK #01F4H,DBTCONA ;死区时间1*32*50ns=1.6us
SPLK #8200H,COMCONA ;允许比较,下溢重载
SPLK #0842H,T1CON ;连续增减计数方式,预分频=1
CLRC INTM ;开总中断
;================变量初始化=============================
LDP #K_
SPLK #2,K_ ;第K个采样点
SPLK #42166,PITC ;PI乘载波周期=42166,Q28格式3.1415926*(1/20000)s*2的28次方
SPLK #37749,F2M ;调制系数对调制波频率的比例系数 Q21格式 0.018*2的21次方
SPLK #35652,F2M ;0.017*2的21次方 0.85/50Hz=0.017*(2的21次方)=35652
SPLK #1000,T_HALF
SPLK #40000,F_CARR ;载波频率Q1格式20000Hz
SPLK #20,PMIN ;最小正脉宽(脉冲个数)Q0格式0.5us/25ns=20
SPLK #1980,PMAX ;最小负脉宽(脉冲个数)时的最大正脉宽Q0格式49.5us/25ns=1980
SPLK #800,F_MODU ;25Hz;调制波频率,Q4格式
;================主循环=================================
CYCLE
CLRC SXM ;符号位不扩展
CALL CUL ;调用A/D转换子程序
LDP #K_
LACC F_MODU,13 ;调制波频率,Q4格式
SACH TEMP ;右移3位,Q1格式,存TEMP
LACC F_CARR ;载波频率Q1格式
RPT #15
SUBC TEMP ;载波频率/调制频率(均为Q1格式)
SACL N_ ;每个调制波周期的载波脉冲数,Q0格式
LACC N_,1 ;2N
SACL KMAX ;2N,Q0格式
LT F_MODU ;调制波频率,Q4格式25*Q4
MPYU F2M ;调制系数对调制波频率的比例系数 Q21格式35652(0.85/50Hz)
PAC
SACH M_ ;{[(0.85/50)*Q21]*(25*Q4)}/Q16=0.425*Q9
B CYCLE
;=================T1下溢中断处理子程序====================
T1_INT
SST #ST0,ST0_SAVE ;保存现场ST0
SST #ST1,ST1_SAVE ;保存ST1
LDP #ACCH
SACH ACCH ;保存ACC
SACL ACCL
SPH P_HI ;保存P
SPL P_LO
MPY #1
SPL T_SAVE ;保存T
;WXM
LDP #EVAIFRA>>7
SPLK #0200H,EVAIFRA ;清中断标志
CLRC SXM
LDP #PITC
LT PITC ;PI乘载波周期=42166,Q28格式
MPYU K_ ;第K个采样点 K=2(Q0格式)
PAC ;计算K*PI*载波周期
SACH TEMP1 ;保存乘积,Q12格式
LT TEMP1
MPY F_MODU ;乘调制波频率,Q4格式
PAC
RPT #3
ROR ;右移4位,Q12格式
SACL TEMP1 ;保存第1个角度值
LACC TEMP1
ADD #8579 ;加2PI/3,Q12格式
SACL TEMP2 ;保存第2个角度值
SUB #25736 ;检测是否小于2*PI,Q12格式
BCND WXM1,LEQ ;若小于2*PI,跳转
SACL TEMP2 ;否则保存第2个角度值
WXM1
LACC TEMP1
ADD #17157 ;加4*PI/3,Q12格式
SACL TEMP3 ;保存第3个角度值
SUB #25736 ;检测是否小于2*PI,Q12格式
BCND WXM2,LEQ ;若小于2*PI,跳转
SACL TEMP3 ;否则保存
WXM2
;================TEMP1================
LACC TEMP1
SACL TEMP
CALL CMP
LACC TEMP
SACL TEMP1 ;ton1A
LACC TEMP2
SACL TEMP
CALL CMP
LACC TEMP
SACL TEMP2 ;ton1B
LACC TEMP3
SACL TEMP
CALL CMP
LACC TEMP
SACL TEMP3 ;ton1C
;================TEMP3 END================
LACC K_ ;第K个采样点(K=2,Q0格式)
ADD #1
SACL K_ ;第K个采样点(K=3,Q0格式)
LT PITC ;PI乘载波周期=42166,Q28格式
MPYU K_ ;计算K*PI*载波周期
PAC
SACH TEMP4 ;保存乘积(Q12格式)
LT TEMP4
MPY F_MODU ;调制波频率(Q4格式)
PAC ;计算 K*PI*载波周期*调制波频率(Q16格式)
RPT #3
ROR ;右移4位(Q12格式)
SACL TEMP4 ;保存第4个角度值
LACC TEMP4
ADD #8579 ;加2PI/3(Q12格式)
SACL TEMP5 ;保存第5个角度值
SUB #25736 ;检测是否小于2*PI(Q12格式)
BCND WXM3,LEQ ;小于2*PI跳转
SACL TEMP5 ;否则保存
WXM3
LACC TEMP4
ADD #17157 ;加4PI/3(Q12格式)
SACL TEMP6 ;保存第6个角度值
SUB #25736 ;检测是否小于2*PI(Q12格式)
BCND WXM4,LEQ ;小于2*PI跳转
SACL TEMP6 ;否则保存
WXM4
;================TEMP4================
LACC TEMP4 ;将第4个角度转换成ton2A
SACL TEMP
CALL CMP
LACC TEMP
SACL TEMP4 ;ton2A
LACC TEMP5
SACL TEMP
CALL CMP
LACC TEMP
SACL TEMP5 ;ton2B
LACC TEMP6
SACL TEMP
CALL CMP
LACC TEMP
SACL TEMP6 ;ton2C
;===============TEMP6 END==================
LACC K_ ;第K个采样点(K=3,Q0格式)
ADD #1
SACL K_ ;第K个采样点(K=4,Q0格式)
SUB KMAX ;比较K是否小于2N
BCND WXM5,LT
SPLK #0,K_ ;K_大于2N,令K_=0
;===============CMPR1=======================
WXM5
LACC TEMP1 ;计算脉宽ton1A
ADD TEMP4 ;ton2A
SFR ;累加器右移1位,而ROR功能一样,只是ROR的进位位C不受SXM的影响
SACL TEMP1
;检测是否小于正脉宽0.5us
SUB PMIN ;最小正脉宽(脉冲个数)Q0格式0.5us/25ns=20
BCND WXM6,GT
SPLK #0,TEMP1 ;是则删除窄脉冲
B WXM7
WXM6
LACC TEMP1 ;检测是否大于最大负脉宽0.5us
SUB PMAX ;最大负脉宽(脉冲个数)Q0格式49.5us/25ns=1980
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -