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

📄 main.c

📁 新能源燃料电池小车系统
💻 C
📖 第 1 页 / 共 3 页
字号:
  TC5=0X0000;
  TC6=0X0000;
  TC7=0X0000;

  TSCR1_TEN=1;          //Allows the timer to function normally
       
  }
/************************************************************************/
void PORTIOIni(void)
{
  /*Port A*/
 DDRA=0xFF; 					//define PortA as output Drsg0-7
 RDRIV_RDPA=0;				//full-drive enable
 PORTA=0x01;					 //PortA output 01 Driver Disabled and Valves set to be closed
 
  /*Port B*/
 DDRB=0xF0; 					//define PortB bit0-3 as input and bit4-7 as output
 RDRIV_RDPB=0;        //full-drive enable
 PUCR_PUPBE=1;				//pull-up enable
 PORTB=0xFF; 					//PortB output FF
 
 /*Port P*/
 DDRP=0xFF; 					//define PortP as output
 RDRP=0;              // full-drive enable
 PERP=1;				      //pull-up enable
 PIEP=0x00;           //Disable interrupt
 PTP=0x00; 					  //PortP output FF
 
 PIEH=0;              //Disable PortH interrupt
 PIEJ=0;						  //Disable PortJ interrupt
 INTCR_IRQEN=0;				//Disable IRQ		interrupt
 INTCR_IRQE=1; 				//Set falling ege as 
 _DISABLE_COP();
}
/************************************************************************/
void CHIPADInit(void)
  {
   //initiation of inner AD
/*write key to ATD0CTL2=0xC0 */
  ATD0CTL2_ADPU=1;          // Normal ATD0 functionality
  ATD0CTL2_AFFC=1;          // Fast clear conversion complete flag by access to a result register 
  ATD0CTL2_AWAI=0;          // ATD will not halt even in wait mode
  ATD0CTL2_ETRIGLE=0;       //\
  ATD0CTL2_ETRIGP=0;        //  \
  ATD0CTL2_ETRIGE=0;        //    \Disable external trigger
  ATD0CTL2_ASCIE=0;         // ATD Sequence Complete interrupt requests are disabled
//ATD0CTL2_ASCIF=0;         // No ATD interrupt occurred Read only

/*write key to ATD0CTL3=0x00*/
  ATD0CTL3_S8C=0;
  ATD0CTL3_S4C=0;
  ATD0CTL3_S2C=0;
  ATD0CTL3_S1C=0;           // S8C=S4C=S2C=S1C=0 set the conversion senquence length to be 8
  ATD0CTL3_FIFO=0;          // Conversion results are placed in the corresponding result register
  ATD0CTL3_FRZ1=0;
  ATD0CTL3_FRZ0=0;          // FRZ0=FRZ1=0 Continue conversion at freeze mode

/*write key to ATD0CTL4=0xC3*/
  ATD0CTL4_SRES8=0;         // Select 10 bits the ADT resolution 
  ATD0CTL4_SMP1= 0;         //\
  ATD0CTL4_SMP0= 1;         //__\Select 4 A/D conversion clocks as sample time
  ATD0CTL4_PRS4= 0;         //\
  ATD0CTL4_PRS3= 0;         //  \
  ATD0CTL4_PRS2= 0;         //    \
  ATD0CTL4_PRS1= 1;         //      \
  ATD0CTL4_PRS0= 1;         //_______\Set clock prescaler to be 8 and the conversion CLK is 1MHz
/*the ATD conversion frenquency is 250kHz per CH*/
  
/*write key to ATD1CTL2=0xC0 */
  ATD1CTL2_ADPU=1;          // Normal ATD1 functionality
  ATD1CTL2_AFFC=1;          // Fast clear conversion complete flag by access to a result register 
  ATD1CTL2_AWAI=0;          // ATD will not halt even in wait mode
  ATD1CTL2_ETRIGLE=0;
  ATD1CTL2_ETRIGP=0;
  ATD1CTL2_ETRIGE=0;        // Disable external trigger
  ATD1CTL2_ASCIE=0;         // ATD Sequence Complete interrupt requests are disabled
//ATD1CTL2_ASCIF=0;         // No ATD interrupt occurred
/*write key to ATD1CTL3=0x00*/
  ATD1CTL3_S8C=0;
  ATD1CTL3_S4C=0;
  ATD1CTL3_S2C=0;
  ATD1CTL3_S1C=0;           // S8C=S4C=S2C=S1C=0 set the conversion senquence length to be 8
  ATD1CTL3_FIFO=0;          // Conversion results are placed in the corresponding result register
  ATD1CTL3_FRZ1=0;
  ATD1CTL3_FRZ0=0;          // FRZ0=FRZ1=0 Continue conversion at freeze mode
/*write key to ATD1CTL4=0xC3*/
  ATD1CTL4_SRES8=0;         // Select 10 bits the ADT resolution 
  ATD1CTL4_SMP1= 0;
  ATD1CTL4_SMP0= 1;         //Select 4 A/D conversion clocks as sample time
  ATD1CTL4_PRS4= 0;
  ATD1CTL4_PRS3= 0;
  ATD1CTL4_PRS2= 0;
  ATD1CTL4_PRS1= 1;
  ATD1CTL4_PRS0= 1;         // Set clock prescaler to be 8 and the conversion CLK is 1MHz
/*the ATD conversion frenquency is 250kHz per CH*/ 
  }
/************************************************************************/  
void SPIDAInit(void)
{ 
  
  MODRR_MODRR5= 1;      //set SPI1 at PORT H0-3
  SPI1CR1_SPIE= 0;      // interrupt(SPIF or MODF) disabled
  SPI1CR1_SPE = 1;      // SPI1 enabled
  SPI1CR1_SPTIE=0;      // SPI Transmit Interrupt Enable
  SPI1CR1_MSTR= 1;      // set SPI1 as master
  SPI1CR1_CPOL= 1;      // Active-low clocks selected; SCK idles high
  SPI1CR1_CPHA= 0;      // The first SCK edge is issued one-half cycle into the 8-cycle transfer operation
  SPI1CR1_SSOE= 0;      // Slave Select Output Enable, here used SS as IO by company with MODFEN=0;
  SPI1CR1_LSBFE=0;      // Data is transferred most significant bit first
  /*set SPI1CR2*/ 
  SPI1CR2_MODFEN= 0;    // Disable mode fault error 
  SPI1CR2_BIDIROE=0;    // effect when configed as bidirection, disable out buffer
  SPI1CR2_SPISWAI=1;    // Stop SPI clock generation when in wait mode
  SPI1CR2_SPC0=   0;    // Disables bidirectional pin
  /*set SPI1BR*/ 
  SPI1BR  = 0x05;       //03:500k  04:250k  05:125k   
   /*set PIN_PH3 as output and full driver and pull up*/
  DDRH_DDRH3=1;
  PERH_PERH3=1;
  PPSH_PPSH3=1;
  RDRH_RDRH3=0;
  
  
  SPIDADisable;
  SPIDAEnable;
 //SPIDATrans(0X90,0X01);            //config register,slow mode, normal operation 
                                      //internal reference: 1.024V, actually the ref is about 0.996V
  SPIDATrans(0X90,0X02);               //internal reference: 2.048V
  flgDAINI=1;                      
                                    //
  SPIDADisable;
}
/************************************************************************/
void DAupdate(unsigned int DACA)
  {
  if(DACA>100)DACA=100;
  //DACA=(unsigned char)(DACA*2+DACA*7/20);     //set to 100 means to 2V output and conresponding to 235
  //DACA=(unsigned char)(DACA*2+DACA*8/17);     //根据徐麟建议修正 2008年8月1日
  DACA=(unsigned char)(DACA+DACA/4+63);         //8月29日110v风机调整输入1-3v
  SPIDAEnable;
  SPIDATrans((unsigned char)(0x80+(DACA>>4)),(unsigned char)(DACA<<4));  //write to DAC and update DACB with Buffer,fast mode, normal operation
  SPIDADisable;
  }
/************************************************************************/  
void SPIDATrans(unsigned char HighByte, unsigned char LowByte)
  { volatile unsigned int DataRead;
    
    while(!SPI1SR_SPTEF);
    DataRead=SPI1SR;
    SPI1DR = HighByte;
    while(!SPI1SR_SPIF);
    DataRead = SPI1SR;
    DataRead=SPI1DR;
    SPI1DR = LowByte;
    while(!SPI1SR_SPIF);
    DataRead  = SPI1SR;
    DataRead  = SPI1DR;  
  }
/************************************************************************/
void RdCHIPAD(void)
  { 
    unsigned int tempDate;
    ATD1CTL5=0x90;
    ATD0CTL5=0x90;
    while((ATD1STAT0_SCF==0)||(ATD0STAT0_SCF==0));  		     
    ATD1STAT0_SCF=1;							//clear conversion end flags
    ATD0STAT0_SCF=1;
      
   /************Sensors calibrate and calculation for P & Est Ist**********/ 
   /*************Note the pressure unit is bar***************************/ 
   /*************Here the pressure sensor range is 2.5bar****************/
   /*************!!!unit for pressure is kPa****************/
   /****some other not used in small scale system pls check it when use****/  
          
          //the range for stack current sensor is 200A, with Ist's resolution of 0.1A
          if(IstRawDate<=209) Ist=0;
          else                {tempDate=(IstRawDate-209)*2+(IstRawDate-209)*2/5; Ist=(Ist+tempDate)/2;}
          
          //the range for stack current sensor is 40A, with Ist's resolution of 0.1A
          if(IcpRawDate<=205) Icp=0;
          else                {tempDate=(IcpRawDate-205)/4+(IcpRawDate-205)/100; Icp=Icp/2+tempDate;}
          
          //the range for stack voltage sensor is 300V, with Ist's resolution of 0.1V
          if(VstRawDate<=207) Vst=0;
          else                {tempDate=(VstRawDate-207)*3+(VstRawDate-207)*4/5-(VstRawDate-207)/86; Vst=(Vst+tempDate)/2;}
            
         
          //the range for compressor voltage sensor is ?300V, with Ist's resolution of 0.1V
          //if(VcpRawDate<=206) Vcp=0;
          //else                Vcp=(VcpRawDate-206)*3+(VcpRawDate-206)*5/7;
          //Vcp=480;
          Vcp=1100;  //Look out! 1200 on vehicle
          
          //the range for pressure sensor is 2.5bar, with pressure resolution of 0.001bar
          //pressure of hydrogen supply source
          if(PHSRawDate<=205) PHS=0;
          else                PHS=(PHS+(PHSRawDate-205)*3+(PHSRawDate-205)/19)/2;
          //pressure of coolant inlet
          if(PWinRawDate<=205)PWin=0;
          else                PWin=(PWin+(PWinRawDate-205)*3+(PWinRawDate-205)/19)/2;
          //pressure of air inlet
          if(PAinRawDate<=205)PAin=0;
          else                PAin=(PAin+(PAinRawDate-205)*3+(PAinRawDate-205)/19)/2;
          //pressure of hydrogen inlet
          if(PHinRawDate<=205)PHin=0;
          else                PHin=(PHin+(PHinRawDate-205)*3+(PHinRawDate-205)/19)/2;
          
          //temperature of hydrogen inlet
          THin=(THin+15700-13*THinRawDate-THinRawDate/4)/2;
          TAin=(TAin+15700-13*TAinRawDate-TAinRawDate/4)/2;
          TWin=(TWin+16309-14*TWinRawDate-TWinRawDate*9/50)/2;
          TWout=(TWout+16650-14*TWoutRawDate-TWoutRawDate*3/10)/2;    
          
          
          tempDate=Vst/10;
          tempDate*=Ist;
          Pst=(tempDate/10+Pst)/2;     //W
          tempDate=Vcp/10;
          tempDate*=Icp;
          Pcp=(tempDate/10+Pcp)/2;     //W
          PPar=Pcp+CalPPar();
          
          if(PHS>800)       {flgErrPsys=flagErr;ErrPsysCd=DangerousFault;}
          else if(PHS<200)  {flgErrPsys=flagErr;ErrPsysCd=SeriousFault;}
          else 	            {flgErrPsys=flagNormal;ErrPsysCd=NoFault;}
          
          if((CVmin<45)&&(IsSysRunning))ErrCVCd=DangerousFault;
          else                          ErrCVCd=NoFault;
          
          if(TWout<11500)     ErrTsysCd=NoFault;
          else if(TWout>12000)ErrTsysCd=SeriousFault;
          
          if((ErrCVCd==NoFault)&&(ErrTsysCd==NoFault)&&(ErrPsysCd==NoFault)){SysErrRank=ECU_Normal;} 
          else if((ErrCVCd==DangerousFault)||(ErrTsysCd==DangerousFault)&&(ErrPsysCd==DangerousFault)){SysErrRank=ECU_HighError;} 
          else if((ErrCVCd==SeriousFault)||(ErrTsysCd==SeriousFault)&&(ErrPsysCd==SeriousFault)){SysErrRank=ECU_LowError;} 
          if((SysErrRank==ECU_Normal)&&(ErrFlgWPS||ErrFlgCMP)){SysErrRank=ECU_MinorFault;} 
          
          if((stepCtrl==sysRunning)&&(SysErrRank==ECU_Normal))SysStatus =ECU_Enabled;
          else if((stepCtrl<sysECUReady)&&(SysErrRank==ECU_Normal))SysStatus =ECU_Powerup;
          else if((stepCtrl<sysReday)&&(SysErrRank==ECU_Normal))SysStatus =ECU_Ready;
          else if((SysErrRank==ECU_LowError)||(SysErrRank==ECU_LowError))SysStatus =ECU_Error;
           
        
          
        
 }
 /************************************************************************/ 
  unsigned int CalPPar(void)
  {
   unsigned int tempDate=0;
   
   if(SysStatus==ECU_Enabled)tempDate+=84;								  //power consumed by controller and water pump etc in W.
   else                      tempDate+=15;
   if(sysFlgFAN1==1)tempDate+=60; //power consumed by FAN1 in W
   if(sysFlgFAN2==1)tempDate+=60; //power consumed by FAN2 in W
   if(sysFlgCWP==1) tempDate+=50; //power consumed by CWP in W
   return tempDate;
  } 
  
  /**********************************************************/
void ProcessIni(void)
  {
  /**************Initiate Varibles********************/
  modeCtrl    =ModeIdle;
  stepCtrl    =sysIdle;
  StatusofActs=0X0000;
  SysStatus   =ECU_Powerup;
  SysErrRank  =ECU_Normal;
  flgErrCANFCE=flagErr;
  flgErrCANVMS=flagErr;
  flgErrTsys  =flagErr;
  flgErrPsys  =flagErr;
  CANFCETrigger=NoTrigger;
  TaskCHIPAD    =1;
  TaskSPIDA     =1;
  }
/**********************************************************/
void CheckforECUReady(void)
  {
    if((flgErrPsys==flagNormal)&&(flgErrCANFCE==flagNormal))
      {/****************Go into ReadyMode*****************/ 
        SysStatus =ECU_Ready;
        stepCtrl  =sysECUReady;
        SysErrRank=ECU_Normal; 
      }
  }
 /**********************************************************/ 
void StartupEnable(void)
  {
      SysStateUpdate;           //Update system status flags
      DriverEnable;             //Enable drivers chip supply
      ACT_DRAIN_WATER;          //动力12V上电
      ACT_DRAIN_HYDROGEN;       //Open hydrogen drain valve
      ACT_SUPPLY_HYDROGEN;      //Open hydrogen supply valve
      ACT_CWP;                  //Switch on coolant pump

⌨️ 快捷键说明

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