1324 lines
25 KiB
C
1324 lines
25 KiB
C
/**************************************************************************
|
||
**************************************************************************/
|
||
#include "Define_Global.h"
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Check_AD_Start
|
||
* 函数功能:ADC启动
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
void Check_AD_Start()
|
||
{
|
||
if(B_GetAD_MaxMin || Delay_Adc)
|
||
{ //ADC手动启动
|
||
ADCON2 = 0B00000000;
|
||
ADCON1 = 0B10010011; //右对齐,Fosc/8,采样周期=8,清ADC自动累加结果
|
||
}
|
||
else
|
||
{ //ADC自动启动
|
||
if(B_Adc_SetOk)
|
||
{
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
B_Adc_SetOk = 1;
|
||
ADIF = 0; //清ADC中断标志位
|
||
|
||
if(B_GetAD_AllSum)
|
||
{
|
||
ADCON2 = 0B01000111; //ADC自动累和8192次(达到时间停止)
|
||
}
|
||
else
|
||
{
|
||
ADCON2 = 0B01000011; //ADC自动累和512次(达到次数停止)
|
||
}
|
||
|
||
ADCON1 = 0B10011011; //右对齐,Fosc/8,采样周期=8,清ADC自动累加结果,硬件自动启动ADC
|
||
}
|
||
}
|
||
|
||
if(B_Channel_Vol)
|
||
{
|
||
ADCON0 = C_AdcSet_Vol; //市电电压AD检测设置
|
||
}
|
||
else if(B_Channel_Curr)
|
||
{
|
||
ADCON0 = C_AdcSet_Curr; //工作电流AD检测设置
|
||
}
|
||
else if(B_Channel_Igbt)
|
||
{
|
||
ADCON0 = C_AdcSet_Igbt; //IGBT温度AD检测设置
|
||
}
|
||
else if(B_Channel_Pan)
|
||
{
|
||
ADCON0 = C_AdcSet_Pan; //锅底温度AD检测设置
|
||
}
|
||
else if(B_Channel_Top)
|
||
{
|
||
ADCON0 = C_AdcSet_Top; //顶部温度AD检测设置
|
||
}
|
||
else if(B_Channel_VRef)
|
||
{
|
||
ADCON0 = C_AdcSet_VRef; //内部参考电压AD检测设置
|
||
}
|
||
else if(B_Channel_Gnd)
|
||
{
|
||
ADCON0 = C_AdcSet_Gnd; //GND-AD检测设置
|
||
}
|
||
else if(B_Channel_Vdd)
|
||
{
|
||
ADCON0 = C_AdcSet_Vdd; //VDD-AD检测设置
|
||
}
|
||
|
||
NOP();
|
||
NOP();
|
||
GODONE = 1;
|
||
}
|
||
/**************************************************************************
|
||
* 函数名称:Check_AD_End
|
||
* 函数功能:ADC结束
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
void Check_AD_End()
|
||
{
|
||
ADCON0 = 0;
|
||
ADCON1 = 0;
|
||
ADCON2 = 0;
|
||
}
|
||
/**************************************************************************
|
||
* 函数名称:Check_AD_Ok
|
||
* 函数功能:ADC完成
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
void Check_AD_Ok()
|
||
{
|
||
Flag1_Adc = 0;
|
||
B_Adc_Ok = 1;
|
||
|
||
Check_AD_End();
|
||
}
|
||
/**************************************************************************
|
||
* 函数名称:Check_AD_Error
|
||
* 函数功能:ADC错误
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
void Check_AD_Error()
|
||
{
|
||
Flag1_Adc = 0;
|
||
B_Adc_Error = 1;
|
||
|
||
Check_AD_End();
|
||
}
|
||
/**************************************************************************
|
||
* 函数名称:Check_AD
|
||
* 函数功能:AD检测
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:中断调用
|
||
**************************************************************************/
|
||
void Check_AD()
|
||
{
|
||
volatile unsigned char i;
|
||
//---------------------------------------------------------------------
|
||
if(B_Zero_Adc)
|
||
{ //ADC过零处理
|
||
B_Zero_Adc = 0; //每次过零周期进来处理一次
|
||
|
||
if(B_Adc_Curr || B_Adc_Vol)
|
||
{
|
||
if(!B_Adc_On && !B_Adc_Ok && !B_Adc_Error)
|
||
{ //有ADC操作时,跳开避免冲突
|
||
if(B_Adc_Curr)
|
||
{
|
||
Channel_Adc = 0x02; //ADC通道切换为检测工作电流
|
||
}
|
||
else
|
||
{
|
||
Channel_Adc = 0x01; //ADC通道切换为检测市电电压
|
||
}
|
||
|
||
B_GetAD_MaxMin = 0;
|
||
B_GetAD_AllSum = 1; //求AD总和值
|
||
|
||
Delay_Adc = 2;
|
||
Flag1_Adc = 0;
|
||
B_Adc_On = 1;
|
||
}
|
||
|
||
B_Adc_Curr = 0;
|
||
B_Adc_Vol = 0;
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------
|
||
if(B_Adc_On)
|
||
{
|
||
if(Delay_Adc)
|
||
{ //ADC延时
|
||
if(--Delay_Adc)
|
||
{
|
||
Check_AD_Start(); //提前启动,稳定ADC模块
|
||
}
|
||
else
|
||
{
|
||
Flag1_Adc &= 0x01;
|
||
|
||
AdcCount[0] = 0;
|
||
AdcCount[1] = 0;
|
||
AdcCount[2] = 0;
|
||
|
||
AdcData[0] = 0;
|
||
AdcData[1] = 0;
|
||
AdcData[2] = 0;
|
||
|
||
Check_AD_Start(); //ADC启动
|
||
}
|
||
}
|
||
else
|
||
{ //ADC开启
|
||
if(B_GetAD_AllSum)
|
||
{ //求AD总和值
|
||
if(B_Zero_60Hz)
|
||
{
|
||
i = 8333/C_TimeUS_Int; //8.333ms
|
||
}
|
||
else
|
||
{
|
||
i = 10000/C_TimeUS_Int; //10ms
|
||
}
|
||
|
||
if(++AdcCount[2] >= i)
|
||
{
|
||
AdcCount[2] = 0;
|
||
ADAUTO_SUM = 0; //禁止ADC结果自动累加,累加结果保持
|
||
|
||
AdcCount[0] = ADCCNTL;
|
||
AdcCount[1] = ADCCNTH;
|
||
|
||
AdcData[0] = ADCSUM0;
|
||
AdcData[1] = ADCSUM1;
|
||
AdcData[2] = ADCSUM2;
|
||
|
||
Check_AD_Ok();
|
||
}
|
||
}
|
||
else if(B_GetAD_MaxMin)
|
||
{ //求AD最大最小值
|
||
if(GODONE)
|
||
{
|
||
Check_AD_Error(); //若没有完成标志则表示错误,重新设置ADC
|
||
}
|
||
else
|
||
{
|
||
i = (((unsigned int)ADRESH << 8) + ADRESL) >> 2; //获得8bit-ADC结果
|
||
|
||
if(0 == AdcCount[0])
|
||
{
|
||
AdcData[1] = 0x00; //ADC最大值
|
||
AdcData[0] = 0xFF; //ADC最小值
|
||
}
|
||
if(i > AdcData[1])
|
||
{
|
||
AdcData[1] = i; //更新ADC最大值
|
||
}
|
||
if(i < AdcData[0])
|
||
{
|
||
AdcData[0] = i; //更新ADC最小值
|
||
}
|
||
|
||
if(B_Zero_60Hz)
|
||
{
|
||
i = (8333+2000)/C_TimeUS_Int; //8.333ms+2ms
|
||
}
|
||
else
|
||
{
|
||
i = (10000+2000)/C_TimeUS_Int; //10ms+2ms
|
||
}
|
||
|
||
if(++AdcCount[0] >= i)
|
||
{
|
||
AdcCount[0] = 0;
|
||
Check_AD_Ok(); //ADC完成
|
||
}
|
||
else
|
||
{
|
||
Check_AD_Start(); //ADC启动
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{ //求AD平均值
|
||
if(ADCSUM_OV)
|
||
{
|
||
Check_AD_Error(); //ADC错误
|
||
}
|
||
else
|
||
{
|
||
if(ADIF)
|
||
{
|
||
ADIF = 0; //ADC自动累加完成
|
||
|
||
AdcData[0] = ADCSUM1;
|
||
AdcData[1] = ADCSUM2;
|
||
|
||
Check_AD_Ok(); //ADC完成
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
Check_AD_End();
|
||
}
|
||
}
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Adc_Channel_Set
|
||
* 函数功能:ADC通道设置
|
||
* 入口参数:i = ADC通道(0=其他、1=市电电压、2=工作电流)
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
void Adc_Channel_Set(unsigned char i)
|
||
{
|
||
Delay_AdcNoOk = 0;
|
||
|
||
if(i & 0x03)
|
||
{ //检测市电电压或工作电流的AD
|
||
if(B_Zero_No)
|
||
{ //无过零
|
||
if(i & 0x01)
|
||
{
|
||
Channel_Adc = 0x01; //ADC通道切换为检测市电电压
|
||
}
|
||
else
|
||
{
|
||
Channel_Adc = 0x02; //ADC通道切换为检测工作电流
|
||
}
|
||
|
||
B_GetAD_MaxMin = 0;
|
||
B_GetAD_AllSum = 1; //求AD总和值
|
||
|
||
Delay_Adc = 2;
|
||
Flag1_Adc = 0;
|
||
B_Adc_On = 1;
|
||
}
|
||
else
|
||
{ //有过零
|
||
Flag1_Adc = 0;
|
||
|
||
if(!B_Adc_Auto) //非ADC自动开启
|
||
{
|
||
if(i & 0x01)
|
||
{
|
||
B_Adc_Vol = 1; //检测市电电压AD
|
||
B_Adc_Curr = 0;
|
||
}
|
||
else
|
||
{
|
||
B_Adc_Vol = 0;
|
||
B_Adc_Curr = 1; //检测工作电流AD
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{ //检测其他的AD
|
||
B_GetAD_MaxMin = 0;
|
||
B_GetAD_AllSum = 0;
|
||
|
||
Delay_Adc = 2;
|
||
Flag1_Adc = 0;
|
||
B_Adc_On = 1;
|
||
}
|
||
}
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Get_AdResult
|
||
* 函数功能:获取AD结果
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
void Get_AdResult()
|
||
{
|
||
volatile unsigned int data;
|
||
volatile unsigned long temp;
|
||
//---------------------------------------------------------------------
|
||
if(B_Adc_Ok)
|
||
{ //ADC完成,进行数据处理
|
||
if(B_GetAD_AllSum)
|
||
{ //求AD总和值(处理结果为9bit)
|
||
temp = (unsigned long)AdcData[2] << 16;
|
||
temp += (unsigned long)AdcData[1] << 8;
|
||
temp += AdcData[0];
|
||
|
||
data = (unsigned int)AdcCount[1] << 8;
|
||
data += AdcCount[0];
|
||
|
||
temp /= data;
|
||
data = temp >> 1;
|
||
}
|
||
else if(B_GetAD_MaxMin)
|
||
{ //求AD最大最小值(处理结果为8bit)
|
||
data = ((unsigned int)AdcData[1] + AdcData[0]) >> 1;
|
||
}
|
||
else
|
||
{ //求AD平均值(处理结果为9bit)
|
||
data = (((unsigned int)AdcData[1] << 8) + AdcData[0]) >> 2;
|
||
}
|
||
|
||
if(B_Channel_Vol)
|
||
{ //检测市电电压AD值
|
||
if(AD_Volatage)
|
||
{
|
||
temp = data + AD_Volatage;
|
||
data = temp >> 1;
|
||
}
|
||
|
||
AD_Volatage = data;
|
||
B_VolAdc_Once = 1; //市电电压ADC完成一次
|
||
}
|
||
else if(B_Channel_Curr)
|
||
{ //检测工作电流AD值
|
||
if(!B_CurrAdc_Fst)
|
||
{
|
||
if(data >> 8)
|
||
{
|
||
AD_Current_Fst = 0xFF;
|
||
}
|
||
else
|
||
{
|
||
AD_Current_Fst = data; //工作电流AD初值
|
||
}
|
||
|
||
B_CurrAdc_Fst = 1; //工作电流AD初值检测完成
|
||
}
|
||
else
|
||
{
|
||
if(data >= AD_Current_Fst)
|
||
{ //减去工作电流AD初值
|
||
data -= AD_Current_Fst;
|
||
}
|
||
else
|
||
{
|
||
data = 0;
|
||
}
|
||
|
||
if(AD_Current)
|
||
{
|
||
temp = data + AD_Current;
|
||
data = temp >> 1;
|
||
}
|
||
|
||
AD_Current = data;
|
||
B_CurrAdc_Once = 1; //工作电流ADC完成一次
|
||
}
|
||
}
|
||
else if(B_Channel_Igbt)
|
||
{ //检测IGBT温度AD值
|
||
data >>= 1; //9bit转为8bit
|
||
|
||
#if _UP_NTC_IGBT_
|
||
AD_TmprIgbt = data; //NTC上拉,AD结果不取反
|
||
#else
|
||
AD_TmprIgbt = ~data; //NTC下拉,AD结果取反
|
||
#endif
|
||
}
|
||
else if(B_Channel_Pan)
|
||
{ //检测锅底温度AD值
|
||
data >>= 1; //9bit转为8bit
|
||
|
||
#if _UP_NTC_PAN_
|
||
AD_TmprPan = data; //NTC上拉,AD结果不取反
|
||
#else
|
||
AD_TmprPan = ~data; //NTC下拉,AD结果取反
|
||
#endif
|
||
}
|
||
else if(B_Channel_Top)
|
||
{ //检测顶部温度AD值
|
||
data >>= 1; //9bit转为8bit
|
||
|
||
#if _UP_NTC_TOP_
|
||
AD_TmprTop = data; //NTC上拉,AD结果不取反
|
||
#else
|
||
AD_TmprTop = ~data; //NTC下拉,AD结果取反
|
||
#endif
|
||
}
|
||
else if(B_Channel_VRef)
|
||
{ //检测内部基准电压AD值
|
||
AD_VRef = data;
|
||
}
|
||
else if(B_Channel_Gnd)
|
||
{ //检测GND-AD值
|
||
data >>= 1; //9bit转为8bit
|
||
AD_Gnd = data;
|
||
}
|
||
else if(B_Channel_Vdd)
|
||
{ //检测VDD-AD值
|
||
data >>= 1; //9bit转为8bit
|
||
AD_Vdd = data;
|
||
}
|
||
}
|
||
//---------------------------------------------------------------------
|
||
if(!B_Adc_On && !B_CurrAdc_Fst)
|
||
{ //工作电流AD初值检测未完成
|
||
Adc_Channel_Set(2); //检测工作电流AD
|
||
}
|
||
else if(B_Adc_Ok || B_Adc_Error || (++Delay_AdcNoOk >= 1000/C_TimeMS_Main))
|
||
{ //ADC完成、错误、超时未完成(1秒)
|
||
if(!Channel_Adc || B_Channel_End)
|
||
{
|
||
Channel_Adc = 0x01; //ADC通道切换为检测市电电压
|
||
}
|
||
else
|
||
{
|
||
Channel_Adc <<= 1; //ADC通道切换
|
||
}
|
||
|
||
if(B_Channel_Vol)
|
||
{
|
||
Adc_Channel_Set(1); //检测市电电压AD
|
||
}
|
||
else if(B_Channel_Curr)
|
||
{
|
||
Adc_Channel_Set(2); //检测工作电流AD
|
||
}
|
||
else
|
||
{
|
||
Adc_Channel_Set(0); //检测其他AD
|
||
}
|
||
}
|
||
}
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Delay_CheckError
|
||
* 函数功能:硬件故障检测延时
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
void Delay_CheckError()
|
||
{
|
||
static unsigned int Delay_CheckError;
|
||
|
||
if(!B_Heat_En)
|
||
{
|
||
B_Dly_CheckErr = 0;
|
||
Delay_CheckError = 0;
|
||
Min_CheckError = 0;
|
||
}
|
||
else
|
||
{
|
||
if(++Delay_CheckError >= 1000/C_TimeMS_Main*60) //1min
|
||
{
|
||
Delay_CheckError = 0;
|
||
Min_CheckError++;
|
||
}
|
||
|
||
if(Min_CheckError >= 3) //3min
|
||
{
|
||
B_Dly_CheckErr = 1; //硬件故障检测延时完成
|
||
}
|
||
}
|
||
}
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Check_IgbtNtcOpen
|
||
* 函数功能:IGBT-NTC开路检测
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
void Check_IgbtNtcOpen()
|
||
{
|
||
static unsigned char CounterL,CounterH;
|
||
|
||
if(AD_TmprIgbt >= C_AD_Igbt_OpenOut)
|
||
{
|
||
CounterL = 0;
|
||
|
||
if(++CounterH & 0x80)
|
||
{
|
||
CounterH = 0;
|
||
B_EIgbtOpen = 0;
|
||
}
|
||
}
|
||
else if(!B_Dly_CheckErr) //故障检测延时完成,才检测开路
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
}
|
||
else if(AD_TmprIgbt <= C_AD_Igbt_OpenIn)
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(++CounterL & 0x80)
|
||
{
|
||
CounterL = 0;
|
||
B_EIgbtOpen = 1;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
}
|
||
}
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Check_IgbtNtcClose
|
||
* 函数功能:IGBT-NTC短路检测
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
void Check_IgbtNtcClose()
|
||
{
|
||
static unsigned char CounterL,CounterH;
|
||
|
||
if(AD_TmprIgbt >= C_AD_Igbt_CloseIn)
|
||
{
|
||
CounterL = 0;
|
||
|
||
if(++CounterH & 0x80)
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(B_Heat_En)
|
||
{
|
||
B_EIgbtClose = 1;
|
||
}
|
||
}
|
||
}
|
||
else if(AD_TmprIgbt <= C_AD_Igbt_CloseOut)
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(++CounterL & 0x80)
|
||
{
|
||
CounterL = 0;
|
||
B_EIgbtClose = 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
}
|
||
}
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Check_IgbtNtcHigh
|
||
* 函数功能:IGBT-NTC高温检测
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用,如果高温就降功率
|
||
**************************************************************************/
|
||
void Check_IgbtNtcHigh()
|
||
{
|
||
static unsigned char CounterL,CounterH;
|
||
static unsigned int Delay_IgbtDown;
|
||
//---------------------------------------------------------------------
|
||
if(!B_Heat_En)
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
B_IgbtDown = 0;
|
||
}
|
||
else if(AD_TmprIgbt >= Buf_AD_Igbt_HighIn)
|
||
{
|
||
CounterL = 0;
|
||
|
||
if(++CounterH & 0x80)
|
||
{
|
||
CounterH = 0;
|
||
B_IgbtDown = 1; //IGBT高温降功率
|
||
}
|
||
}
|
||
else if(AD_TmprIgbt <= Buf_AD_Igbt_HighOut)
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(++CounterL & 0x80)
|
||
{
|
||
CounterL = 0;
|
||
B_IgbtDown = 0; //IGBT高温降功率恢复
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
}
|
||
//---------------------------------------------------------------------
|
||
if(B_IgbtDown)
|
||
{
|
||
if(Delay_IgbtDown)
|
||
{
|
||
Delay_IgbtDown--; //功率下降计时
|
||
}
|
||
else
|
||
{
|
||
Delay_IgbtDown = 60000/C_TimeMS_Main; //1min
|
||
|
||
if(Count_IgbtDown < 10) //最大10次
|
||
{
|
||
Count_IgbtDown++; //功率下降次数+1
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
Delay_IgbtDown = 0;
|
||
Count_IgbtDown = 0;
|
||
}
|
||
}
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Check_IgbtNtcOver
|
||
* 函数功能:IGBT-NTC超温检测
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用,如果干烧就停止工作
|
||
**************************************************************************/
|
||
void Check_IgbtNtcOver()
|
||
{
|
||
static unsigned char CounterL,CounterH;
|
||
|
||
if(AD_TmprIgbt >= Buf_AD_Igbt_OverIn)
|
||
{
|
||
CounterL = 0;
|
||
|
||
if(CounterH & 0x80)
|
||
{
|
||
if(B_Heat_En)
|
||
{
|
||
CounterH = 0;
|
||
B_EIgbtOver = 1;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CounterH++;
|
||
}
|
||
}
|
||
else if(AD_TmprIgbt <= Buf_AD_Igbt_OverOut)
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(++CounterL & 0x80)
|
||
{
|
||
CounterL = 0;
|
||
B_EIgbtOver = 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
}
|
||
}
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Check_TopNtcOpen
|
||
* 函数功能:顶部NTC开路检测
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
#ifdef _pAD_TOP
|
||
void Check_TopNtcOpen()
|
||
{
|
||
static unsigned char CounterL,CounterH;
|
||
|
||
if(AD_TmprTop >= C_AD_Top_OpenOut)
|
||
{
|
||
CounterL = 0;
|
||
|
||
if(++CounterH & 0x80)
|
||
{
|
||
CounterH = 0;
|
||
B_ETopOpen = 0;
|
||
}
|
||
}
|
||
else if(!B_Dly_CheckErr) //故障检测延时完成,才检测开路
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
}
|
||
else if(AD_TmprTop <= C_AD_Top_OpenIn)
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(++CounterL & 0x80)
|
||
{
|
||
CounterL = 0;
|
||
B_ETopOpen = 1;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Check_TopNtcClose
|
||
* 函数功能:顶部NTC短路检测
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
#ifdef _pAD_TOP
|
||
void Check_TopNtcClose()
|
||
{
|
||
static unsigned char CounterL,CounterH;
|
||
|
||
if(AD_TmprTop >= C_AD_Top_CloseIn)
|
||
{
|
||
CounterL = 0;
|
||
|
||
if(++CounterH & 0x80)
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(B_Heat_En)
|
||
{
|
||
B_ETopClose = 1;
|
||
}
|
||
}
|
||
}
|
||
else if(AD_TmprTop <= C_AD_Top_CloseOut)
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(++CounterL & 0x80)
|
||
{
|
||
CounterL = 0;
|
||
B_ETopClose = 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Check_PanNtcOpen
|
||
* 函数功能:锅底NTC开路检测
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
void Check_PanNtcOpen()
|
||
{
|
||
static unsigned char CounterL,CounterH;
|
||
|
||
if(AD_TmprPan >= C_AD_Pan_OpenOut)
|
||
{
|
||
CounterL = 0;
|
||
|
||
if(++CounterH & 0x80)
|
||
{
|
||
CounterH = 0;
|
||
B_EPanOpen = 0;
|
||
}
|
||
}
|
||
else if(!B_Dly_CheckErr) //故障检测延时完成,才检测开路
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
}
|
||
else if(AD_TmprPan <= C_AD_Pan_OpenIn)
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(++CounterL & 0x80)
|
||
{
|
||
CounterL = 0;
|
||
B_EPanOpen = 1;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
}
|
||
}
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Check_PanNtcClose
|
||
* 函数功能:锅底NTC短路检测
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
void Check_PanNtcClose()
|
||
{
|
||
static unsigned char CounterL,CounterH;
|
||
|
||
if(AD_TmprPan >= C_AD_Pan_CloseIn)
|
||
{
|
||
CounterL = 0;
|
||
|
||
if(++CounterH & 0x80)
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(B_Heat_En)
|
||
{
|
||
B_EPanClose = 1;
|
||
}
|
||
}
|
||
}
|
||
else if(AD_TmprPan <= C_AD_Pan_CloseOut)
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(++CounterL & 0x80)
|
||
{
|
||
CounterL = 0;
|
||
B_EPanClose = 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
}
|
||
}
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Check_PanNtcOver
|
||
* 函数功能:锅底NTC超温检测
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
void Check_PanNtcOver()
|
||
{
|
||
static unsigned char CounterL,CounterH;
|
||
|
||
if(B_PanOver_Dis)
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
|
||
B_EPanOver = 0;
|
||
}
|
||
else if(AD_TmprPan >= Buf_AD_Pan_OverIn)
|
||
{
|
||
CounterL = 0;
|
||
|
||
if(++CounterH & 0x80)
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(B_Heat_En)
|
||
{
|
||
B_EPanOver = 1;
|
||
}
|
||
}
|
||
}
|
||
else if(AD_TmprPan <= Buf_AD_Pan_OverOut)
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(++CounterL & 0x80)
|
||
{
|
||
CounterL = 0;
|
||
B_EPanOver = 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
}
|
||
}
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Check_VolTooHigh
|
||
* 函数功能:市电电压过高检测
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
void Check_VolTooHigh()
|
||
{
|
||
static unsigned char CounterL,CounterH;
|
||
|
||
if(Vol.flo.integer <= Buf_Vol_HighErr_Out) //高压恢复电压点
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(++CounterL & 0x80)
|
||
{
|
||
CounterL = 0;
|
||
B_EVolHigh = 0;
|
||
}
|
||
}
|
||
else if(Vol.flo.integer >= Buf_Vol_HighErr_In) //高压判断电压点
|
||
{
|
||
CounterL = 0;
|
||
|
||
if(++CounterH & 0x80)
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(B_Heat_En)
|
||
{
|
||
B_EVolHigh = 1;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
}
|
||
}
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Check_VolTooLow
|
||
* 函数功能:市电电压过低检测
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
void Check_VolTooLow()
|
||
{
|
||
static unsigned char CounterL,CounterH;
|
||
|
||
if(Vol.flo.integer >= Buf_Vol_LowErr_Out) //低压恢复电压点
|
||
{
|
||
CounterL = 0;
|
||
|
||
if(++CounterH & 0x80)
|
||
{
|
||
CounterH = 0;
|
||
B_EVolLow = 0;
|
||
}
|
||
}
|
||
else if(Vol.flo.integer <= Buf_Vol_LowErr_In) //低压判断电压点
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(++CounterL & 0x80)
|
||
{
|
||
CounterL = 0;
|
||
|
||
if(B_Heat_En)
|
||
{
|
||
B_EVolLow = 1;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
}
|
||
}
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Check_VolHigh
|
||
* 函数功能:市电高压区间判断
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
void Check_VolHigh()
|
||
{
|
||
static unsigned char CounterL,CounterH;
|
||
|
||
if(Vol.flo.integer >= (C_Vol_High - C_Vol_Comp))
|
||
{
|
||
CounterL = 0;
|
||
|
||
if(++CounterH & 0x04)
|
||
{
|
||
CounterH = 0;
|
||
B_Vol_High = 1;
|
||
}
|
||
}
|
||
else if(Vol.flo.integer <= (C_Vol_High - C_Vol_Comp - 5))
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(++CounterL & 0x04)
|
||
{
|
||
CounterL = 0;
|
||
B_Vol_High = 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
}
|
||
}
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Check_VolMid
|
||
* 函数功能:市电中压区间判断
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
void Check_VolMid()
|
||
{
|
||
static unsigned char CounterL,CounterH;
|
||
|
||
if(Vol.flo.integer >= (C_Vol_Mid - C_Vol_Comp))
|
||
{
|
||
CounterL = 0;
|
||
|
||
if(++CounterH & 0x04)
|
||
{
|
||
CounterH = 0;
|
||
B_Vol_Mid = 0;
|
||
}
|
||
}
|
||
else if(Vol.flo.integer <= (C_Vol_Mid - C_Vol_Comp - 3))
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(++CounterL & 0x04)
|
||
{
|
||
CounterL = 0;
|
||
B_Vol_Mid = 1;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
}
|
||
}
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Check_VolLow
|
||
* 函数功能:市电低压区间判断
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
void Check_VolLow()
|
||
{
|
||
static unsigned char CounterL,CounterH;
|
||
|
||
if(Vol.flo.integer >= (C_Vol_Low - C_Vol_Comp))
|
||
{
|
||
CounterL = 0;
|
||
|
||
if(++CounterH & 0x04)
|
||
{
|
||
CounterH = 0;
|
||
B_Vol_Low = 0;
|
||
}
|
||
}
|
||
else if(Vol.flo.integer <= (C_Vol_Low - C_Vol_Comp - 3))
|
||
{
|
||
CounterH = 0;
|
||
|
||
if(++CounterL & 0x04)
|
||
{
|
||
CounterL = 0;
|
||
B_Vol_Low = 1;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
}
|
||
}
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Calc_Volatage
|
||
* 函数功能:计算市电电压
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用,计算结果放于Volatage结构中
|
||
**************************************************************************/
|
||
void Calc_Volatage()
|
||
{
|
||
static unsigned char CounterL,CounterH;
|
||
|
||
volatile VolElecType NowVol;
|
||
//---------------------------------------------------------------------
|
||
if(AD_Volatage > C_AD_VolMax)
|
||
{
|
||
NowVol.flo.integer = C_Vol_Max - C_Vol_Comp;
|
||
NowVol.flo.radix = 0;
|
||
}
|
||
else if(AD_Volatage < C_AD_VolMin)
|
||
{
|
||
NowVol.all = 0;
|
||
}
|
||
else
|
||
{
|
||
NowVol.all = C_Slope_Volatage * (AD_Volatage - C_AD_VolMin);
|
||
}
|
||
//---------------------------------------------------------------------
|
||
if(Vol.all)
|
||
{
|
||
if(Vol.flo.integer > NowVol.flo.integer)
|
||
{
|
||
CounterL = 0;
|
||
|
||
if((Vol.flo.integer - NowVol.flo.integer) >= 5)
|
||
{
|
||
CounterH = 0;
|
||
Vol.all = NowVol.all;
|
||
}
|
||
else
|
||
{
|
||
if(++CounterH & 0x02)
|
||
{
|
||
CounterH = 0;
|
||
Vol.flo.integer--;
|
||
Vol.flo.radix = NowVol.flo.radix;
|
||
}
|
||
}
|
||
}
|
||
else if(Vol.flo.integer < NowVol.flo.integer)
|
||
{
|
||
CounterH = 0;
|
||
|
||
if((NowVol.flo.integer - Vol.flo.integer) >= 5)
|
||
{
|
||
CounterL = 0;
|
||
Vol.all = NowVol.all;
|
||
}
|
||
else
|
||
{
|
||
if(++CounterL & 0x02)
|
||
{
|
||
CounterL = 0;
|
||
Vol.flo.integer++;
|
||
Vol.flo.radix = NowVol.flo.radix;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
Vol.all = NowVol.all;
|
||
}
|
||
}
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Check_TopNtcFail
|
||
* 函数功能:顶部NTC失效检测
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
#ifdef _pAD_TOP
|
||
void Check_TopNtcFail()
|
||
{
|
||
|
||
}
|
||
#endif
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Check_PanNtcFail
|
||
* 函数功能:锅底NTC失效检测
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:内部调用
|
||
**************************************************************************/
|
||
void Check_PanNtcFail()
|
||
{
|
||
static unsigned char CounterL,CounterH;
|
||
|
||
if(B_PanFail_Dis)
|
||
{
|
||
CounterL = 0;
|
||
CounterH = 0;
|
||
|
||
B_EPanFail = 0;
|
||
}
|
||
else
|
||
{
|
||
|
||
}
|
||
}
|
||
|
||
/**************************************************************************
|
||
* 函数名称:Deal_Adc
|
||
* 函数功能:ADC处理
|
||
* 入口参数:无
|
||
* 出口参数:无
|
||
* 备 注:主循环调用
|
||
**************************************************************************/
|
||
void Deal_Adc()
|
||
{
|
||
Get_AdResult(); //获取AD结果
|
||
Delay_CheckError(); //硬件故障检测延时
|
||
|
||
#if _MODE_IHDEBUG_
|
||
if(!B_ErrorCheck_Dis) //禁止硬件故障检测
|
||
#endif
|
||
{
|
||
Check_IgbtNtcOpen(); //IGBT-NTC开路检测
|
||
Check_IgbtNtcClose(); //IGBT-NTC短路检测
|
||
Check_IgbtNtcOver(); //IGBT-NTC超温检测
|
||
Check_IgbtNtcHigh(); //IGBT-NTC高温检测
|
||
|
||
#ifdef _pAD_TOP
|
||
Check_TopNtcOpen(); //顶部NTC开路检测
|
||
Check_TopNtcClose(); //顶部NTC短路检测
|
||
Check_TopNtcFail(); //顶部NTC失效检测
|
||
#endif
|
||
|
||
Check_PanNtcOpen(); //锅底NTC开路检测
|
||
Check_PanNtcClose(); //锅底NTC短路检测
|
||
Check_PanNtcOver(); //锅底NTC超温检测
|
||
Check_PanNtcFail(); //锅底NTC失效检测
|
||
|
||
Check_VolTooHigh(); //市电电压过高检测
|
||
Check_VolTooLow(); //市电电压过低检测
|
||
}
|
||
#if _MODE_IHDEBUG_
|
||
else
|
||
{
|
||
Flag1_Error = 0;
|
||
Flag2_Error = 0;
|
||
}
|
||
#endif
|
||
|
||
if(B_VolAdc_Once)
|
||
{
|
||
B_VolAdc_Once = 0; //市电电压ADC完成一次,进入处理一次
|
||
|
||
Calc_Volatage(); //计算市电电压
|
||
Check_VolHigh(); //市电高压区间检测
|
||
Check_VolMid(); //市电中压区间检测
|
||
Check_VolLow(); //市电低压区间检测
|
||
}
|
||
}
|
||
|
||
|