📄 lzkfunc.c
字号:
#include "LZK.H"
#include <stdio.h>
#define Vref 1.200
/***********************************************************************
*** DO开关量(控制输出继电器)功能说明:
(1)KQJ:KQ可控硅开通控制继电器(常闭).
(2)LZJ:励磁状态继电器(常开),LZJ决定是否进行RF检测.
(3)LCJ:失步保护继电器(常开),控制主电源开关或输出给PLC.
(4)SZJ:跳闸停机继电器(常开),后备保护用,输出给PLC.
(5)BXJ:报警输出继电器(常开),用于接通声光报警或输出至PLC.
(6)TYJ:降压起动继电器(常开),控制输出.
(7)YKJ:遥控继电器(常开)
(8)N/A:
***********************************************************************/
uint8 bdata RelayOUT = 0; // Output Relay STATUS.
// sbit ZJJ_OUT = RelayOUT^7; // N/A.
sbit YKJ_OUT = RelayOUT^6; // YKJ Output Relay No.6.遥控状态输出
sbit TYJ_OUT = RelayOUT^5; // TYJ Output Relay No.5.降压启动控制输出
sbit BXJ_OUT = RelayOUT^4; // BXJ Output Relay No.4.报警输出
sbit SZJ_OUT = RelayOUT^3; // SZJ Output Relay No.3.失步再整步失败状态输出
sbit LCJ_OUT = RelayOUT^2; // LCJ Output Relay No.2.失步状态输出
sbit LZJ_OUT = RelayOUT^1; // LZJ Output Relay No.1.KQ误导通检测使能控制
sbit KQJ_OUT = RelayOUT^0; // KQJ Output Relay No.0.KQ控制继电器
/***********************************************************************
*** DI开关量(状态输入继电器)功能说明:
(1)DLJ:电机加电状态输入(常开),由PLC输入.
(2)RFJ:KQ导通检测(常开),RFJ闭合表示KQ导通.
(3)FCJ:断电保护输入(常开),由PLC输入,防止对电机的冲击.
(4)JYJ:降压起动输入(常开),由PLC输入.
(5)ZCJ:增值(常开),遥控增值.
(6)JCJ:减值(常开),遥控减值.
(7)YCJ:遥控状态继电器,由PLC输入.
(8)DYJ:低压状态输入.
***********************************************************************/
uint8 bdata RelayIN = 0xff; // Digital Input STATUS.
sbit DYJ_IN = RelayIN^7; // DYJ Input Relay No.7.低电压强励控制输入
sbit YCJ_IN = RelayIN^6; // YCJ Input Relay No.6.遥控状态控制输入
sbit JCJ_IN = RelayIN^5; // JCJ Input Relay No.5.减值
sbit ZCJ_IN = RelayIN^4; // ZCJ Input Relay No.4.增值
sbit JYJ_IN = RelayIN^3; // JYJ Input Relay No.3.降压启动控制输入
sbit FCJ_IN = RelayIN^2; // FCJ Input Relay No.2.防冲击输入<DSJ断电失步保护继电器>
sbit RFJ_IN = RelayIN^1; // RFJ Input Relay No.1.RF误导通信号输入
sbit DLJ_IN = RelayIN^0; // DLJ Input Relay No.0.电机启动控制信号输入
/*****************************************************************
*** 相差法测量电动机电源功率因数,PhasePole为DUx的过零检测波形
*****************************************************************/
uint8 bdata PwrFact_MsrFLAG = 0x00;
sbit DUxCO_LastVal = PwrFact_MsrFLAG ^ 7; // DUx
sbit DUxCO_CurrVal = PwrFact_MsrFLAG ^ 6; //
sbit PwrFact_CurLoopMsrOVER = PwrFact_MsrFLAG ^ 5; //
sbit PwrFact_CurLoopMsrEN = PwrFact_MsrFLAG ^ 4; //
sbit PwrFact_CalcMsrOVER = PwrFact_MsrFLAG ^ 3; // Every Wave 32 Points.
sbit PwrFact_CalcMsrEN = PwrFact_MsrFLAG ^ 2; //
sbit PwrFact_PhaDiffMsrOVER = PwrFact_MsrFLAG ^ 1; // Average for 8 Periods.
sbit PwrFact_PhaDiffMsrEN = PwrFact_MsrFLAG ^ 0; //
uint8 data DUxCO_RisTimCNT = 0;
uint8 data PwrFact_PhaDiffMsrCNT = 0;
UINTC data PwrFact_PhaDiffMsrDATA[8];
/****************************************************************************
*** 外部变量.
****************************************************************************/
extern uint16 xdata *InFlashWrPtr; // Internal FLASH Write Addr Point.
extern uint16 code *InFlashRdPtr; // Internal FLASH Read Addr Point.
/****************************************************************************
** 函数名称: T0_ISR()
** 功能描述: T0定时器中断处理,中断间隔125uS
(1)125uS时间基准:分为5个相位;
(2)WDT清除;
(3)A/D采样:UF,IF,DU,DI,CurrRingEY,CurrRingEI;
(4)DI读入: UFCO,IFCO,SYNCx,RelayIN;
(5)DO输出: RelayOUT,PulseOUT;
(6)功率因数相差法TIMER1测量结果读入;
** 入口参数: 无
** 出口参数: 无
** 全局变量: 无
** 调用模块: 无
** 说明:
****************************************************************************/
void T0_ISR(void) interrupt 1
{
uint8 ucTMP;
SFRPAGE = TIMER01_PAGE; // Change to TIMER01 PAGE.
TF0 = 0;
WDTCN = 0xA5; // Enable WDT or Reload the WDT.
SFRPAGE = 0x0f; // P5 SFR PAGE.
/*****************************************************************
*** DI开关量(状态输入继电器)读入(8路);
*****************************************************************/
P5MDOUT = 0x00; // P5口设置为漏极开路,输入方式.
P5MDOUT = 0x00; // P5口设置为漏极开路,输入方式.
nReInLE = 0; // Relay Input Enabled.
nReInLE = 0; // Relay Input Enabled.
RelayIN = P5; // Read Relay Digital Input.
nReInLE = 1; // Relay Input Disabled.
/*****************************************************************
*** DO开关量(控制输出继电器)输出(8路);
*****************************************************************/
P5MDOUT = 0xff; // P5口设置为推挽输出,输出方式.
P5MDOUT = 0xff; // P5口设置为推挽输出,输出方式.
ReOutLE = 1; // Relay Output Latch Enabled.
ReOutLE = 1; // Relay Output Latch Enabled.
P5 = RelayOUT; // Relay Digital Output.
ReOutLE = 0; // Relay Output Latch Disabled.
/*****************************************************************
*** DLJ释放或吸合动作处理.
*****************************************************************/
DLJ_LastVal = DLJ_CurrVal; // 保存DLJ状态.
DLJ_CurrVal = DLJ_IN; // 读取DLJ当前状态.
if( DLJ_CurrVal != DLJ_LastVal ) // DLJ状态改变.
{
if( DLJ_CurrVal == 0 ) // 开机启动.
{
MotNmlVoltStaUpEN = 1; // 电机正常启动允许使能.
DLJ_StopProDONE = 0; // 复位停机处理标志.
}
else // 停机.
{
if( DLJ_StopProDONE == 0 ) // 未进行过停机处理.
{
TrigPulseOutEN = 0; // 禁止可控硅触发脉冲输出.
// LCD显示“电机停机”.
// 所有DO复位,DO = "0xff".
// 所有计数器、定时器和标志位复位.
DLJ_StopProDONE = 1; // 置已停机处理标志.
}
}
}
else
{
if( DLJ_CurrVal == 1 ) // 等待启动信号.
{
if( JYJ_IN == 0 ) // 降压启动信号.
{
MotLowVoltStaUpEN = 1; // 电机启动允许使能.
}
}
}
/*****************************************************************
*** 可控硅触发脉冲输出,与SYNCa同步,SYNCa同步信号周期更新.
*****************************************************************/
SYNCa_LastVal = SYNCa_CurrVal; // 保存SYNCa状态
SYNCa_CurrVal = SYNCa; // 读取SYNCa当前状态
if( TrigPulseOutEN == 1) // 可控硅触发脉冲输出
{
if( SYNCa_CurrVal != SYNCa_LastVal) // SYNCa上升沿或下降沿
if( SYNCa_CurrVal == 1 ) // SYNCa上升沿,“0”-->“1”
{
TrigOutSyncTimCNT = 0; // 重新同步
TrigOutSyncTimCntEN = 1; // 同步计数使能,避免计时误差累积
}
if( EM_RegBrdgMode == 0 ) // EM Half Bridge,励磁为半桥形式.
{
if( TrigOutSyncTimCNT == TrigOutPosiA_OnTim ) // Trig Phase A+ ON.
PulseOutPut(0x7f & TrigOutPosiA_ON);
if( TrigOutSyncTimCNT == TrigOutPosiA_OffTim ) // Trig Phase A+ OFF.
PulseOutPut(0x7f);
if( TrigOutSyncTimCNT == TrigOutPosiB_OnTim ) // Trig Phase B+ ON.
PulseOutPut(0x7f & TrigOutPosiB_ON);
if( TrigOutSyncTimCNT == TrigOutPosiB_OffTim ) // Trig Phase B+ OFF.
PulseOutPut(0x7f);
if( TrigOutSyncTimCNT == TrigOutPosiC_OnTim ) // Trig Phase C+ ON.
PulseOutPut(0x7f & TrigOutPosiC_ON);
if( TrigOutSyncTimCNT == TrigOutPosiC_OffTim ) // Trig Phase C+ OFF.
PulseOutPut(0x7f);
}
else // EM Full Bridge,励磁为全桥形式.
{
if( TrigOutSyncTimCNT == TrigOutPosiA_OnTim ) /* Trig Phase A+ ON */
PulseOutPut(0x7f & TrigOutPosiA_ON & TrigOutNegaB_ON);
if( TrigOutSyncTimCNT == TrigOutPosiA_OffTim ) /* Trig Phase A+ OFF*/
PulseOutPut(0x7f);
if( TrigOutSyncTimCNT == TrigOutNegaC_OnTim ) /* Trig Phase C- ON */
PulseOutPut(0x7f & TrigOutPosiA_ON & TrigOutNegaC_ON);
if( TrigOutSyncTimCNT == TrigOutNegaC_OffTim ) /* Trig Phase C- OFF*/
PulseOutPut(0x7f);
if( TrigOutSyncTimCNT == TrigOutPosiB_OnTim ) /* Trig Phase B+ ON */
PulseOutPut(0x7f & TrigOutNegaC_ON & TrigOutPosiB_ON);
if( TrigOutSyncTimCNT == TrigOutPosiB_OffTim ) /* Trig Phase B+ OFF*/
PulseOutPut(0x7f);
if( TrigOutSyncTimCNT == TrigOutNegaA_OnTim ) /* Trig Phase A- ON */
PulseOutPut(0x7f & TrigOutPosiB_ON & TrigOutNegaA_ON);
if( TrigOutSyncTimCNT == TrigOutNegaA_OffTim ) /* Trig Phase A- OFF*/
PulseOutPut(0x7f);
if( TrigOutSyncTimCNT == TrigOutPosiC_OnTim ) /* Trig Phase C+ ON */
PulseOutPut(0x7f & TrigOutNegaA_ON & TrigOutPosiC_ON);
if( TrigOutSyncTimCNT == TrigOutPosiC_OffTim ) /* Trig Phase C+ OFF*/
PulseOutPut(0x7f);
if( TrigOutSyncTimCNT == TrigOutNegaB_OnTim ) /* Trig Phase B- ON */
PulseOutPut(0x7f & TrigOutPosiC_ON & TrigOutNegaB_ON);
if( TrigOutSyncTimCNT == TrigOutNegaB_OffTim ) /* Trig Phase B- OFF*/
PulseOutPut(0x7f);
}
if( TrigOutSyncTimCntEN == 1 )
{
TrigOutSyncTimCNT++;
if( TrigOutSyncTimCNT >= 161 )
{
TrigOutSyncTimCNT = 0;
TrigOutSyncTimCntEN = 0; // 防止因SYNCa错误导致触发脉冲错误
}
}
}
else
PulseOutPut(0xff); // 输出保护,脉冲输出指示iLED熄灭.
/*****************************************************************
*** 相差法测量电动机电源功率因数,PhasePole(DUxCO)为DUx的过零检测波形
*****************************************************************/
/*
uint8 bdata PwrFact_MsrFLAG = 0x00;
sbit DUxCO_LastVal = PwrFact_MsrFLAG ^ 7; // DUxCO历史状态
sbit DUxCO_CurrVal = PwrFact_MsrFLAG ^ 6; // DUxCO当前状态
sbit PwrFact_CurLoopMsrOVER = PwrFact_MsrFLAG ^ 5; // 功率因数电流环法单次测量结束
sbit PwrFact_CurLoopMsrEN = PwrFact_MsrFLAG ^ 4; // 功率因数电流环法测量使能
sbit PwrFact_CalcMsrOVER = PwrFact_MsrFLAG ^ 3; // 功率因数计算法单次测量结束
sbit PwrFact_CalcMsrEN = PwrFact_MsrFLAG ^ 2; // 功率因数计算法测量使能
sbit PwrFact_PhaDiffMsrOVER = PwrFact_MsrFLAG ^ 1; // 功率因数相差法单次测量结束
sbit PwrFact_PhaDiffMsrEN = PwrFact_MsrFLAG ^ 0; // 功率因数相差法测量使能
uint8 xdata DUxCO_RisTimCNT = 0; // DUxCO上升沿次数
uint8 xdata PwrFact_PhaDiffMsrCNT = 0; // 功率因数相差法测量次数
INTUC xdata PwrFact_PhaDiffMsrDATA[8]; // 功率因数相差法单次测量数据
uint16 xdata PwrFact_PhaDiffMsrResult; // 功率因数相差法测量结果
*/
if( PwrFact_PhaDiffMsrEN == 1 )
{
DUxCO_LastVal = DUxCO_CurrVal; // 保存DUxCO状态
DUxCO_CurrVal = PhasePole; // 读取DUxCO当前状态
if( DUxCO_CurrVal != DUxCO_LastVal )
if( DUxCO_CurrVal == 1 ) // 识别DUxCO上升沿
{
if( DUxCO_RisTimCNT == 0 ) // TIMER1没有开始计数
{
SFRPAGE = TIMER01_PAGE; // Change to Timer1 Page
TR1 = 1; // T1 Begin.
}
else
DUxCO_RisTimCNT++;
if( DUxCO_RisTimCNT == 3 ) // 在第三次DUxCO上升沿中止TIMER1
{
SFRPAGE = TIMER01_PAGE; // Change to Timer1 Page
TR1 = 0; // T1 STOP.
PwrFact_PhaDiffMsrDATA[PwrFact_PhaDiffMsrCNT].ucVAR[0] = TL1;
PwrFact_PhaDiffMsrDATA[PwrFact_PhaDiffMsrCNT].ucVAR[1] = TH1;
TH1 = 0; // TH1_INIT = 0x00;
TL1 = 0; // TL1_INIT = 0x00;
DUxCO_RisTimCNT = 0; //
PwrFact_PhaDiffMsrCNT++;
if( PwrFact_PhaDiffMsrCNT == 8 )
{
PwrFact_PhaDiffMsrOVER = 1;// 置本轮测量结束标记,等待计算测量结果.
PwrFact_PhaDiffMsrEN = 0; // 计算结果期间停止测量.
}
}
}
}
/*****************************************************************
*** TIMER 0 SLOT 0
*** (1)启动录波功能:32 Points / Period; Time Interevl 625uS;
*** (2)SYNCa、SYNCb和SYNCc同步信息缺失或相序错误检测;
*** (3)失控检测;
*****************************************************************/
if( TimSlotCNT == 0 ) // Time Slot 1;
{
/*****************************************************************
*** 启动录波功能:32 Points / Period; Time Interevl 625uS;
*****************************************************************/
/*
#define ByteNumMaxPerPage 65534
#define ExSramWrRdPagMax 2
MotStaUpEmWaveRecEN;
MotStaUpEmVoltRecEN;
MotStaUpEmWaveRecOVER;
uint8 idata ExSramWrRdPag; // 外部SRAM页
uint16 idata ExSramWrRdAdr; // 外部SRAM读写地址
INTUC idata AD_DataBuff; // A/D数据缓冲
*/
if( MotStaUpEmWaveRecEN == 1 ) // 启动录波功能是否开启
{
if( MotStaUpEmVoltRecEN == 1 ) // 1/0: EmVolt / EmCurr;
ADC0_CH_Setting(0x02); // AIN02 for EmVolt.
else
ADC0_CH_Setting(0x03); // AIN03 for EmCurr.
AD0INT = 0; // RST ADC Convert Complete Flag.
AD0BUSY = 1; // Start ADC0
while( AD0INT == 0 ); // Wait for Convert Over
if( ExSramWrRdAdr & 0x01 == 0 ) // Even Address.
{
AD_DataBuff.ucVAR[1] = ADC0H; // Get High 8 Byte.
AD_DataBuff.ucVAR[0] = ADC0L & 0xf0; // Get Low 4 Byte.
ExSRAM_PageSetting( ExSramWrRdPag ); // 切换到外部SRAM
ExSramWrRdAdrPt = ExSramWrRdAdr; //
*ExSramWrRdAdrPt = AdcDatBuff.ucVAR[1]; // Save High 8 Byte
ExSramWrRdAdr++;
ExInSRAM_Select(0); // 切换回内部SRAM
}
else
{
AD_DataBuff.ucVAR[1] = ADC0H; // Get High 8 Byte.
ucTMP = ADC0L; // Get Low 4 Byte.
ucTMP = ucTMP >> 4; // Unite with Last Sample's Low 4 Byte.
AD_DataBuff.ucVAR[0] = ucTMP | AD_DataBuff.ucVAR[0];
ExSRAM_PageSetting( ExSramWrRdPag ); // 切换到外部SRAM
ExSramWrRdAdrPt = ExSramWrRdAdr;
*ExSramWrRdAdrPt = AD_DataBuff.ucVAR[0];// Save Low 8 Byte.
ExSramWrRdAdr++;
ExSramWrRdAdrPt = ExSramWrRdAdr;
*ExSramWrRdAdrPt = AD_DataBuff.ucVAR[1];// Save High 8 Byte.
ExSramWrRdAdr++;
ExInSRAM_Select(0); // 切换回内部SRAM
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -