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

📄 fchev_can.c

📁 关于电动汽车控制采样处理的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*** Setup ADC and  configuration ***/ 

	*ADCTRL1=0x4000;      /*reset ADC */
	asm("NOP");
	*ADCTRL1=0x0010;      
/*     
 bit 15        0:      Reserved;
 bit 14        0:      no action;
 bit 13-12     00:     Immediate stop on suspend; 
 bit 11-8      0000:   2 x Tclk
 bit 7         1:      Fclk = CLK/2,Tclk = 2 × (1/CLK)(example, for CLK = 40 MHz, Tclk = 50 ns)
 bit 6         0:      Start-stop mode..
 bit 5         0:      ADC interrupt request priority=high
 bit 4         0:      Dual-sequencer mode.
 bit 3         0:      Calibration mode disabled
 bit 2         0:      Full reference voltage is applied to the ADC input  
 bit 1         1:      VREFHI is used as precharge value at ADC input
 bit 0         0:      Self-test mode disabled   */  
 
	 *ADCTRL2=0x4242;  
/*     
 bit 15        0:      No action
 bit 14        1:      Immediately reset sequencer to state CONV00
 bit 13        0:      Clears a pending SOC trigger.
 bit 12        0:      Sequencer is Idle (i.e., waiting for trigger)
 bit 11-10     00:     Interrupt is Disabled
 bit 9         1:      This bit must be cleared by the user writing a 1 to it.
 bit 8         0:      SEQ1 cannot be started by EVA trigger.
 bit 7         0:      Disable External signal start-of-conversion bit for SEQ1
 bit 6         1:      Immediately resets SEQ2 to an initial “pretriggered” state,  
 bit 5         0:      Clears a Pending SOC trigger for SEQ2.
 bit 4         0:      Sequencer is idle
 bit 3-2       00:     Interrupt is Disabled
 bit 1         1:      ,RESET,No interrupt event.
 bit 0         0:      SEQ2 cannot be started by EVB trigger.  */    
 
	*MAX_CONV=0x0003;      /* Number of conversions=4*/  
	 
	*CHSELSEQ1=0x3210;    /*Input Channels Selected order:0-15 */
	*CHSELSEQ2=0x7654;
	*CHSELSEQ3=0xBA98;
	*CHSELSEQ4=0xFEDC;  
	 

    
/*=======================================================================*/

/*** Configure IOPB0 pin as an output ***/
    *PBDATDIR=0x0100; 
          
/*** Other setup ***/
  /* initialize the LED index:OFF STATE */
    LED=LED_STATE;       

    LED6_counter=0;          /* initialize the user6-9 LED flag  */ 
    CAN_TFLAG=0x0000;/*发送时间计数初值*/ 
    
    *T2CON=*T2CON|0x40;        /*Enable timer operations*/
    
/*** Enable global interrupts ***/
	asm(" CLRC INTM");                  /* enable global interrupts */   

    

/*** Proceed with main routine ***/
	while(1);                           /* endless loop, wait for interrupt */

 }
                  
/*分支处理中断子程序 */


 void t2timer_isr(void)
{     int err,temp,xn,yn,Iref,u,fbk;   
            *ADCTRL2=*ADCTRL2|0x2000;/*SRART AD conversion*/

      *EVAIFRB =*EVAIFRB & 0x0001;     /*** clear the T2PINT flag ***/
      *TCR=0x2000;			/*	;清 TA3 和MIF3标志位*/ 
       temp_RCR=*RCR;
       temp_RCR=temp_RCR&0x0040;
       
    /*ouput of AD*/     
loop:
	end_ad=*ADCTRL2&0x1000; /*wait for the end of conversion of adbit12*/
	while(end_ad)goto loop; 
	*ADCTRL2=*ADCTRL2|0x4000; /*Immediately reset sequencer to state CONV00*/  
	channel_0=(*RESULT0)>>6;
	channel_1=(*RESULT1)>>6;
	channel_2=(*RESULT2)>>6;
	channel_3=(*RESULT3)>>6;
	Ib=channel_0;            /*the result of AD for the */
	If=channel_1;            /*the current of battery&Fuel cell and the bus voltage*/
	Ubus=channel_2;  
	
   /*++++++++++++++++++++++++++++++++++++++*/        
     /*filter*/
    xn=Ib;
    fir.input=xn;           
	fir.calc(&fir);
 	yn=fir.output;         
  /*++++++++++++++++++++++++++++++++++++++*/
   Ib=yn;

/*     err=0x01c7-Ib;
     if(err>0)
     {
     P_FC_ref=P_FC_ref-1;
     } 
     if(err<0)
     {P_FC_ref=P_FC_ref+1;
     }
     if(P_FC_ref<0) P_FC_ref=0;
     if(P_FC_ref>0x2f) P_FC_ref=0x2f;    */
     
     
    /* temp=qexp(0.5); */
     Iref=0x01d5;
     fbk=Ib; 
     pid.pid_ref_reg1=Iref;
     pid.pid_fb_reg1=fbk;
     pid.calc(&pid);
     u=pid.pid_out_reg1; /*0000~0x7FFF*/ 
     P_FC_ref=((long)u*0x3c36L)>>18;
     if(P_FC_ref<0) P_FC_ref=0;
     if(P_FC_ref>0x2f) P_FC_ref=0x2f;
    /* u=(u^0x8000)>>1;*/ 
     
     /*++++++++++++++++++++*/

      /*	;CAN查询接收程序 */
      if(temp_RCR==0x0040)
      { 	*RCR=0x0040;  /* 		;复位 RMP2 和 MIF2*/
		*CAN_IFR=0xFFFF;  /*;清全部中断标志*/
	
		mbx2_a=*MBX2A;	
		mbx2_b=*MBX2B;
		mbx2_c=*MBX2C;
		mbx2_d=*MBX2D;
 
		LED_STATE=LED_STATE^0x0002;  /* FLASH THE LED7 */  
           LED=LED_STATE; 
                               
		 *MCR=0x2480;         /*	;DBO=1,CDR=0,ABO=1,STM=0 */
		/*===================*/
	       /**MCR=0x24C0;  */
		/*========================*/		
		*MDER=0x004C;				/*;ME2=ME3=1,MBX2接收, MBX3发送     */  
           
      }
      
      
      
 /*+++++++++++++++++++++++++++++++++*/
   
/*COMMUNICATIOIN WITH PC VIA RS232*/
/*     tx_cnt++;*/
     /*if(tx_cnt==20)*/
   /*  {*/
          /**SCITXBUF=0x55;      */
          /*while(*SCICTL2&0x0080);*/ /*is scirxbuf empty*/
         /* tx_cnt=0;*/
     /*}     */ 
 /*    *SCITXBUF=mbx2_a;
     *SCITXBUF=mbx2_a>>8; 
     *SCITXBUF=mbx2_b;
     *SCITXBUF=mbx2_b>>8;  
     *SCITXBUF=mbx2_c;
     *SCITXBUF=mbx2_c>>8;  
     *SCITXBUF=mbx2_d;
     *SCITXBUF=mbx2_d>>8;*/
     
     
     /*receive data and send out*/ 
  /*   if(*SCIRXST&0x0040)
     { temp=*SCIRXBUF;
       *SCITXBUF=temp;      */
       /*while(*SCICTL2&0x0080);*/ /*is scirxbuf empty?*/
    /* }*/
 
 /*++++++++++++++++++++++++++++++++++++++*/
	  
	  
      /*CAN周期发送程序*/	
      if(CAN_TFLAG==0x000A)
	  {	*MDER=0x0000;			/*	;邮箱不使能   */
		*MCR=0x0100;			/*	;CDR=1,数据改变请求   */

        *MBX3A=-P_FC_ref;/*P_FC_ref;			*/
		*MBX3B=0x0200;
		*MBX3C=0x0400;
	   	*MBX3D=0x0400;
                          
		 *MCR=0x2480;         /*	;DBO=1,CDR=0,ABO=1,STM=0 */
		/*===================*/
	       /**MCR=0x24C0;  */
		/*========================*/		
		*MDER=0x004C;				/*;ME2=ME3=1,MBX2接收, MBX3发送     */
     	*TCR=0x0020; 				/*;邮箱3发送请求 */    
     	
           temp_TCR=*TCR;
           temp_TCR=temp_TCR&0x2000;
           if(temp_TCR=0x2000)
             {LED_STATE=LED_STATE^0x0004;
              LED=LED_STATE;
              CAN_TFLAG=0;
              }       
         
            LED8_counter=0x0000;
        }    
        
        

          
          
/*** DAC output ***/     
     DAC0=Ib;                      /*output the result of Ib to DAC0*/
     DAC1=yn;                   /*output the result of Ib to DAC1*/
     DAC2=Ib;                  /*output the result of If to DAC2*/
     DAC3=Ib;                  /*output the result of Ubus to DAC3*/
  
     DACUD=temp;          /*trigger the DAC to output */
         
 	/*+++++++++++++++++*/ 
	 *SCITXBUF=0x99;  
delay();  
     *SCITXBUF=P_FC_ref>>8;
delay();
     *SCITXBUF=P_FC_ref;  
delay();
     *SCITXBUF=0x77;
     /*++++++++++++++++*/        
         
         
         
         
         
         
         
           
           
        /*辅助观测程序*/
	    *PBDATDIR=*PBDATDIR^0x0001;   /* XOR the IOPB0 bit to toggle the pin */ 	
		CAN_TFLAG++;			/*发送时间计数*/								    
	     LED6_counter++;                      /*the total interrupter number*/
          if(LED6_counter==50)
          {LED_STATE=LED_STATE^0x0001;  /* FLASH THE LED6 */  
            LED=LED_STATE;
           LED6_counter=0;}  /*RESET THE LED TIME COUNTER*/      
   
             
}       
                             
    
void can_isr(void)
{}    

void sci_init(void)
{	*MCRA=*MCRA|0x03;
    *SCICCR=0x0027;
    /* 0 0 1 0 0 1 1 1
       | | | | | | | |
       | | | | | 8 bits data
       | | | | |
       | | | | no address bit
       | | | self
       | | enable varify
       | odd
       1stop
    */                      
    *SCICTL1=0x0003;/*SW RESET=0 FOR CONFIG SCI*/
    /*0 0 0 0 0 0 1 1
      | | | | | | | Rx ENA
      | | | | | | Tx ENA
      | | | | | SLEEP?
      | | | | TX WAKE
      | | | RESERVE
      | | SW RESET ,FOR CONFIG SCICTL1
      | RX ERR INT ENA
      RESERVE              
    */            
    *SCICTL2=0x0000;
    /*0 0 0 0 0 0 0 0
      | | | | | | | TX INT ENA
      | | | | | | RX/BKINT ENA
      | | | | | RESERVED
      | | | | RESERVED
      | | | RESERVED
      | | RESERVED
      | TX EMPTY
      TXRDY              
    */     

    *SCIHBAUD=0x0002;
    *SCILBAUD=0x0007;  /*40*10^6/(9600*8)-1=0207H */


    *SCICTL1=0x0023; /*End CONFIG*/
    /*0 0 1 0 0 0 1 1
      | | | | | | | Rx ENA
      | | | | | | Tx ENA
      | | | | | SLEEP?
      | | | | TX WAKE
      | | | RESERVE
      | | SW RESET ,FOR CONFIG SCICTL1
      | RX ERR INT ENA
      RESERVE              
    */              
 }     
 void delay(void)       
 { int i;
   for(i=1;i<3000;i++)
   { asm(" NOP");
   }
 }

⌨️ 快捷键说明

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