📄 svpwm.asm
字号:
.include "F2407REGS.h" ; 寄存器地址
.include "vectors.h"
.global _c_int0 ;全局化标号
.global _C_INT2
.global _PDP_ISR
;--------------------------------------以下定义变量-------------------------------------------------------------
.sect "table"
SIN_ENTRY_ .include sin.tab
PWM_T .set 4000 ;6060 ; 3.3k 5k 4000
T_SAMPLE_ .set 0D1BH;13DCH ; 3.3k 5k 采样周期=***us *2 24=3356秒=D1BH, Q24格式
T1_PERIODS_ .set 4000 ;6060 ;3.3k 4000 T1周期值的Q0格式
PWMCNT_LED_ .set 01000H
Fr_set_STEP_ .set 1H
K_Fr_set .set 05DDH ;Q5
SIZE .set 1000
BUF_START .set 8000H
BUF_START1 .set 8900H
BUF_START2 .set 8D00H
KCURRENT .set 3072 ;q8
MAXCURRENT .set 4096 ; 10A
I_CNT_ .set 65000
KSPEED_ .set 2558 ;将脉冲数转换成速度系数Q20格式1/410
SPEEDSTEP20 .set 20 ;速度采样周期20个中断 4ms
A1_ .set 5017
A2_ .set 2896
.bss TEMP,1 ;临时变量
.bss Fr_set ,1 ;频率调节比,Q15格式(值为0-1,对应0-50Hz)
.bss F_OMEGA,1 ;频率调节比-角频率转换率,Q5格式
.bss OMEGA,1 ;调制波角频率,Q6格式
.bss SET_V,1 ;参考电压,Q14格式
.bss MAX_V,1 ;最大参考电压幅值1/ ,Q14格式
.bss T_SAMPLE,1 ;采样周期,Q24格式
.bss THETA_H,1 ;参考电压相位角高字,Q12格式
.bss THETA_L,1 ;参考电压相位角低字,Q12格式
.bss THETA_R,1 ;相位角的圆整值,Q12格式
.bss THETA_M,1 ;相位查表值(0-90度),Q12格式
.bss THETA_I,1 ;相角查表索引,Q9格式
.bss SS,1 ;SIN符号,Q0格式
.bss SC,1 ;COS符号,Q0格式
.bss SIN_INDX,1 ;SIN表索引,Q0格式
.bss SIN_ENTRY,1 ;SIN表入口地址
.bss SIN_END,1 ;SIN表结束地址
.bss SIN_THETA,1 ;SINθ值,Q14格式
.bss COS_THETA,1 ;COSθ值,Q14格式
.bss UA,1 ;参考电压D轴分量UA,Q12格式
.bss UB,1 ;参考电压Q轴分量UB,Q12格式
.bss THETA_S,1 ;θ-扇区数转换系数,Q15格式
.bss SECTOR,1 ;参考电压所在的扇区数,Q0格式
.bss THETA_90,1 ;90度,Q12格式
.bss THETA_180,1 ;180度,Q12格式
.bss THETA_270,1 ;270度,Q12格式
.bss THETA_360,1 ;360度,Q12格式
.bss DEC_MS,24 ;6个逆阵,Q14格式
.bss T1_PERIODS,1 ;定时器1周期值,Q0格式
.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 ACCH,1 ;ACC高字保存单元
.bss ACCL,1 ;ACC低字保存单元
.bss AR0_SAVE,1 ;AR0保存单元
.bss P_HI,1 ;P寄存器高字保存单元
.bss P_LO,1 ;P寄存器低字保存单元
.bss T_SAVE,1
.bss PWMCNT_LED,1
.bss PWMCNT_Fr_set,1
.bss IA,1 ;q13
.bss IB,1
.bss IC,1
.bss CTRL,1
.bss UDC,1
.bss TEMPER,1
.bss Fr_set_former,1
.bss Fr_set_STEP ,1
.bss Speed_set ,1
.bss KEYDATA,1
.bss TMP ,1
.bss I_CNT ,1
.bss ENCODEROLD,1 ;前一个采样周期时编码脉冲数
.bss ENCINCR,1 ;编码脉冲增量
.bss SPEEDTMP,1 ;编码脉冲增量累计值
.bss SPEEDSTEP,1 ;速度采样周期减计数器
.bss N ,1
.bss IALFA,1 ;ALFA轴电流
.bss IBETA,1 ;BETA轴电流
.bss KSPEED,1
.bss A1 ,1
.bss A2,1
.bss IT ,1
.bss IM ,1
.bss M,1
.bss D,1
.bss KEYDATA1 ,1
.bss A11 ,1
.bss A12 ,1
;-------------------------------------- CONTEXT段,定义保护现场数据区--------------------------
ST0_SAVE .usect ".context",1 ;状态寄存器ST0保存单元
ST1_SAVE .usect ".context",1 ;状态寄存器ST1保存单元
;--------------------------------------以下是主程序--------------------------------------------------------
.text
;--------------------------------------系统初始化程序----------------------------------------------------
_c_int0
SETC INTM ; Disable interrupt
SETC SXM ; Supress sign extension
SETC OVM ; Results overflow normally in Accumulator
CLRC CNF ; B0 is configured as data space
CLRC C ; clear carry bit
LDP #224
SPLK #0000001010000100B,SCSR1 ;CLKIN 20M,CLKOUT 40M
;SPLK #0Eh,SCSR2
SPLK #68H,WDCR ;不用看门狗
;--------------------------------------I/O 初始化程序----------------------------------------------------
LDP #225
LACC MCRA
OR #0FC0H ;设置PWM1-6引脚基本功能
SACL MCRA
LACC MCRC
AND #0FDFFH
SACL MCRC
LACC PFDATDIR
AND #0FDFDH
SACL PFDATDIR
;--------------------------------------中断初始化程序----------------------------------------------------
LDP #0
SPLK #0FFH,IFR ; 清所有系统中断标志
SPLK #03H,IMR ; 开INT2中断
LDP #232
SPLK #0FFFH,EVAIFRA ; 清事件管理器A所有中断标志
SPLK #0FH,EVAIFRB
SPLK #0FH,EVAIFRC
SPLK #0201H,EVAIMRA ; 开T1下溢中断
SPLK #0,EVAIMRB ; 屏蔽所有中断
SPLK #0,EVAIMRC ; 屏蔽所有中断
;--------------------------------------初始化事件管理器A程序-----------------------------------------
SPLK #PWM_T ,T1PR ; T1周期值=200 us/25ns/2=4000
SPLK #PWM_T ,CMPR1 ; 占空比初值 0%
SPLK #PWM_T ,CMPR2
SPLK #PWM_T ,CMPR3
SPLK #0000100110011001B,ACTRA ; 引脚PWM1,3,5低有效,2,4,6高有效
;SPLK #0000011001100110B,ACTRA ; 引脚PWM1,3,5高有效,2,4,6低有效
SPLK #06F4H,DBTCONA ; 死区时间6*32*25ns=4.8us
SPLK #1000001000000000B,COMCONA ;允许比较,不用硬件空间矢量
SPLK #1000100000000010B,T1CON ;连续增减计数方式,预分频=1
;测速初始化
splk #1110001011110000b,CAPCONA
SPLK #0,T2CNT ;编码脉冲计数器
SPLK #0FFFFH,T2PR
splk #1001100101110000b,T2CON ;timer2 for QEP
splk #1110001011110000b,CAPCONA
;SPLK #9870H,T2CON ;定向增减,允许编码接口
;--------------------------------------初始化AD采样程序-----------------------------------------
LDP #225
SPLK #4000H,ADCTRL1
NOP
SPLK #3000H,ADCTRL1
SPLK #4000H,ADCTRL2
SPLK #4,MAXCONV ;/*For SEQ mode (i.e, cascaded mode), MAX CONV1_3-0 are used.*/
SPLK #05346H,CHSELSEQ1
SPLK #0007H,CHSELSEQ2 ;Result0 - ADC模块的ADCIN1 - Udc
;Result1 - ADC模块的ADCIN3 - CT-U(Iw)
;Result2 - ADC模块的ADCIN4 - CT-V(Iu)
;Result3 - ADC模块的ADCIN5 - Regulator
;--------------------------------------变量初始化程序-----------------------------------------------------
LDP #6 ; 指向B1
SPLK #T_SAMPLE_,T_SAMPLE ;采样周期=200us *224=3356秒=D1CH, Q24格式
SPLK #T1_PERIODS_,T1_PERIODS ;T1周期值的Q3格式,4000*8
SPLK #11585,MAX_V ; 最大参考电压幅值1/ ,Q14格式
SPLK #20106,F_OMEGA ;频率调节比-角频率转换率,Q6格式
;当SET_F=1时,对应最大角频率2π*50*32=10053
;频率调节比-角频率转换率,Q6格式
SPLK #0H, PWMCNT_LED
SPLK #0H,PWMCNT_Fr_set
SPLK #Fr_set_STEP_ ,Fr_set_STEP
SPLK #0H ,Fr_set_former
SPLK #0H ,Fr_set
SPLK #I_CNT_ , I_CNT
SPLK #0,THETA_L ;θ低字,Q12格式
SPLK #0,THETA_H ; θ高字,Q12格式
LAR AR0,#THETA_90 ; 传送常用角度和逆阵数据
LAR AR1,#(28-1) ; 28个
LACC #ANGLES_ ; 指向源
LARP AR0
INIT_TBL
TBLR *+,AR1 ; 下一个
ADD #1 ; 下一个地址
BANZ INIT_TBL,AR0 ;AR1=0结束
SPLK #20372, THETA_I ; 相角查表索引,2000/PI,Q5格式
SPLK #31291,THETA_S ; θ-扇区数转换系数,6/(2π),Q15格式
SPLK #SIN_ENTRY_,SIN_ENTRY ;SIN表起始地址
SPLK #(SIN_ENTRY_+1000),SIN_END ;SIN表结束地址
LAR AR1 ,#BUF_START
LAR AR2 ,#BUF_START1
LAR AR3 ,#BUF_START2
splk #KSPEED_ ,KSPEED
splk #A1_ ,A1
splk #A2_ ,A2
splk #0,M
splk #1000,D
SPLK #09DH,A11
SPLK #0127AH,A12
LDP #232
SPLK #0000100001000010B,T1CON ;使能T1
CLRC INTM ; 开总中断
CHECK LDP #225
LACL PFDATDIR
LDP #6
SACL KEYDATA
BIT KEYDATA ,BIT1
BCND STOP ,TC
B RUN
STOP LED_D7_ON
STOP_PWM
B CHECK
;--------------------------------------主循环程序(SET_F由外部输入)-----------------------------------
MAIN
CHECK1 LDP #225
LACL PFDATDIR
LDP #6
SACL KEYDATA
BIT KEYDATA ,BIT1
BCND STOP1 ,TC
B RUN
STOP1 LED_D7_ON
STOP_PWM
B CHECK1
RUN LED_D7_OFF
START_PWM
LDP #6
;SPLK #07D70H , Fr_set
LT Fr_set ; 将频率调节比(Q15格式)转换成角频率
MPYU F_OMEGA ; Q21
PAC ; 积送ACC, Q5格式
SACH OMEGA ; 保存角频率,Q5格式
LT Fr_set ;将频率调节比(Q15格式)转换成参考电压
MPYU MAX_V ; Q15*Q14=Q29
PAC
SACH SET_V ,1 ; 保存参考电压幅值,Q14格式
B MAIN ; 循环
;--------------------------------------假中断处理----------------------------------------------------------
PHANTOM
CLRC INTM
RET
;------------------------PDPINTA Interrupt Service Routine------------------------------------------------
_PDP_ISR
STOP_PWM
LDP #232
SPLK #0001H,EVAIFRA; Clear PDPINTA IF
SPLK #0FFFH,ACTRA
LED_D10_ON
SETC INTM
RET
END_INT1
CLRC INTM ;Enable INT
RET ;INT1 return
;--------------------------------------T1下溢中断处理子程序----------------------------------------------
_C_INT2
SST #0, ST0_SAVE ; 保存现场ST0
SST #1, ST1_SAVE ; 保存ST1
LDP #6
SACH ACCH
SACL ACCL ; 保存ACC
SPH P_HI
SPL P_LO ; 保存 P
MPY #1 ; P<=T
SPL T_SAVE ; 保存 T
SAR AR0,AR0_SAVE ; 保存AR0
CLRC SXM
LDP #224
LACC PIVR ;读偏移地址
SUB #029H ; T1 下溢中断?
BCND T1UF_ISR,EQ ;是下溢中断跳T1UF_ISR
REST
LDP #6 ;否则恢复现场
LAR AR0, AR0_SAVE ; 恢复AR0
LT P_LO ;恢复P
MPY #1
LPH P_HI
LT T_SAVE ;恢复T
LACC ACCH,16
ADDS ACCL ;恢复ACC
LDP #0
LST #1, ST1_SAVE ; 恢复ST1
LST #0, ST0_SAVE ; 恢复ST0
CLRC INTM ; 开中断
RET ; 返回
T1UF_ISR
LDP #232
SPLK #0FFFH,EVAIFRA ; 清中断标志
; /*=============设置几个有用的计数器=============*/
LDP #6
LACC PWMCNT_LED
ADD #1H
SACL PWMCNT_LED
LACL PWMCNT_LED
SUB #1H
BCND ON ,EQ
LACC PWMCNT_LED
SUB #800H
BZ OFF
LACC PWMCNT_LED
SUB #PWMCNT_LED_
BZ NEWCNT
B IN
ON
LED_D8_ON
B IN
OFF
LED_D8_OFF
B IN
NEWCNT
SPLK #0H ,PWMCNT_LED
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -