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

📄 spwm.asm.bak

📁 dsp 2407的三相逆变器汇编源程序
💻 BAK
📖 第 1 页 / 共 2 页
字号:
 
         .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 + -