⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.asm

📁 此源代码为TI的DSP2407芯片上编写的汇编控制程序。基于SPWM理论实现三相交流异步电机控制。
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;==========================================================================*
        
          .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 + -