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

📄 control1.asm

📁 基于DSP2407的汇编语言实现交流电机异步调速系统控制程序
💻 ASM
📖 第 1 页 / 共 5 页
字号:
			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 + -