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

505 lines
12 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"
/**************************************************************************
* 函数名称:OutPut_PWM
* 函数功能:PWM输出
* 入口参数:无
* 出口参数:无
* 备 注:内部调用
**************************************************************************/
void OutPut_PWM()
{
volatile unsigned char i;
volatile unsigned char bak_PWMCON0 = 0B01100000; //PWM时钟分频=32
volatile unsigned char bak_PWMCON1 = 0;
//---------------------------------------------------------------------
//风扇:
#if _FAN_OUT_PWM_ && ((C_PwmChannel_Buzz&0xE0)!=(C_PwmChannel_Fan&0xE0)) && (C_PwmChannel_Fan!=0xFF)
if(PwmDuty_Fan)
{
PwmDuty_Fan--;
PwmDuty_Fan &= 0x3FF;
}
if(PwmPeriod_Fan)
{
PwmPeriod_Fan--;
PwmPeriod_Fan &= 0x3FF;
}
#if (C_PwmChannel_Fan>>4)==0
PWMDH &= ~(3 << 0); //Bit0~Bit1:PWM0占空比高2位
if(PwmDuty_Fan & 0x0200)
{
PWMDH |= (1 << 1);
}
if(PwmDuty_Fan & 0x0100)
{
PWMDH |= (1 << 0);
}
PWMD0L = PwmDuty_Fan; //PWM0占空比低8位
PWMTH &= ~(3 << 0); //Bit0~Bit1:PWM0\PWM1周期高2位
if(PwmPeriod_Fan & 0x0200)
{
PWMTH |= (1 << 1);
}
if(PwmPeriod_Fan & 0x0100)
{
PWMTH |= (1 << 0);
}
PWMTL = PwmPeriod_Fan; //PWM0~PWM1周期低8位
if(PwmDuty_Fan)
{
bak_PWMCON0 |= (1 << 0); //使能PWM0
}
#if (C_PwmChannel_Fan&0xF)==0xA
bak_PWMCON1 |= 0; //PWM的IO位置选择:PWM0A
#elif (C_PwmChannel_Fan&0xF)==0xB
bak_PWMCON1 |= 1; //PWM的IO位置选择:PWM0B
#elif (C_PwmChannel_Fan&0xF)==0xC
bak_PWMCON1 |= 2; //PWM的IO位置选择:PWM0C
#elif (C_PwmChannel_Fan&0xF)==0xD
bak_PWMCON1 |= 3; //PWM的IO位置选择:PWM0D
#endif
#elif (C_PwmChannel_Fan>>4)==1
PWMDH &= ~(3 << 2); //Bit2~Bit3:PWM1占空比高2位
if(PwmDuty_Fan & 0x0200)
{
PWMDH |= (1 << 3);
}
if(PwmDuty_Fan & 0x0100)
{
PWMDH |= (1 << 2);
}
PWMD1L = PwmDuty_Fan; //PWM1占空比低8位
PWMTH &= ~(3 << 0); //Bit0~Bit1:PWM0\PWM1周期高2位
if(PwmPeriod_Fan & 0x0200)
{
PWMTH |= (1 << 1);
}
if(PwmPeriod_Fan & 0x0100)
{
PWMTH |= (1 << 0);
}
PWMTL = PwmPeriod_Fan; //PWM0~PWM1周期低8位
if(PwmDuty_Fan)
{
bak_PWMCON0 |= (1 << 1); //使能PWM1
}
#if (C_PwmChannel_Fan&0xF)==0xA
bak_PWMCON1 |= (0 << 2); //PWM的IO位置选择:PWM1A
#elif (C_PwmChannel_Fan&0xF)==0xB
bak_PWMCON1 |= (1 << 2); //PWM的IO位置选择:PWM1B
#elif (C_PwmChannel_Fan&0xF)==0xC
bak_PWMCON1 |= (2 << 2); //PWM的IO位置选择:PWM1C
#elif (C_PwmChannel_Fan&0xF)==0xD
bak_PWMCON1 |= (3 << 2); //PWM的IO位置选择:PWM1D
#endif
#elif (C_PwmChannel_Fan>>4)==2
PWMDH &= ~(3 << 4); //Bit4~Bit5:PWM2占空比高2位
if(PwmDuty_Fan & 0x0200)
{
PWMDH |= (1 << 5);
}
if(PwmDuty_Fan & 0x0100)
{
PWMDH |= (1 << 4);
}
PWMD2L = PwmDuty_Fan; //PWM2占空比低8位
PWMTH &= ~(3 << 2); //Bit2~Bit3:PWM2周期高2位
if(PwmPeriod_Fan & 0x0200)
{
PWMTH |= (1 << 3);
}
if(PwmPeriod_Fan & 0x0100)
{
PWMTH |= (1 << 2);
}
PWM2TL = PwmPeriod_Fan; //PWM2周期低8位
if(PwmDuty_Fan)
{
bak_PWMCON0 |= (1 << 2); //使能PWM2
}
#if (C_PwmChannel_Fan&0xF)==0xA
bak_PWMCON1 |= (0 << 4); //PWM的IO位置选择:PWM2A
#elif (C_PwmChannel_Fan&0xF)==0xB
bak_PWMCON1 |= (1 << 4); //PWM的IO位置选择:PWM2B
#elif (C_PwmChannel_Fan&0xF)==0xC
bak_PWMCON1 |= (2 << 4); //PWM的IO位置选择:PWM2C
#elif (C_PwmChannel_Fan&0xF)==0xD
bak_PWMCON1 |= (3 << 4); //PWM的IO位置选择:PWM2D
#endif
#endif
#endif
//---------------------------------------------------------------------
//蜂鸣器:
#if (C_PwmChannel_Buzz!=0xFF)
if(PwmDuty_Buzz)
{
PwmDuty_Buzz--;
PwmDuty_Buzz &= 0x3FF;
}
if(PwmPeriod_Buzz)
{
PwmPeriod_Buzz--;
PwmPeriod_Buzz &= 0x3FF;
}
#if (C_PwmChannel_Buzz>>4)==0
PWMDH &= ~(3 << 0); //Bit0~Bit1:PWM0占空比高2位
if(PwmDuty_Buzz & 0x0200)
{
PWMDH |= (1 << 1);
}
if(PwmDuty_Buzz & 0x0100)
{
PWMDH |= (1 << 0);
}
PWMD0L = PwmDuty_Buzz; //PWM0占空比低8位
PWMTH &= ~(3 << 0); //Bit0~Bit1:PWM0\PWM1周期高2位
if(PwmPeriod_Buzz & 0x0200)
{
PWMTH |= (1 << 1);
}
if(PwmPeriod_Buzz & 0x0100)
{
PWMTH |= (1 << 0);
}
PWMTL = PwmPeriod_Buzz; //PWM0~PWM1周期低8位
if(PwmDuty_Buzz)
{
bak_PWMCON0 |= (1 << 0); //使能PWM0
}
#if (C_PwmChannel_Buzz&0xF)==0xA
bak_PWMCON1 |= 0; //PWM的IO位置选择:PWM0A
#elif (C_PwmChannel_Buzz&0xF)==0xB
bak_PWMCON1 |= 1; //PWM的IO位置选择:PWM0B
#elif (C_PwmChannel_Buzz&0xF)==0xC
bak_PWMCON1 |= 2; //PWM的IO位置选择:PWM0C
#elif (C_PwmChannel_Buzz&0xF)==0xD
bak_PWMCON1 |= 3; //PWM的IO位置选择:PWM0D
#endif
#elif (C_PwmChannel_Buzz>>4)==1
PWMDH &= ~(3 << 2); //Bit2~Bit3:PWM1占空比高2位
if(PwmDuty_Buzz & 0x0200)
{
PWMDH |= (1 << 3);
}
if(PwmDuty_Buzz & 0x0100)
{
PWMDH |= (1 << 2);
}
PWMD1L = PwmDuty_Buzz; //PWM1占空比低8位
PWMTH &= ~(3 << 0); //Bit0~Bit1:PWM0\PWM1周期高2位
if(PwmPeriod_Buzz & 0x0200)
{
PWMTH |= (1 << 1);
}
if(PwmPeriod_Buzz & 0x0100)
{
PWMTH |= (1 << 0);
}
PWMTL = PwmPeriod_Buzz; //PWM0~PWM1周期低8位
if(PwmDuty_Buzz)
{
bak_PWMCON0 |= (1 << 1); //使能PWM1
}
#if (C_PwmChannel_Buzz&0xF)==0xA
bak_PWMCON1 |= (0 << 2); //PWM的IO位置选择:PWM1A
#elif (C_PwmChannel_Buzz&0xF)==0xB
bak_PWMCON1 |= (1 << 2); //PWM的IO位置选择:PWM1B
#elif (C_PwmChannel_Buzz&0xF)==0xC
bak_PWMCON1 |= (2 << 2); //PWM的IO位置选择:PWM1C
#elif (C_PwmChannel_Buzz&0xF)==0xD
bak_PWMCON1 |= (3 << 2); //PWM的IO位置选择:PWM1D
#endif
#elif (C_PwmChannel_Buzz>>4)==2
PWMDH &= ~(3 << 4); //Bit4~Bit5:PWM2占空比高2位
if(PwmDuty_Buzz & 0x0200)
{
PWMDH |= (1 << 5);
}
if(PwmDuty_Buzz & 0x0100)
{
PWMDH |= (1 << 4);
}
PWMD2L = PwmDuty_Buzz; //PWM2占空比低8位
PWMTH &= ~(3 << 2); //Bit2~Bit3:PWM2周期高2位
if(PwmPeriod_Buzz & 0x0200)
{
PWMTH |= (1 << 3);
}
if(PwmPeriod_Buzz & 0x0100)
{
PWMTH |= (1 << 2);
}
PWM2TL = PwmPeriod_Buzz; //PWM2周期低8位
if(PwmDuty_Buzz)
{
bak_PWMCON0 |= (1 << 2); //使能PWM2
}
#if (C_PwmChannel_Buzz&0xF)==0xA
bak_PWMCON1 |= (0 << 4); //PWM的IO位置选择:PWM2A
#elif (C_PwmChannel_Buzz&0xF)==0xB
bak_PWMCON1 |= (1 << 4); //PWM的IO位置选择:PWM2B
#elif (C_PwmChannel_Buzz&0xF)==0xC
bak_PWMCON1 |= (2 << 4); //PWM的IO位置选择:PWM2C
#elif (C_PwmChannel_Buzz&0xF)==0xD
bak_PWMCON1 |= (3 << 4); //PWM的IO位置选择:PWM2D
#endif
#endif
#endif
//---------------------------------------------------------------------
PWMCON1 = bak_PWMCON1; //PWM的IO位置设置
if(bak_PWMCON0 != PWMCON0)
{
PWMCON0 = bak_PWMCON0; //PWM时钟分频设置,使能\禁止PWM
}
}
/**************************************************************************
* 函数名称:Buzz_Short_One
* 函数功能:蜂鸣器短鸣一声
* 入口参数:无
* 出口参数:无
* 备 注:
**************************************************************************/
void Buzz_Short_One()
{
TimeBuzz = 200/C_TimeMS_Main; //200ms
B_Buzz_Out = 1; //蜂鸣器输出
}
/**************************************************************************
* 函数名称:Buzz_Long_One
* 函数功能:蜂鸣器长鸣一声
* 入口参数:无
* 出口参数:无
* 备 注:
**************************************************************************/
void Buzz_Long_One()
{
TimeBuzz = 400/C_TimeMS_Main; //400ms
B_Buzz_Out = 1; //蜂鸣器输出
}
/**************************************************************************
* 函数名称:OutPut_Buzz
* 函数功能:蜂鸣器输出
* 入口参数:无
* 出口参数:无
* 备 注:内部调用
**************************************************************************/
void OutPut_Buzz()
{
if(TimeBuzz) //蜂鸣器鸣叫计时
{
TimeBuzz--;
}
else
{
B_Buzz_Out = 0; //蜂鸣器输出停止
}
//---------------------------------------------------------------------
#if (C_PwmChannel_Buzz!=0xFF)
PwmPeriod_Buzz = 250; //蜂鸣器PWM周期:250us
if(B_Buzz_En || B_Buzz_Out)
{ //蜂鸣器输出
PwmDuty_Buzz = 125; //蜂鸣器PWM占空比:125us
}
else
{ //蜂鸣器关闭
PwmDuty_Buzz = 0; //蜂鸣器PWM占空比:0us
}
#endif
}
/**************************************************************************
* 函数名称:OutPut_Fan
* 函数功能:风扇输出
* 入口参数:无
* 出口参数:无
* 备 注:内部调用
**************************************************************************/
void OutPut_Fan()
{
static unsigned int Delay_FanOut;
static unsigned char Flag_FanOut;
//---------------------------------------------------------------------
if((AD_TmprPan > Buf_AD_Pan_FanOn) || (AD_TmprIgbt > Buf_AD_Igbt_FanOn))
{ //锅底高温、IGBT高温
SetBit(Flag_FanOut,0);
}
else if((AD_TmprPan < Buf_AD_Pan_FanOff) && (AD_TmprIgbt < Buf_AD_Igbt_FanOff))
{
ClrBit(Flag_FanOut,0);
}
//---------------------------------------------------------------------
if(B_Heat_En)
{ //加热使能
SetBit(Flag_FanOut,1);
if(TestOne(Flag_FanOut,0))
{ //锅底高温、IGBT高温
Delay_FanOut = 1000u/C_TimeMS_Main*180; //3min
}
else
{ //锅底和IGBT温度正常
Delay_FanOut = 0;
}
}
else
{
ClrBit(Flag_FanOut,1);
}
//---------------------------------------------------------------------
if(B_Fan_En || B_Zero_Lose)
{ //风扇使能、过零丢失
SetBit(Flag_FanOut,2);
}
else
{
ClrBit(Flag_FanOut,2);
}
//---------------------------------------------------------------------
if(Delay_FanOut)
{ //风扇延时
Delay_FanOut--;
SetBit(Flag_FanOut,3);
}
else
{
ClrBit(Flag_FanOut,3);
}
//---------------------------------------------------------------------
#if !_FAN_OUT_PWM_ || ((C_PwmChannel_Buzz&0xE0)==(C_PwmChannel_Fan&0xE0)) || (C_PwmChannel_Fan==0xFF)
if(Flag_FanOut && B_CurrAdc_Fst)
{
Pin_Fan = 1; //风扇输出(IO口输出高)
}
else
{
Pin_Fan = 0; //风扇输出停止(IO口输出低)
}
//---------------------------------------------------------------------
#else
PwmPeriod_Fan = 60; //风扇PWM周期:60us
if(Flag_FanOut && B_CurrAdc_Fst)
{
PwmDuty_Fan = 60; //风扇PWM占空比:60us
}
else
{
PwmDuty_Fan = 0; //风扇PWM占空比:0us
}
#endif
}
/**************************************************************************
* 函数名称:OutPut_Heat
* 函数功能:加热输出
* 入口参数:无
* 出口参数:无
* 备 注:内部调用
**************************************************************************/
void OutPut_Heat()
{
if(B_Protect_Stop)
{ //IGBT保护停止
Flag_PPG = 0; //PPG输出关闭
B_PPG_On = B_PPG_Out = 0;
B_Pan_Error = B_Pan_No = B_Pan_Have = 0;
}
#ifndef _TEST_PPGOUT_ //PPG输出测试
#ifndef _TEST_PANCHECK_ //检锅测试
#if _MODE_IHDEBUG_
else if((!B_Heat_En || Flag1_Error || Flag2_Error) &&\
!B_Test_PPGOut && !B_Test_PanCheck)
#else
else if(!B_Heat_En || Flag1_Error || Flag2_Error)
#endif
{ //加热关闭、故障
Flag_PPG = 0; //PPG输出关闭
B_PPG_On = B_PPG_Out = 0;
B_Pan_Error = B_Pan_No = B_Pan_Have = 0;
}
#endif
#endif
else
{ //正常加热输出
B_PPG_En = 1; //使能PPG输出
#ifndef _TEST_PPGOUT_ //PPG输出测试
#if _MODE_IHDEBUG_
if(!B_Test_PPGOut)
#endif
{
if(B_HeatStop_CheckPan)
{
B_PPGStop_CheckPan = 1; //PPG暂停但检锅
}
else
{
B_PPGStop_CheckPan = 0;
}
if(B_HeatStop_NoCheck)
{
B_PPGStop_NoCheck = 1; //PPG暂停不检锅
}
else
{
B_PPGStop_NoCheck = 0;
}
}
#endif
#ifdef _TEST_PANCHECK_ //检锅测试
B_PPGStop_CheckPan = 1; //PPG暂停但检锅
#elif _MODE_IHDEBUG_
if(B_Test_PanCheck) //检锅测试
{
B_PPGStop_CheckPan = 1; //PPG暂停但检锅
}
#endif
}
}
/**************************************************************************
* 函数名称:Set_OutPut
* 函数功能:输出设置
* 入口参数:无
* 出口参数:无
* 备 注:主循环调用
**************************************************************************/
void Set_OutPut()
{
OutPut_PWM(); //PWM输出
OutPut_Heat(); //加热输出
OutPut_Fan(); //风扇输出
OutPut_Buzz(); //蜂鸣器输出
}