📄 main.c
字号:
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 + -