📄 main.c
字号:
/*****************************************************************************************************
函数原型:void ADC()
参数说明:无
返回值: 无
功能说明:对IO中的模拟量进行AD转换
******************************************************************************************************/
void ADC(void)
{
//================P0.29水温信号的AD转换=======================
ADCR = (ADCR&0xFFFFFF00)|0x04|(1 << 24); // 切换通道并进行第一次转换
while((ADDR&0x80000000)==0); // 等待转换结束
ADCR = ADCR | (1 << 24); // 再次启运转换
while((ADDR&0x80000000)==0);
ADC_data0 = ADDR;
ADC_data0=(ADC_data0>>6)&0x3FF;
ADC_data0=ADC_data0*3300;
ADC_data0=ADC_data0/1024;
//================P0.30真空压力信号的AD转换=======================
ADCR = (ADCR&0xFFFFFF00)|0x08|(1 << 24); // 切换通道并进行第一次转换
while((ADDR&0x80000000)==0); // 等待转换结束
ADCR = ADCR | (1 << 24); // 再次启运转换
while((ADDR&0x80000000)==0);
ADC_data1 = ADDR;
ADC_data1=(ADC_data1>>6)&0x3FF;
ADC_data1=ADC_data1*3300;
ADC_data1=ADC_data1/1024;
AD0[0]=AD0[1];AD0[1]=AD0[2];AD0[2]=AD0[3];
AD0[3]=AD0[4];AD0[4]=AD0[5];AD0[5]=ADC_data0;
ADC_data0=filter6(AD0);
AD1[0]=AD1[1];AD1[1]=AD1[2];AD1[2]=AD1[3];
AD1[3]=AD1[4];AD1[4]=AD1[5];AD1[5]=ADC_data1;
ADC_data1=filter6(AD1);
}
/*******************************************************************************************
**函数原型:void alarm()
**参数说明:无
**返回值: 无
**功能说明:用与判断告警数据
各种情况是按照协议和ECU通讯与控制策略上的告警数据编写
********************************************************************************************/
void alarm(void)
{
//限流要求
infoalarm_1.Bits.lim_current=0 ;
//关闭要求
infoalarm_1.Bits.close=0;
//冷却水压状态
if(shuiya_alarm_flag==0) infoalarm_1.Bits.water_press=0;//正常
else infoalarm_1.Bits.water_press=2;//过低
/*if(IOstate0&i_ShuiYaKaiGuan) infoalarm_1.Bits.water_press=0; //冷却水压正常
else infoalarm_1.Bits.water_press=2; */
//保留
infoalarm_1.Bits.reserve=0;
//碰撞信号
if(IOstate0&i_PengZhuang) infoalarm_2.Bits.pengzhuang=0;
else infoalarm_2.Bits.pengzhuang=1;
//湿度过高报警
infoalarm_2.Bits.shidu=0;
//车身漏电报警
infoalarm_2.Bits.loudian=0;
//水温报警
if(water_temp>=100) infoalarm_2.Bits.shuiwen=1;//水温过高
else infoalarm_2.Bits.shuiwen=0;
//真空压力报警
if(vacuum_pressure>=77||vacuum_pressure<=20) infoalarm_3.Bits.vacuum_sta=1;
else infoalarm_3.Bits.vacuum_sta=0;
//保留
infoalarm_3.Bits.reserve1=0;
}
/************************************************************
函数原型:void Logic()
参数说明:无
返回值: 无
功能说明:逻辑判断,控制各个继电器
*************************************************************/
void Logic(void)
{
IOstate0 =IO0PIN;
IOstate1 =IO1PIN;
if(IOstate1&i_YaoShiKaiGuan) {
IO0SET = o_LengNing| //冷凝
o_LengQueFengJi_Di| //冷却低档
o_LengQueFengJi_Gao| //冷却高档
o_shuibeng| //水泵
o_Zhenkongbeng2| //真空泵备用输出
o_Zhenkongbeng| //真空泵输出
SCK0| //SPI
MOSI0| //SPI
o_706dog| //SPI硬件狗复位脚
P_022| //管脚未接上拉设为输出
P_019| //管脚未接上拉设为输出
P_020 ; //管脚未接上拉设为输出
IO1SET = o_KongTiaoQiDong| //空调继电器启动
CS; //SPI
IO1CLR = o_ready; //真空泵电路继电器跳转
}
else
{
//水泵控制
IO0CLR=o_shuibeng; comstate_2.Bits.shuibeng=1;
//主控主接触器允许
if(pengzhuang_flag!=0) //来自内部传感器:碰撞、水压 ==1||shuiya_alarm_flag==1
{
comstate_1.Bits.zhujiechuqi=0; //关闭主接触器
flag_cutd=1;
}
else
{
if(flag_cutd!=1) //(infoalarm_2.Word==0)&&
{
comstate_1.Bits.zhujiechuqi=1; //主接触器开启
}
}
//空调控制
if(flag_airqingqiu==0x00) //空调关闭
{
IO1SET=o_KongTiaoQiDong; comstate_2.Bits.airjidianqi=0; //关空调继电器
}
if(flag_airqingqiu==0x01) //空调启动致冷
{
//flag_air=1; //致冷空调启动标识
IO1CLR=o_KongTiaoQiDong; comstate_2.Bits.airjidianqi=1; //开空调继电器
//IO0CLR=o_LengNing; comstate_2.Bits.lengning=1; //开冷凝
}
if(flag_airqingqiu==0x02) //空调致热
{
IO1CLR=o_KongTiaoQiDong; comstate_2.Bits.airjidianqi=1; //开空调继电器
}
//************************************冷却系统控制策略************************************************
//************************************2007.4.16修改冷凝风扇*******************************************
if((zhongya==1) || (MOTO_sta==1)) //有中压信号或发动机启动信号
{
flag_lengque=0;
IO0CLR=o_LengNing; comstate_2.Bits.lengning=1; //开冷凝
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=0; //冷却风机低档关闭
IO0CLR=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=1; //开冷却高
}
else
{
IO0CLR=o_LengNing; comstate_2.Bits.lengning=1; //开冷凝
if(flag_lengque==0) //上电后首先执行一次,全范围控制
{
flag_lengque=1;
//冷却风扇控制
if(flag_shw==1) //水温传感器损坏
{
if(outtemp<=59) //户外温度低于19度都不开启
{
if(MOTO_temp>=138)
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=0; //冷却风机低档关闭
IO0CLR=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=1; //开冷却高
}
else
{
IO0SET=o_LengQueFengJi_Di|o_LengQueFengJi_Gao; //冷却风扇关
comstate_1.Bits.fengjidi=0; comstate_1.Bits.fengjigao=0;
}
}
if(outtemp>=60&&outtemp<=69) //户外温度高于20度小于29度冷却风扇开启低档
{
if(MOTO_temp>=138)
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=0; //冷却风机低档关闭
IO0CLR=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=1; //开冷却高
}
else
{
IO0CLR=o_LengQueFengJi_Di;comstate_1.Bits.fengjidi=1; //冷却风机低档吸合
IO0SET=o_LengQueFengJi_Gao;comstate_1.Bits.fengjigao=0; //冷却风机高档关闭
}
}
if(outtemp>=70) //户外温度高于30度都开启
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=0; //冷却风机低档关闭
IO0CLR=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=1; //开冷却高
}
}
else //水温传感器未损坏
{
if(flag_airqingqiu==0x01) //空调启动
{
if(MOTO_temp>=138)
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=0; //冷却风机低档关闭
IO0CLR=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=1; //开冷却高
}
else
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=1; //冷却风机低档开启
IO0SET=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=0; //关冷却高
}
}
else //空调未启动
{
if(water_temp>=78)
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=0; //冷却风机低档关闭
IO0CLR=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=1; //开冷却高
}
else if(water_temp>=70 && water_temp<=77)
{
if(MOTO_temp>=138)
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=0; //冷却风机低档关闭
IO0CLR=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=1; //开冷却高
}
else
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=1; //冷却风机低档开启
IO0SET=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=0; //关冷却高
}
}
else
{
if(MOTO_temp>=138)
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=0; //冷却风机低档关闭
IO0CLR=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=1; //开冷却高
}
else if(MOTO_temp>=132)
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=1; //冷却风机低档开启
IO0SET=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=0; //关冷却高
}
else
{
IO0SET=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=0; //冷却风机低档关闭
IO0SET=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=0; //关冷却高
}
}
}
}
}
else //if(flag_lengque==1)
{
//冷却风扇控制
if(flag_shw==1) //水温传感器损坏
{
if(outtemp<=59) //户外温度低于19度都不开启
{
if(MOTO_temp>=138)
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=0; //冷却风机低档关闭
IO0CLR=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=1; //开冷却高
}
else if(MOTO_temp<=135)
{
IO0SET=o_LengQueFengJi_Di|o_LengQueFengJi_Gao; //冷却风扇关
comstate_1.Bits.fengjidi=0; comstate_1.Bits.fengjigao=0;
}
}
if(outtemp>=62&&outtemp<=68) //户外温度高于22度小于28度冷却风扇开启低档
{
if(MOTO_temp>=138)
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=0; //冷却风机低档关闭
IO0CLR=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=1; //开冷却高
}
else if(MOTO_temp<=135)
{
IO0CLR=o_LengQueFengJi_Di;comstate_1.Bits.fengjidi=1; //冷却风机低档吸合
IO0SET=o_LengQueFengJi_Gao;comstate_1.Bits.fengjigao=0; //冷却风机高档关闭
}
}
if(outtemp>=70) //户外温度高于30度都开启
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=0; //冷却风机低档关闭
IO0CLR=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=1; //开冷却高
}
}
else //水温传感器未损坏
{
if(flag_airqingqiu==0x01) //空调启动
{
if(MOTO_temp>=138)
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=0; //冷却风机低档关闭
IO0CLR=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=1; //开冷却高
}
else if(MOTO_temp<=135)
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=1; //冷却风机低档开启
IO0SET=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=0; //关冷却高
}
}
else //空调未启动
{
if(water_temp>=78)
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=0; //冷却风机低档关闭
IO0CLR=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=1; //开冷却高
}
else if(water_temp>=70 && water_temp<=75)
{
if(MOTO_temp>=138)
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=0; //冷却风机低档关闭
IO0CLR=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=1; //开冷却高
}
else if(MOTO_temp<=135)
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=1; //冷却风机低档开启
IO0SET=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=0; //关冷却高
}
}
else if(water_temp<=67)
{
if(MOTO_temp>=138)
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=0; //冷却风机低档关闭
IO0CLR=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=1; //开冷却高
}
else if(MOTO_temp>=130 && MOTO_temp<=135)
{
IO0CLR=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=1; //冷却风机低档开启
IO0SET=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=0; //关冷却高
}
else if(MOTO_temp<=127)
{
IO0SET=o_LengQueFengJi_Di; comstate_1.Bits.fengjidi=0; //冷却风机低档关闭
IO0SET=o_LengQueFengJi_Gao; comstate_1.Bits.fengjigao=0; //关冷却高
}
}
}
}
}
}
//真空泵控制
//主控制电路正常
if(MOS_flag==0) //真空泵控制电路MOS管未损坏
{
if(flag_zhkb==1)
{ //真空压力传感器损坏
if(IOstate0&i_JiaoSha) //无脚刹
{
if(flag_zhkbkq==0) //损坏后只执行一次开启20秒
{
if(counter3<=50) //先开启5秒钟
{
IO0CLR=o_Zhenkongbeng;
comstate_1.Bits.zhenkongbeng=1;
}
if(counter3>50)
{
counter3=0;
flag_zhkbkq=1; //表明已经开过20秒真空泵
}
}
if(flag_zhkbkq==1)
{
if(flag_zhkbjsh==0) //已经开启过20秒真空泵,且脚刹标识位已经清零
{
IO0SET=o_Zhenkongbeng;
comstate_1.Bits.zhenkongbeng=0;
}
if(flag_zhkbjsh==1) //脚刹已经松起且计时5秒&&counter5<50
{
IO0CLR=o_Zhenkongbeng;
comstate_1.Bits.zhenkongbeng=1;
}
if(counter5>=10)
{
counter5=0;
flag_zhkbjsh=0;
}
}
}
else //有脚刹,则考虑一直开启真空泵(暂定)
{
flag_zhkbjsh=1; //真空泵损坏后踩脚刹标识,为1则表明脚刹松起后要继续开启5秒真空泵
IO0CLR=o_Zhenkongbeng;
comstate_1.Bits.zhenkongbeng=1;
}
}
else if(flag_zhkb==0)
{ //真空压力传感器未损坏
if(ADC_data1>1271*k1/k2&&ADC_data1<3000*k1/k2) // 真空度低于40,真空泵开启
{
IO0CLR=o_Zhenkongbeng;
comstate_1.Bits.zhenkongbeng=1;
}
if(ADC_data1<785*k1/k2&&ADC_data1>100*k1/k2) //真空度高于60
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -