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

📄 采样spwm程序.asm.bak

📁 dsp 2407的三相逆变器汇编源程序
💻 BAK
📖 第 1 页 / 共 2 页
字号:
  ;《采用不对称规则采样法生成三相SPWM波的开环调速控制程序》
  ;  本例载波频率为20KHz,或载波周期为50μs。DSP晶振10MHz,内部4倍频,时钟频率为40MHz,计数周期为25ns/时钟频率为20MHz,计数周期为50ns。假设调制波频率由外部输入(1~50Hz),并转换成合适的格式(本例为Q4格式)。调制系数M为0~0.9。死区时间1.6μs。最小删除脉宽3μs。
  ;  主程序的工作是根据输入的调制波频率计算N、2N和M值。
  ;  定时器采用连续增减计数方式。利用下溢中断,每个载波周期都产生一次中断,在每次中断都根据以下公式分别计算出下一个载波周期的三个比较值。并比较正负脉宽是否小于3μs,如果小于3μs则删除该脉冲。
  ;  本例中的常数:
 ; π倍载波周期:π50*10e-6*2^28=42166秒,Q28格式
 ; 载波频率:20000Hz*2=40000Hz,Q1格式;
 ; 定时器周期值:50μs/2/25ns=1000个计数周期; 因为个载波周期内  计数器两次溢出 所以只计算一次的时间即25μs
 ; 调制系数对调制波频率的比例系数:0.9/50=0.018×221=37749,Q21格式;
 ; 最小正脉宽:3μs/25ns=120个计数周期;
 ; 最小负脉宽:47μs/25ns=1880个计数周期;
 ; 弧度换算成度系数:360/2π*2^4=917,Q4格式;
 ; 2π/3*2^12=8579弧度,Q12格式;
 ; 4π/3*2^12=17157弧度,Q12格式;
 ; 2π*2^12=25736弧度,Q12格式;
  .INCLUDE "240X.H"  ;寄存器地址
;--------------------------------------以下定义变量-----------------------------------------------------------
              .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格式
;--------------------------------------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   #0000001000000100B,SCSR1 ;2倍频,CLKOUT 40MHz
  SPLK   #68H,WDCR        ;不用看门狗
  LDP    #225
  LACC  MCRA
  OR     #0FC0H             ;设置PWM1-6引脚 1111 1100 0000b
  SACL   MCRA
;--------------------------------------中断初始化程序------------------------------------------------
  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下溢中断
  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  (1×32*25ns=50)
  SPLK   #1000001000000000B,COMCONA ;允许比较,下溢重载
  SPLK   #0000100001000010B,T1CON ;连续增减计数方式,预分频=1
  CLRC  INTM                 ;开总中断

;--------------------------------------变量初始化---------------------------------------------------------
              LDP     #5
              SPLK    #0,K_           ;K=0
              SPLK    #42166,PITC     ;π*T_carr =42166,Q28格式
              SPLK    #37749,F2M      ;F-M转换系数,Q21格式
              SPLK    #1000,T_HALF   ;T_carr/2的定时器计数脉冲个数,Q0格式
              SPLK    #40000,F_CARR  ;载波频率,Q1格式 
              SPLK    #120,PMIN       ;最小正脉宽(脉冲个数),Q0格式
              SPLK    #1880,PMAX      ;最小负脉宽时的最大正脉宽,Q0格式
;--------------------------------------主循环-------------------------------------------------------------
CYCLE       LDP     #5
              LACC   F_MODU,13       ;调制波频率,Q4格式
              SACH   TEMP            ;右移3位,Q1格式
              LACC   F_CARR          ;载波频率,Q1格式
              RPT    #15
              SUBC  TEMP             ;计算N=F_carr/F_modu
              SACL   N_               ;保存N,Q0格式
              LACC   N_,1             ;2N
              SACL   KMAX           ;保存,Q0格式
              LT      F2M             ; F-M转换系数37749,Q21格式
              MPY    F_MODU         ;Q4格式
              PAC
              SACH    M_             ;保存M,Q9格式
              B       CYCLE           ;循环
;--------------------------------------假中断子程序---------------------------------------------------------
PHANTOM    RET                       ;假中断
;--------------------------------------T1下溢中断处理子程序-----------------------------------------
_C_INT2      SST   #ST0,ST0_SAVE      ;保存现场ST0
  SST   #ST1,ST1_SAVE      ;保存ST1
  LDP   #5 
  SACH  ACCH 
  SACL  ACCL              ;保存ACC
  SPH    P_HI 
  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,EVIFRA     ;清中断标志
              LDP    #5
              LT      PITC              ;π*T_carr =42166,Q28格式
              MPY    K_                ;Q0格式
              PAC                       ;计算K*π*T_carr
              SACH   TEMP1            ;保存乘积,Q12格式
              LT      TEMP1
              MPY    F_MODU         ;乘调制波频率,Q4格式
              PAC                      ;计算K*π*T_carr*T_modu
              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格式

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -