📄 motor velocity control dsp program.txt
字号:
《三相永磁电机磁场定向速度控制DSP程序》
.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格式
SPEEDSTEP .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
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 ;定时器下溢比较器重载,允许比较
SPLK #PWMPRD,T1PR ;周期寄存器值600
SPLK #0,T1CNT
SPLK #0840H,T1CON ;连续增减计数方式,预分频为1,允许T1
SPLK #0000H,T2CNT ;编码脉冲计数器
SPLK #0FFFFH,T2PR
SPLK #9870H,T2CON ;定向增减,允许编码接口
;-----------------------中断初始化--------------------------------------------------------------------
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
;-----------------------相位初始化-----------------------------------------------------------------
LACL INITPHASE
BCND RUN,NEQ ;初始化?已初始过则跳转
LACC #0FC00H ;设置TETA = 0FC00H= -90°,Q12
SACL TETA_E
LACC #ISQREFINIT ;Q轴电流等于参考电流
SACL ISQREF
LACC #0 ;对变量和标志清零
SACL ISDREF
SACL TETA_M
SACL ENCODEROLD
SACL N
SACL SPEEDTMP
LACC #SPEEDSTEP ;SPEEDSTEP=28
SACL SPEEDSTEP
LDP #0E8H
SPLK #0,T2CNT ;编码器计数清零
LDP #0
LACC #WAITTIME ;循环次数A000H,等待
SUB #1
SACL WAITTIME
BCND WAIT,NEQ
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
SUB #ENCPULSES ;检测TETA_M是否大于360°
BCND ENCMINMAX,LT ;不大于则跳转
SACL TETA_M ;大于则保存差值
ENCMINMAX
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -