Files
CMS79F5335_Demo/范例程序(C语言)/IH-CMS79F53X5-C-V1.0/ADC.c
2026-10-19 15:33:00 +08:00

1324 lines
25 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**************************************************************************
**************************************************************************/
#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(); //市电低压区间检测
}
}