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

📄 dc_pwm2.asm

📁 直流电动机双极性可逆PWM系统
💻 ASM
字号:

/*直流电动机双极性可逆双闭环PWM控制程序*/
.INCLUDE "240x.H"
/*--------------------------------------以下定义变量和常数---------------------------*/
          .DATA
         .BSS N_KP,1               ;速度调节比例系数
         .BSS N_KI,1                ;速度调节积分系数
         .BSS N_KC,1               ;速度调节积分饱和修正系数
         .BSS I_KP,1                ;电流调节比例系数
         .BSS I_KI,1                ;电流调节积分系数
         .BSS I_KC,1                ;电流调节积分饱和修正系数
         .BSS I_REF,1               ;电流参考值
         .BSS N_REF,1               ;速度参考值
         .BSS DIRECTION,1          ;速度方向标志
         .BSS STACK,6              ;软堆栈初始地址
         .BSS I_EK,1                ;电流偏差
         .BSS I_RK,1                ;电流第K次积分调节累计
         .BSS I_U,1                 ;电流调节输出
         .BSS I_ELPI,1              ;电流极限偏差
         .BSS TMP,1                ;临时变量
         .BSS ENCODEROLD,1       ;前一次编码器读数
         .BSS ENCINCR,1            ;编码增量
         .BSS SPEEDTMP,1           ;编码脉冲累计
         .BSS SPEEDSTEP,1          ;速度调节计数器
         .BSS KSPEED,1              ;编码脉冲-速度转换系数
         .BSS N,1                    ;速度反馈量
         .BSS N_EK,1                 ;速度偏差
         .BSS N_RK,1                 ;速度第K次积分调节累计
         .BSS N_U,1                  ;速度调节输出
         .BSS N_ELPI,1               ;速度极限偏差
         .BSS I_MIN,1                ;电流最小值
         .BSS I_MAX,1               ;电流最大值
/*--------------------------------------定义主向量----------------------------------------------------*/
         .SECT "VECTORS"
         RSVECT   B  _C_INT0           ;复位
         INT1      B  PHANTOM         ;INT1
         INT2      B  PHANTOM         ;INT2
         INT3      B  PHANTOM         ;INT3
         INT4      B  PHANTOM         ;INT4
         INT5      B  PHANTOM         ;INT5
         INT6      B  ADCINT           ;ADC中断
       RESERVED  B  PHANTOM			;地址000EH,测试,优先级10
        SW_INT8   B  PHANTOM		;地址0010H,自定义软中断
SW_INT9   B  PHANTOM		;地址0012H,自定义软中断
SW_INT10  B  PHANTOM		;地址0014H,自定义软中断
SW_INT11  B  PHANTOM		;地址0016H,自定义软中断
SW_INT12  B  PHANTOM		;地址0018H,自定义软中断
SW_INT13  B  PHANTOM		;地址001AH,自定义软中断
SW_INT14  B  PHANTOM		;地址001CH,自定义软中断
SW_INT15  B  PHANTOM		;地址001EH,自定义软中断
SW_INT16  B  PHANTOM		;地址0020H,自定义软中断
TRAP	   B  PHANTOM			;地址0022H,TRAP矢量
NMI	  	   B  PHANTOM			;地址0024H,NMI,优先级3
EMU_TRAP B  PHANTOM			;地址0026H,仿真Trap,优先级2
SW_INT20  B  PHANTOM		;地址0028H,自定义软中断
SW_INT21  B  PHANTOM		;地址002AH,自定义软中断
SW_INT22  B  PHANTOM		;地址002CH,自定义软中断
SW_INT23  B  PHANTOM		;地址002EH,自定义软中断
SW_INT24  B  PHANTOM		;地址0030H,自定义软中断
SW_INT25  B  PHANTOM		;地址0032H,自定义软中断
SW_INT26  B  PHANTOM		;地址0034H,自定义软中断
SW_INT27  B  PHANTOM		;地址0036H,自定义软中断
SW_INT28  B  PHANTOM		;地址0038H,自定义软中断
SW_INT29  B  PHANTOM		;地址003AH,自定义软中断
SW_INT30  B  PHANTOM		;地址003CH,自定义软中断
SW_INT31  B  PHANTOM		;地址003EH,自定义软中断
/*--------------------------------------以下是主程序-------------------------------------------------*/
         .TEXT
/*--------------------------------------初始化程序---------------------------------------------------*/
_C_INT0 
         SETC      CNF    
         CLRC      OVM                
         SETC      SXM                ;符号扩展
         SETC      INTM                ;关中断
         LAR       AR1,#STACK         ;软堆栈指针
         LDP       #0E0H
         SPLK      #68H, WDCR          ;不用看门狗
         SPLK      #0284H,SCSR1        ;10MCLKIN,20MCLKOUT
         LDP       #0E8H
         SPLK      #0FFFFH,T2PR        ;最大周期
         SPLK      #0000H,T2CNT 
         SPLK      #9870H,T2CON        ;定向增减,允许编码接口
         SPLK      #500,T1PR           ;PWM设置,周期50微秒
         SPLK      #0000H,T1CNT
         SPLK      #0096H,ACTRA        ;PWM1,4高有效,2,3低有效
         SPLK      #01F4H,DBTCONA     ;死区1.6微秒
         SPLK      #250,CMPR1          ;占空比为50%
         SPLK      #250,CMPR2
         SPLK      #8200H,COMCONA   ;允许比较,T1下溢重载
         SPLK      #0840H,T1CON       ;连续增减计数,内部时钟,不分频
         SPLK      #0100H,GPTCONA    ;T1周期中断标志启动AD转换
         LDP       #0E1H
         SPLK      #03D8H, MCRA     ;引脚设置为PWM1-4,QEP1-2
         LDP       #0
         LACC     #020H 
         SACL     IMR                  ;允许INT6中断
         LACC     IFR                   ;清标志
         SACL     IFR
         LDP       #0E8H
         LACC      EVAIFRA             ;清标志
         SACL      EVAIFRA
         LACC      EVAIFRB
         SACL      EVAIFRB
         LACC      EVAIFRC
         SACL      EVAIFRC
         SPLK      #0,EVAIMRA
         SPLK      #0,EVAIMRB
         SPLK      #0,EVAIMRC 
         LDP       #0E0H                ;AD设置
         SPLK      #0500H,ADCTRL2     ;允许EVA启动AD转换
         SPLK      #0900H,ADCTRL1     ;10分频
         SPLK      #0000H,MAXCONV    ;一个转换通道
         SPLK      #0000H,CHSELSEQ1   ;ADCIN00通道
         CLRC      INTM                ;开总中断
         LDP       #0                    ;变量初始化
         SPLK      #0,I_REF
         SPLK      #0,N_REF
         SPLK      #I_KP,I_KP            ;给电流比例系数赋值,Q12格式
         SPLK      #I_KI,I_KI            ;给电流积分系数赋值,Q12格式
         SPLK      #I_KC,I_KC           ;给电流积分饱和修正系数赋值,Q12格式
         SPLK      #N_KP,N_KP          ;给速度比例系数赋值,Q12格式
         SPLK      #N_KI,N_KI          ;给速度积分系数赋值,Q12格式
         SPLK      #N_KC,N_KC          ;给速度积分饱和系数赋值,Q12格式
         SPLK      #1, DIRECTION       ;正转
         SPLK      #0, I_RK
         SPLK      #0, I_ELPI
         SPLK      #0, ENCODEROLD
         SPLK      #0, SPEEDTMP
         SPLK      #100, SPEEDSTEP     ; 100个PWM周期
         SPLK      #1000H, KSPEED      ;编码脉冲-速度转换系数,Q22格式
         SPLK      #0, N_RK
         SPLK      #I_MIN,I_MIN        ;给电流最小值赋值
         SPLK      # I_MAX,I_MAX      ;给电流最大值赋值
/*--------------------------------------以下可添加应用程序----------------------------------------------*/
LOOP    LDP       #0
         NOP
         NOP
         B          LOOP              ;循环
/*--------------------------------------假中断处理------------------------------------------------------*/
PHANTOM   
         CLRC     INTM
         RET
/*--------------------------------------A/D中断处理子程序---------------------------------------------*/
ADCINT
         MAR      *,AR1               ;保存现场
         MAR      *+   
         SST       #1, *+               ;保存ST1
         SST       #0, *                ;保存ST0
         LDP      #0E0H
         LACC     PIVR                ;清ADC中断标志
         LDP      #0E8H
         LACC     EVAIFRA            ;清T1周期中断标志
         SACL     EVAIFRA
         LDP      #0E1H
         LACC     ADCTRL2
         OR       #0202H
         SACL     ADCTRL2
/*-------------------------------------电流PI调节----------------------------------------------------*/
         LACC     RESULT0,10         ;读ADC转换结果
         LDP       #0
         SUB       I_REF,16            ;减电流参考值,计算电流偏差
         NEG
         SACL      I_EK               ;保存偏差
         LACC      I_RK,12            ;左移12位
         LT         I_EK 
         MPY       I_KP               ;Q12格式
         APAC  
         SACH      I_U,4               ;相当于右移12位
         BIT        I_U,0               ;检测调节器输出的正负
         BCND      UP,NTC            ;如果正,跳转
         LACC      #0                  ;否则是负
         B         LIMITERS
UP 
         BIT       DIRECTION,15        ;检测转向
         BCND     CW,TC               ;正转,跳转
         LACC      #500                ;否则反转.检测是否超过上限
         SUB       I_U 
         BCND     TOP,LT              ;超过上限进入饱和区则跳转
         LACC     #250                 ;否则检测下限
         SUB       I_U
         BCND     LOW,GT             ;超过下限跳转
         LACC     I_U                  ;否则正常调整
         B         LIMITERS
TOP   
         LACC     #500                 ;ACC =上限值
         B         LIMITERS
LOW 
         LACC     #250
         B         LIMITERS
CW      LACC     #250                ;检测是否超过上限
         SUB      I_U
         BCND     CWTOP,LT          ;超过上限跳转
         LACC      I_U                ;否则正常调整
         B          LIMITERS
CWTOP
         LACC      #250                ;ACC=上限值
LIMITERS  
         LDP       #0E8H
         SACL     CMPR2               ;输出,更新占空比
         SACL     CMPR1               ;更新占空比
         LDP       #0
         SUB       I_U
         SACL     I_ELPI               ;求极限偏差
         LT        I_ELPI
         MPY       I_KC                ;Q12格式
         PAC 
         LT        I_EK
         MPY       I_KI                ;Q12格式
         APAC  
         ADD       I_RK,12
     SACH       I_RK,4              ;更新
/*-----------------------读编码器脉冲数,计算转角增量和转速-----------------------------------------*/
         LDP        #0E8H
         LACC       T2CNT                ;读编码脉冲
         LDP        #0
         SACL       TMP
         SUB       ENCODEROLD          ;减去前一个周期测的脉冲数
         SACL      ENCINCR              ;得到编码增量
         ADD        SPEEDTMP 
         SACL       SPEEDTMP            ;编码脉冲累计
         LACC      TMP                    
         SACL      ENCODEROLD         ;更新ENCODEROLD
         LACC      SPEEDSTEP            ;检测是否该速度调节
         SUB       #1 
         SACL      SPEEDSTEP
         BCND      GO,GT                 ;没到,退出
         LT        SPEEDTMP              ;否则计算转速
         MPY       KSPEED               ;Q22格式
         PAC
         SACH     N,6                    ;相当于右移10位,Q12格式
         LT        N
         MPY      #3000
         PAC
         SACH     N,4                   ;速度反馈值,Q0格式
         LACC     #0 
         SACL     SPEEDTMP             ;SPEEDTMP清零
         SPLK     #100, SPEEDSTEP       ; SPEEDSTEP重新赋初值
/*--------------------------------------速度PI调节-----------------------------------------------------------*/
         LACC     N_REF                ;速度给定值,由外部输入
         SUB       N                    ;减反馈值
         SACL     N_EK                 ;保存偏差
         LACC     N_RK,12               ;左移12位
         LT        N_EK 
         MPY      N_KP                 ;比例系数,Q12格式
         APAC 
         SACH     N_U,4                ;相当于右移12位
         LACC     N_U                  ;检测调节器输出是否超限
         SUB       I_MIN               ;与下限比较
         BCND     POS1,GT              ;如果大于则跳转
         LACC      I_MIN               ;否则超过下限 
         B         LIM                  ;ACC =下限值
POS1
         LACC     N_U
         SUB       I_MAX               ;与上限比较
         BCND      POS2,GT             ;超过上限则跳转
         LACC      N_U                 ;否则正常调整
         B         LIM
POS2
         LACC      I_MAX               ; ACC =上限值
LIM
         SACL      I_REF                ;输出
         SUB       N_U
         SACL      N_ELPI              ;求极限偏差
         LT        N_ELPI
         MPY       N_KC                ;积分饱和修正系数,Q12格式
         PAC 
         LT        N_EK
         MPY       N_KI                ;积分系数,Q12格式
         APAC 
         ADD       N_RK,12 
         SACH      N_RK,4              ;更新N_RK

/*-------------------------------------恢复现场退出----------------------------------------------------------*/
GO      MAR       *, AR1              ;恢复现场
         LST       #0, *-                ;恢复ST0
         LST       #1, *-                ;恢复ST1
         CLRC     INTM
         RET
         .END

⌨️ 快捷键说明

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