📄 control1.asm
字号:
sacl CHSELSEQ4
ldp #DP_PF1
sacl SCIRXBUF
sacl SCITXBUF
***********变量初始化******************
ldp #6
splk #pwmprd,PWMPRD ;PWMPRD=2000
splk #483h,VDCinvT ;540v=VDC 10k频率(近似2000/540/220*1.414=1152=480h)
splk #32536,N_rep ;静态采集完毕,电机才开始运转,之后采集的才是母线电流
splk #f_add_np,f_add_n
splk #00,N_pulse
splk #Wp,wp
splk #SPEEDSTEP,speedstep
splk #KSPEED,Kspeed
splk #KCURRENT,Kcurrent
splk #Kvf,K_vf ;4.12
splk #v_rep3,v_rep_3 ;16.0
;splk #50, f_ref ;16.0
splk #500,f_ref ;//此处改动,扩大10倍
splk #00,f_refbuf
splk #00,f_refbuf1
splk #00h,f_ref_rx
splk #00h,f_ref_rx1
splk #00h,ref_rx_h
splk #00h,ref_rx_l
splk #00h,bit_flag
splk #00h,tx_bit_flag
splk #00h,rx_bit_flag
splk #00h,spi_flag
splk #00h,da_flag
splk #00h,sci_flag
splk #00h,save_flag
splk #00h,sta_save_flag
splk #Knp,Kn_p ;比例系数,mpy指令不能乘以多于13位的立即数,所以此处赋给变量,采用直接寻址。
splk #Kqp,Kq_p
splk #Kdp,Kd_p
splk #Kni,Kn_i ;积分系数
splk #Kqi,Kq_i
splk #Kdi,Kd_i
**********页面7***************
ldp #7
splk #Knd,Kn_d ;微分系数
splk #Kqd,Kq_d
splk #Kdd,Kd_d
splk #0h,temp ;上传数据所用的变量
splk #0h,n_fed_tx
splk #K,k ;矢量控制计算磁链角
**********IO口配置************
ldp #DP_PF2
lacl MCRA
and #0000h ;IOPA2(OUO),IOPB4,IOPB5,IOPB6,IOPB7
or #0ffbh ;PWM1,PWM2,PWM3,PWM4,PWM5,PWM6
sacl MCRA ;QEP1,QEP2,CAP3,SCITXD,SCIRXD
lacl PADATDIR
and #0H ;配置IOPA2输出,且输出低电平,灯亮
or #0400H
sacl PADATDIR
lacl PBDATDIR
and #0H ;配置IOPB4,IOPB5,IOPB6,IOPB7输出
or #0F000H ;且输出低电平
sacl PBDATDIR
lacl MCRB
and #0H ;IOPD0(VCO),IOPC1,IOPC6(OCO),IOPC7(OSO)
or #0FE3DH ;W/R,SPISIMO,SPISOMI,SPICLK,SPISTE
sacl MCRB
lacl PCDATDIR
and #0H ;配置IOPC1输入,且输入低电平
or #0C000H ;配置IOPC6,IOPC7输出,且输出低电平,灯亮
sacl PCDATDIR
lacl PDDATDIR
and #0H
or #0100H ;配置IOPD0输出,且输出低电平,灯亮
sacl PDDATDIR
lacl MCRC
and #0H ;IOPE0~IOPE7,IPPF0~IOPF6
sacl MCRC
lacl PEDATDIR
and #0H ;IOPE0(ERO)输出高电平,在中断中置为低电平,断开继电器,表示故障输出.IOPE7(CS1)输出,且输出低电平
or #1000000101000001b ;IOPE1(ENCW),IOPE2(PNP),IOPE3(MS),IOPE4(RUN),IOPE5(PREP),IOPE6(VCE)
sacl PEDATDIR ;vce输入,且输入低电平,发生故障时,置低
lacc PFDATDIR
and #0 ;IOPF0(CS6)输出,且输出低电平
or #0000000100001100b ;IOPF1(PCP),IOPF2(OV),IOPF3(OCU),IOPF4(ENCU),IOPF5(ENCV),IOPF6(MOT)
sacl PFDATDIR ;ov、ocu输入,且输入高电平,发生故障时,置低
************SPI初始化****************
ldp #DP_PF1
;splk #000Fh,SPICCR ;复位位先清零,上升沿发送,下降沿接受
;splk #06h,SPICTL ;主方式,允许发送,禁止超时中断,禁止spi中断
;splk #00h,SPIBRR ;5M ;10M(5617最大串行速率20Mhz)
;splk #08Fh,SPICCR ;复位位置1
SPLK #004Fh,SPICCR ;FALLING EDGE OUTPUT,16BIT DATA
SPLK #000Eh,SPICTL ;SPI CLK DELAY 1/2 CYCLE,MASTER MODE,DISABLE INTERRUPT
SPLK #0000h,SPIBRR ;BAUD RATE--10M
SPLK #00CFH,SPICCR
*********开中断**********************
LDP #0H
SPLK #0013H,IMR ; 使能INT2(T1UFINT),INT1(功率保护中断),INT5(RXINT)
SPLK #0FFFFH,IFR
***************EVA初始化*****************
;定时器1的初始化
LDP #DP_EVA
SPLK #0201H,EVAIMRA ;使能定时器1下溢中断
SPLK #0000H,EVAIMRB
SPLK #0000H,EVAIMRC
SPLK #0ffffH,EVAIFRA
SPLK #0ffffH,EVAIFRB
SPLK #0ffffH,EVAIFRC
SPLK #0000100000000010b,T1CON ;连续增减计数,1倍预分频,定时器2不由定时器1的使能位来控制
;先禁止定时器操作,计数为零时重装载
SPLK #08f0h,DBTCONA ;死区时间8*16*25ns=3.2μs
SPLK #0100000011001010b,GPTCONA;定时器1下溢中断启动模数转换,允许定时器比较输出,高有效
;定时器2采用增计数
SPLK #2000,T1PR
SPLK #0H,T1CNT
SPLK #0999H,ACTRA ;PWM1,3,5高有效,PWM2,4,6低有效
SPLK #0FFFFH,CMPR1 ;先不输出PWM波形
SPLK #0FFFFH,CMPR2
SPLK #0FFFFH,CMPR3
SPLK #1000001000000000b,COMCONA;禁止空间矢量,允许比较操作
; LDP #DP_EVA
; LACC T1CON ;不使能定时器1
; OR #40H
; SACL T1CON
;捕获单元及光电编码器的初始化
LDP #DP_EVA
SPLK #0001000000001100b,CAPCONA;使能正交编码QEP1/QEP2
SPLK #0H,T2CNT
SPLK #0FFFFH,T2PR ;T2PR设为最大值
SPLK #1001100001110000b,T2CON ;定向增减计数,128预分频,使用自身周期寄存器
;使能定时器2,选用正交编码脉冲电路作为时钟源
*************AD初始化**************
ldp #DP_PF2
splk #0100000000000000b,ADCTRL1 ; Reset ADC module
nop
splk #0011111110010000b,ADCTRL1 ; Take ADC out of reset
splk #15,MAXCONV
splk #0000h, CHSELSEQ1 ; Convert Channels 0,0,0,0
splk #8800h, CHSELSEQ2 ; Convert Channels 8,8,8,0
splk #8888h, CHSELSEQ3 ; Convert Channels 3,3,8,8
splk #0AA33h, CHSELSEQ4 ; Convert Channels A,A,A,3
splk #0100000100000000b,ADCTRL2 ; Start the conversions
; EVA触发ad转换
************清变量,即变量初始化**************
LDP #6
LACL #0h
SACL tmp
SACL tmp0
SACL tmp1
sacl option_flag
sacl tmp3
sacl tmp4
sacl tmp5
SACL flag
sacl option
sacl Umax
sacl va
sacl vb
sacl vc
sacl vsalfa
sacl vsbeta
sacl va_b
sacl vb_b
sacl vc_b
sacl a_pwm
sacl b_pwm
sacl c_pwm
SACL ia
SACL ib
SACL ia_min
SACL ia_max
SACL ia1
SACL ia2
SACL ia3
SACL ia4
SACL ia5
SACL ia6
SACL ia_rep_l
SACL ia_rep_h
SACL ib_rep_l
SACL ib_rep_h
SACL ia_rep
SACL ib_rep
SACL isa ;phase current ia
SACL isb
SACL isc
SACL t1 ;svpwm t1
SACL t2
SACL t1sat
SACL t2sat
SACL v_ref1 ;variable for sector calculation
SACL v_ref2
SACL v_ref3
SACL taon ;pwm commutation instant phase 1
SACL tbon
SACL tcon
SACL fa
SACL fb
SACL isalfa ;alfa-axis current
SACL isbeta
SACL vsal_ref ;alfa-axis referance voltage
SACL vsbe_ref
SACL isdref ;d-axis referance current
SACL isqref
SACL isd ;d-axis current
SACL isq
SACL vsdref ;d-axis referance voltage
SACL vsqref
SACL epiq ;q-axis current regulator error
SACL epid
SACL xid ;d-axis current regulator intrgral component
SACL xiq
SACL X ;svpwm variable
SACL Y
SACL Z
sacl A
sacl B
sacl C
SACL sector
sacl i_mr
sacl fs
sacl theta_cm
sacl theta_w
sacl sin_theta_cm
sacl cos_theta_cm
SACL n_fed ;feedback speed
SACL n_ref ;speed reference
SACL epin ;speed regulator integral error
SACL xin ;speed regulator integral component
sacl xin_h
sacl xin_l
SACL upi ;PID regulators output(current and speed)
sacl upi_h
sacl upi_l
SACL elpi ;PID regulators limitation error (current and speed)
SACL encincr ;encoder pulses between two consecutive sampling periods
SACL speedtmp ;used to accumulate encoder pluses increments
*********设定堆栈保护指针*****************
LAR AR7,#79H ;B2块(60H-80H)
;lar ar1,#DATSAVE
;lar ar0,#DATSAVE+2048
lar ar1,#UF_E
lar ar0,#UF_E+2048
lar ar4,#0h ;初始化时为0,10个定时器周期存储一次数据
call sta_read
LDP #DP_EVA
LACC T1CON ;现在使能定时器1
OR #40H
SACL T1CON
CLRC INTM
*****************************************
******* SCI初始化***********************
LDP #DP_PF1
SPLK #10000111b,SCICCR ; 2个停止位 ,奇校验,地址位模式,8位数据
SPLK #00000111b,SCICTL1 ; 禁止接收错误中断,复位位先清零,无特定发送唤醒位,SLEEP=1,
SPLK #00000011b,SCICTL2 ; 接收中断 ,发送中断
SPLK #0002H,SCIHBAUD ; baud=9600
SPLK #0008H,SCILBAUD
SPLK #00100111b,SCICTL1 ; SCI寄存器修改完毕,复位位置1
SPLK #01111000b,SCIPRI ;设置低优先级的接收发送中断
***********************************************************************
***********进入主循环程序(进入主循环程序之前,应读取好面板状态)**********
***********在主循环程序中完成与sci有关的接收,发送数据********************
***********待发送的数据首先应存入ram,才能启动sci发送******************
main:
ldp #6
lacl save_flag ;每次定时器下溢中断结束,置位save_flag
bcnd main,eq ;00,jump
******************************************
ldp #6
lacl sta_save_flag ;每次转速改变,置位该标志位
sub #01h
bcnd no_save,neq
mar *,ar4 ;10个定时器周期存储一次
banz no_save ;ar4不为0,跳转至no_save,ar4自动减1
lar ar4,#10 ;ar4为0后,重新赋值。ar4初始化设为0
*******************************************
***************变量存储********************
start_save:
mar *,ar1 ;ar1-->#UF_E
cmpr 00 ;ar0-->#UF_E+2048
bcnd saveend ,tc ;ar1=ar0时,存储结束
******************************************
********n_fed转化为十进制,偏移后发送******
;setc SXM ;此处的置符号语句曾导致接受中断两次接受的数据有差别(符号差别)
ldp #DP_BSS1
lt n_fed ;测试n_fed
mpy #5dch ;1500rpm,Q0,n_red(Q15)*5dch=实际的十进制转速
pac
ldp #DP_BSS2
sach temp,1
lacl temp
add #5dch ;n_fed加上偏移量后发送
sacl temp
*******************************************
************开始发送***********************
lar ar2,#temp ;首先存储n_fed
save_next:
mar *,ar2 ;存储下一个变量
lacl *,ar1 ;ar2指向下一个变量首地址
sacl *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -