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

📄 foc.asm

📁 该软件是关于PMSM永磁同步电动机磁场定向控制的汇编程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:

《三相永磁同步伺服电动机磁场定向速度控制程序》
         .include "240x.h"
;-----------------------以下定义变量和常数-------------------------------------------------------------
               .data
KCURRENT    .set 1383H            ;电流ipuQ12的转换系数19.5的Q8格式
PWMPRD      .set 600              ;周期寄存器值60us/(2*50ns) 
VMIN         .set 0EC00H           ;电压最小极限-1.25 pu,Q12
VMAX        .set 1400H            ;电压最大极限1.25 pu,Q12
ISMAX        .set 1199H            ;相电流最大极限4.51A(10%额定值),Q12
ISQREFINIT   .set 01000H            ;isqref初值4.1A(Q12) (1000H = IBASE)
KENCODER   .set  3                ;磁极对数
ENCPULSES   .set 4096              ;编码器每转脉冲数(1024*4)
KSPEED       .set 0BE7H           ;将脉冲数转换成速度系数,11.9的Q8格式
SPEEDSTEP28  .set 28               ;速度采样周期28个中断
               .bss  T1_PERIODS,1  ;T1周期值的Q5格式
               .bss  KI,1            ;电流积分系数
               .bss  KPI,1           ;电流比例系数
               .bss  KCOR,1         ;电流积分修正系数
               .bss  KISPEED,1      ;速度积分系数
               .bss  KPISPEED,1     ;速度比例系数
               .bss  KCORSPEED,1   ;速度积分修正系数
               .bss  TMP,1          ;临时变量
               .bss  IA,1            ;相电流IA
               .bss  IB,1             ;相电流IB
               .bss  IC,1             ;相电流IC
               .bss  SIN,1            ;SIN值Q12
               .bss  COS,1           ;COS值Q12
               .bss  DEC_MS,24      ;6个逆阵,Q14格式
               .bss  CMP_1,1         ;第1基本矢量,Q0格式
               .bss  CMP_2,1         ;第2基本矢量, Q0格式
               .bss  CMP_0,1         ;0基本矢量/2, Q0格式
               .bss  FIRST_TOG,1     ;存放第一次比较匹配的比较器地址
               .bss  SEC_TOG,1       ;存放第二次比较匹配的比较器地址
               .bss  TETA_E,1        ;转子电角度[0;1000H],对应[0;360]Q12格式
               .bss  ISALFA,1        ;ALFA轴电流
               .bss  ISBETA,1        ;BETA轴电流
               .bss  VSAL_REF,1      ;ALFA轴参考电压
               .bss  VSBE_REF,1      ;BETA轴参考电压
               .bss  ISDREF,1         ;D轴参考电流
               .bss  ISQREF,1         ;Q轴参考电流
               .bss  ISD,1             ;D轴电流
               .bss  ISQ,1             ;Q轴电流
               .bss  VSDREF,1         ;D轴参考电压
               .bss  VSQREF,1         ;Q轴参考电压
               .bss  EPIQ,1            ;Q轴电流调节偏差
               .bss  EPID,1            ;D轴电流调节偏差
               .bss  XIQ,1             ;Q轴电流调节器积分累计量
               .bss  XID,1             ;D轴电流调节器积分累计量
               .bss  N,1               ;速度
               .bss  N_REF,1          ;速度参考值
               .bss  EPISPEED,1       ;速度偏差
               .bss  XISPEED,1        ;速度调节器积分累计量
               .bss  P,1               ;SVPWM扇区索引 
               .bss  INITPHASE,1      ;初始化相位标志
               .bss  TETA_M,1         ;转子机械转角
               .bss  ISQREFMIN,1      ;Q轴电流最小极限
               .bss  ISQREFMAX,1     ;Q轴电流最大极限
               .bss  SECTOR,1         ;SVPWM扇区数
               .bss  INDEX,1           ;查SIN表索引
               .bss  UPI,1             ;PI调节器输出
               .bss  ELPI,1            ;PI调节器极限偏差
               .bss  ENCODEROLD,1   ;前一个采样周期时编码脉冲数
               .bss  ENCINCR,1        ;编码脉冲增量
               .bss  SPEEDTMP,1       ;编码脉冲增量累计值
               .bss  SPEEDSTEP,1      ;速度采样周期减计数器
               .bss  WAITTIME,1       ;相位初始化等待循环次数(在该段时间内,转子被调整到一个合适的位置)
;-----------------------以下是程序-----------------------------------------------------------------------------
         .text
;-----------------------初始化程序-----------------------------------------------------------------------------
         CLRC      CNF               ; B0
         SETC       OVM
         SPM        0
         SETC       SXM               ;扩展符号
         LAR        AR0,#DEC_MS       ;传送逆阵数据
         LAR        AR1,#(24-1)          ; 24个
         LACC       #ANGLES_          ; 指向源
         LARP       AR0 
INIT_TBL  
         TBLR       *+,AR1                 ;下一个
         ADD        #1                   ;下一个地址
         BANZ       INIT_TBL,AR0          ;AR1=0结束 
         LAR        AR4,#79H            ;用于堆栈保存现场,B2(60H-80H)
         LDP        #0E0H
         SPLK       #68H, WDCR         ;不用看门狗
         SPLK       #0284H,SCSR1        ;CLKIN 10MHZ,CLKOUT 20MHZ
         LDP        #0E1H
         SPLK       #0900H,ADCTRL1     ;ADC预分频10,1MHZ
         SPLK       #0001H,MAXCONV    ;两个通道
         SPLK       #0010H,CHSELSEQ1   ;选择ADCIN0和ADCIN1通道
         LACC      MCRA
         OR         #0FD8H              ;设置PWM1-6,QEP1-2
         SACL      MCRA
;至此为止,上面的初始化程序和感应电动机的程序是完全一样的
;-----------------------变量初始化-----------------------------------------------------
         LDP        #0
         SPLK       #19200,T1_PERIODS   ;T1周期值的Q5格式,600*32(Q5格式即右边5位是小数部分,相当于将600(258h)左移动5位,也相当于乘以100000B即2的5次方即32)。
         SPLK       # 7AH,KI              ;积分系数0.03的Q12格式
         SPLK       #999H,KPI             ;比例系数0.60的Q12格式
         SPLK       #0CCH,KCOR          ;KCOR = KI/KPI=0.05,Q12格式
         SPLK       #7AH,KISPEED        ;速度积分系数0.03的Q12格式
         SPLK       #6800H,KPISPEED     ;速度比例系数6.5的Q12格式
         SPLK       #12H,KCORSPEED     ;KISPEED/KPISPEED=0.0046,Q12
         LACC      #ISMAX
         SACL      ISQREFMAX
         NEG
         SACL      ISQREFMIN
         LACC      #0
         SACL      ISQREF
         SACL      ISDREF
         SACL      N_REF
         SACL      INDEX
         SACL      XID
         SACL      XIQ
         SACL      XISPEED
         SACL      UPI
         SACL      ELPI
         SACL      INITPHASE
         LACC      #0A000H
         SACL      WAITTIME
;-----------------------事件管理器A初始化-------------------------------------------------------------------
         LDP       #0E8H
         SPLK      #0666H,ACTRA       ;引脚PWM1,3,5高有效,2,4,6低有效
         SPLK      #300,CMPR1          ;占空比初值为0
         SPLK      #300,CMPR2
         SPLK      #300,CMPR3
         SPLK      #01F4H,DBTCONA     ;死区时间1.6us
         SPLK      #8200H,COMCONA    ;定时器下溢比较器重载,允许比较  (但CMCONA的12为如果设置为0,表示禁止空间向量PWM,所以是不是应该设置为1啊   也就是说COMCONA应该是9200h)
         SPLK      #PWMPRD,T1PR     ;周期寄存器值600
         SPLK      #0,T1CNT
         SPLK      #0840H,T1CON        ;连续增减计数方式,预分频为1,允许T1
         SPLK      #0000H,T2CNT        ;编码脉冲计数器
         SPLK      #0FFFFH,T2PR 
         SPLK      #9870H,T2CON        ;定向增减,允许编码接口
;到此为止,事件管理器A初始化程序和感应电机程序是一样的,只是T1PR值不一样
;-----------------------中断初始化--------------------------------------------------------------------
         SPLK      #0FFFH,EVAIFRA     ;清事件管理器A所有中断标志
         SPLK      #000FH,EVAIFRB
         SPLK      #000FH,EVAIFRC
         SPLK      #0200H,EVAIMRA     ;开T1下溢中断
         SPLK      #0000H,EVAIMRB
         SPLK      #0000H,EVAIMRC
         LDP       #0H
         LACC      #0FFH
         SACL      IFR                  ;清所有系统中断标志
         LACC      #0000010B
         SACL      IMR                 ;开INT2中断
         CLRC      INTM                ;开总中断
;到此为止,此中断初始化程序和感应电机的程序完全一至
;----------------------初始化结束-------------------------------------------------------------------
;----------------------中断向量定义略-------------------------------------------------------------
;----------------------主程序略----------------------------------------------------------------------

;-----------------------T1下溢中断处理子程序-----------------------------------------------------
_C_INT2
;-----------------------保存现场------------------------------------------------------------------------
         MAR       *,AR4                ;AR4作为堆栈指针
         MAR       *-
         SST        #1,*-                 ;保存状态寄存器1
         SST        #0,*-                 ;保存状态寄存器0
         SACH      *-                    ;保存ACC高位
         SACL       *-                    ;保存ACC低位
         LDP        #0E0H 
         LACC       PIVR                 ;读中断向量
         LDP       #0E8H
         SPLK      #0200H,EVAIFRA        ;清中断标志位
;到此为止,保存现场程序和感应电机的程序完全一至
;-----------------------电流采样和AD转换------------------------------------------------------
         LDP       #0E1H
         SPLK      #2000H,ADCTRL2      ;启动AD转换,IA-ADCIN0,IB-ADCIN1
CONVERSION
         BIT       ADCTRL2,3             ;将忙状态位复制到TC
         BCND     CONVERSION,TC       ;等待
         LACC      RESULT0,10     ;转换完毕则将结果寄存器内容载入累加器
         LDP       #0
         SACH     IA
         LDP       #0E1H
         LACC      RESULT1,10
         LDP       #0
         SACH      IB
;到此为止,电流采样和AD转换程序与感应电机的相应程序是一至的
;-----------------------相位初始化-----------------------------------------------------------------
;对于PMSM电机,电机启动时要先进行相位初始化,感应电动机不需要   
;转子位置初始化的原理240手册P14-16有详细介绍  
         LACL      INITPHASE ;此时INITPHASE为0
         BCND     RUN,NEQ               ;初始化?已初始过则跳 。第一次执行时还未初始化,继续向下执行,第二次以后执行该中断程序时,已初始化完毕,所以直接跳转。
         LACC      #0FC00H               ;设置TETA = 0FC00H= -90°,Q12
         SACL      TETA_E 
         LACC      #ISQREFINIT           ;Q轴电流等于参考电流
         SACL      ISQREF 
         LACC      #0                      ;对变量和标志清零
         SACL      ISDREF
         SACL      TETA_M                  ;TETA_M为转子机械转角,赋值0
         SACL      ENCODEROLD              ;ENCODEROLD为前一个采样周期的编码脉冲数
         SACL      N                       ;转速N为0
         SACL      SPEEDTMP                ;编码脉冲增量累计值
         LACC      #SPEEDSTEP28           ;SPEEDSTEP=28
         SACL      SPEEDSTEP              
         LDP        #0E8H
         SPLK       #0,T2CNT              ;编码器计数清零
         LDP        #0
         LACC      #WAITTIME            ;循环次数A000H,等待(A000H=40960)
         SUB        #1
         SACL      WAITTIME
         BCND      WAIT,NEQ              ;初始化相位的等待时间为:40960*60us,在此时间内 转子被初始化一个固定位置。
         SPLK       #1, INITPHASE        ;INITPHASE=1,相位初始化完成
;-----------------------读编码器脉冲数,计算转角增量和转子绝对位置----------------------------------
RUN     
         LDP        #0E8H
         LACC       T2CNT                ;读编码脉冲
         ;NEG                              ;编码器反接线时
         LDP        #0
         SACL       TMP
         SUB       ENCODEROLD          ;减去前一个周期测的脉冲数
         SACL      ENCINCR              ;得到编码增量
         ADD       TETA_M               ;得到转子绝对位置
         BCND     ENCMAGZERO,GEQ     ;调整TETA_M的范围[0;ENCPULSES-1]
         ADD      #ENCPULSES           ;如果TETA_M是负值调整为正
ENCMAGZERO
         SACL      TETA_M            ;转子的绝对位置TETA_M初值为0,通过累计编码脉冲增量可知其绝对位置(相对其初始位置)
         SUB       #ENCPULSES           ;检测TETA_M是否大于360°   (绝对位置TETA_M的最大值,是4096也即编码器一周的脉冲)
         BCND      ENCMINMAX,LT       ;不大于则跳转
         SACL      TETA_M               ;大于则保存差值

⌨️ 快捷键说明

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