📄 lzkfunc.c
字号:
if( ExSramWrRdAdr >= ByteNumMaxPerPage ) // 65534.
{ // 65535 Sample Points/Page( 27Sec/Page ).
ExSramWrRdAdr = 0; // RST ExSRAM Address.
ExSramWrRdPag++; // ExSRAM Page Number Increase 1.
}
if( ExSramWrRdPag >= ExSramWrRdPagMax ) // 2
{ // Motor Startup Wave Record Over.
ExSramWrRdAdr = 0; // RST ExSRAM Address.
ExSramWrRdPag = 0; // RST ExSRAM Page No.
MotStaUpEmWaveRecEN = 0; // Disabled Motor Startup Wave Recording.
MotStaUpEmWaveRecOVER = 1; // Set Record Over Event Flag.
}
}
/*****************************************************************
*** SYNCa、SYNCb和SYNCc同步信息缺失或相序错误检测.
*****************************************************************/
/*
#define SYNCxHalfPeriTimMAX 22 // 22 * 0.625 = 13.75mS.
#define SYNCxHalfPeriTimMIN 10 // 10 * 0.625 = 6.25mS.
#define SYNCxErrTimMAX 5 // 允许同步信号连续错误次数
uint8 xdata SYNCaSameLevlTimCNT = 0;
uint8 xdata SYNCbSameLevlTimCNT = 0;
uint8 xdata SYNCcSameLevlTimCNT = 0;
uint8 xdata SYNCaErrTimCNT = 0;
uint8 xdata SYNCbErrTimCNT = 0;
uint8 xdata SYNCcErrTimCNT = 0;
uint8 xdata SYNCbAftSYNCaRiseEdgeTimCNT = 0;
uint8 xdata SYNCcAftSYNCaRiseEdgeTimCNT = 0;
uint8 bdata SYNCx_FLAG = 0x00;
sbit SYNCc_LastVal = SYNCx_FLAG ^ 7;
sbit SYNCc_CurrVal = SYNCx_FLAG ^ 6;
sbit SYNCb_LastVal = SYNCx_FLAG ^ 5;
sbit SYNCb_CurrVal = SYNCx_FLAG ^ 4;
sbit SYNCa2_LastVal = SYNCx_FLAG ^ 3;
sbit SYNCa2_CurrVal = SYNCx_FLAG ^ 2;
sbit SYNCa_LastVal = SYNCx_FLAG ^ 1;
sbit SYNCa_CurrVal = SYNCx_FLAG ^ 0;
uint8 bdata SYNCx_ErrFLAG = 0x00;
sbit SYNCabcMoniEN = SYNCx_ErrFLAG ^ 6;
sbit SYNCbAftSYNCaRiseEdgeTimCntEN = SYNCx_ErrFLAG ^ 6;
sbit SYNCcAftSYNCaRiseEdgeTimCntEN = SYNCx_ErrFLAG ^ 5;
sbit SYNCbAftSYNCaErrEVT = SYNCx_ErrFLAG ^ 4;
sbit SYNCcAftSYNCaErrEVT = SYNCx_ErrFLAG ^ 3;
sbit SYNCaErrEVT = SYNCx_ErrFLAG ^ 2;
sbit SYNCbErrEVT = SYNCx_ErrFLAG ^ 1;
sbit SYNCcErrEVT = SYNCx_ErrFLAG ^ 0;
*/
if( SYNCabcMoniEN ) // 励磁同步检测功能是否使能.
{
// 1-----1 1-----1 1-----1
// SYNCa_| |_____| |_____| |___________
// ______0_____10____0_____10____0_____10__________0(0mS); 20(12.5mS)
// 1-----1 1-----1 1-----1
// SYNCb_____| |_____| |_____| |_______13(8.125mS);30(18.75mS);
// _________6.67__16.7__6.67__16.7__6.67__16.7_____
// 1-----1 1-----1 1-----1
// SYNCc_________| |_____| |_____| |___
// _____________13.3__3.3___13.3__3.3___13.3__3.3__26(16.25mS);11(6.875mS);
/*****************************************************************
*** A相同步信息处理:检测SYNCa高电平或低电平持续时间,
*** 在SYNCa上升沿启动SYNCb滞后SYNCa计时,
*** 检测间隔时间625uS
*****************************************************************/
SYNCa2_LastVal = SYNCa2_CurrVal;
SYNCa2_CurrVal = SYNCa;
if( SYNCa2_CurrVal != SYNCa2_LastVal ) // SYNCa电平变化.
{
if( (SYNCaSameLevlTimCNT > SYNCxHalfPeriTimMAX) || (SYNCaSameLevlTimCNT < SYNCxHalfPeriTimMIN) )
{ // SYNCa同一电平时间太长或太短
SYNCaErrTimCNT++;
if( SYNCaErrTimCNT >= SYNCxErrTimMAX )
{
SYNCaErrTimCNT = 0;
SYNCaErrEVT = 1; // 置位SYNCa错误标记
}
}
else
SYNCaErrTimCNT = 0; // 复位SYNCaErrTimCNT
if( SYNCa2_CurrVal == 1 ) // SYNCa上升沿.
{
SYNCbAftSYNCaRiseEdgeTimCntEN = 1; // SYNCb上升沿滞后SYNCa上升沿计时使能.
SYNCcAftSYNCaRiseEdgeTimCntEN = 1; // SYNCc上升沿滞后SYNCa上升沿计时使能.
}
SYNCaSameLevlTimCNT = 0; // 复位SYNCaSameLevlTimCNT.
}
else // SYNCa电平保持不变
SYNCaSameLevlTimCNT++;
if( SYNCbAftSYNCaRiseEdgeTimCntEN == 1 )
SYNCbAftSYNCaRiseEdgeTimCNT++; // SYNCb上升沿滞后SYNCa上升沿计时
if( SYNCcAftSYNCaRiseEdgeTimCntEN == 1 )
SYNCcAftSYNCaRiseEdgeTimCNT++; // SYNCc上升沿滞后SYNCa上升沿计时
/*****************************************************************
*** B相同步信息处理:检测SYNCb高电平或低电平持续时间,
*** 在SYNCb上升沿检查SYNCb滞后SYNCa计时结果是否在范围内,
*** 检测间隔时间625uS
*****************************************************************/
SYNCb_LastVal = SYNCb_CurrVal;
SYNCb_CurrVal = SYNCb;
if( SYNCb_CurrVal != SYNCb_LastVal ) // SYNCb电平变化.
{
if( (SYNCbSameLevlTimCNT > SYNCxHalfPeriTimMAX) || (SYNCaSameLevlTimCNT < SYNCxHalfPeriTimMIN) )
{ // SYNCa同一电平时间太长或太短
SYNCbErrTimCNT++;
if( SYNCbErrTimCNT >= SYNCxErrTimMAX )
{
SYNCbErrTimCNT = 0;
SYNCbErrEVT = 1;
}
}
else
SYNCbErrTimCNT = 0; // 复位SYNCaErrTimCNT
if( SYNCb_CurrVal == 1 ) // SYNCb上升沿.
{
SYNCbAftSYNCaRiseEdgeTimCntEN = 0;// 3.75 < 6.67 < 10;
if( (SYNCbAftSYNCaRiseEdgeTimCNT < 6) || (SYNCbAftSYNCaRiseEdgeTimCNT > 16) )
{
SYNCbAftSYNCaRiseEdgeTimCNT = 0;
SYNCbAftSYNCaErrEVT = 1; // 同步相序错误
}
SYNCbAftSYNCaRiseEdgeTimCNT = 0;
}
SYNCbSameLevlTimCNT = 0; // 复位SYNCaSameLevlTimCNT.
}
else
SYNCbSameLevlTimCNT++;
/*****************************************************************
*** C相同步信息处理:检测SYNCc高电平或低电平持续时间,
*** 在SYNCc上升沿检查SYNCc滞后SYNCa计时结果是否在范围内,
*** 检测间隔时间625uS
*****************************************************************/
SYNCc_LastVal = SYNCc_CurrVal;
SYNCc_CurrVal = SYNCc;
if( SYNCc_CurrVal != SYNCc_LastVal ) // SYNCc电平变化.
{
if( (SYNCcSameLevlTimCNT > SYNCxHalfPeriTimMAX) || (SYNCcSameLevlTimCNT < SYNCxHalfPeriTimMIN) )
{ // SYNCa同一电平时间太长或太短
SYNCcErrTimCNT++;
if( SYNCcErrTimCNT >= SYNCxErrTimMAX )
{
SYNCcErrTimCNT = 0; // 复位SYNCcErrTimCNT
SYNCcErrEVT = 1;
}
}
else
SYNCcErrTimCNT = 0; // 复位SYNCcErrTimCNT
if( SYNCc_CurrVal == 1 ) // SYNCa上升沿.
{
SYNCcAftSYNCaRiseEdgeTimCntEN = 0;// 9.375 < 13.33 < 16.25;
if( (SYNCcAftSYNCaRiseEdgeTimCNT < 15) || (SYNCcAftSYNCaRiseEdgeTimCNT > 26) )
{
SYNCcAftSYNCaRiseEdgeTimCNT = 0;
SYNCcAftSYNCaErrEVT = 1; // 同步相序错误
}
SYNCcAftSYNCaRiseEdgeTimCNT = 0;
}
SYNCcSameLevlTimCNT = 0; // 复位SYNCcSameLevlTimCNT.
}
else
SYNCcSameLevlTimCNT++;
/*****************************************************************
*** 失控检测
*****************************************************************/
/*
#define UFCO_OutOfCtrlTimMAX 5 //
uint8 xdata UFCO_LowLevlTimCNT = 0;
uint8 xdata UFCO_OutOfCtrlTimCNT =0;
uint8 xdata UFCO_01SecTimCNT = 0;
UFCO_LastVal
UFCO_CurrVal
UFCO_01SecTimCntEN
UFCO_OutOfCtrlEVT
*/
if( OutOfCtrlMoniEN ) // 失控检测功能是否使能.
{
UFCO_LowLevlTimCNT++; // Increase 1 Every 625uS.
UFCO_LastVal = UFCO_CurrVal; // UFCO为过零比较.
UFCO_CurrVal = ~UFCO; // 比较器倒相!!!硬件设计错误.
if( UFCO_CurrVal != UFCO_LastVal )
{
if( UFCO_CurrVal == 0 ) // UFCO下降沿.
UFCO_LowLevlTimCNT = 0; // 复位UFCO低电平计时器.
else // 只在UFCO上升沿判断UFCO_LowLevlTimCNT的值.
{
if( UFCO_LowLevlTimCNT >= 9 ) // UFCO低电平时间超过9(5.5mS).
{
UFCO_OutOfCtrlTimCNT++; // UFCO低电平超时事件计数
if( UFCO_OutOfCtrlTimCNT >= UFCO_OutOfCtrlTimMAX )
{ // 达到5次认为失控.
UFCO_OutOfCtrlEVT = 1; // 置位失控事件标记.
UFCO_OutOfCtrlTimCNT = 0;
}
UFCO_01SecTimCNT = 0; // 100mS计时器复位;不断复位使其不超时!!!
UFCO_01SecTimCntEN = 1; // 100mS计时器计时使能.
}
}
}
if( UFCO_01SecTimCntEN )
{
UFCO_01SecTimCNT++;
if( UFCO_01SecTimCNT >= 160 ) // 100毫秒计时超时.
{
UFCO_OutOfCtrlTimCNT = 0; // 100毫秒内没有出现另1个超过5.5毫秒的低电平.
UFCO_01SecTimCntEN = 0; // 本次100毫秒超时计时任务结束.
}
}
} // End of 失控检测功能.
/*****************************************************************
*** 失步检测
*****************************************************************/
/*
#define IFCO_LowLevlTimMAX 5 // 2秒内允许IFCO最多出现低电平次数为5次
uint8 xdata IFCO_LowLevlTimCNT = 0; // IFCO出现低电平次数
uint16 xdata IFCO_2SecTimCNT = 0; // 3200 * 0.625uS = 2S
uint16 xdata IFCO_07SecTimCNT = 0; // 1120 * 0.625uS = 0.7S
IFCO_LastVal
IFCO_CurrVal
IFCO_2SecTimCntEN //
IFCO_07SecTimCntEN //
IFCO_OutOfSyncEVT //
IFCO_FallEdgeEVT // 单次检测的首个IFCO下降沿“1”to“0”
*/
if( OutOfSyncMoniEN == 1 ) // 失步检测功能是否使能
{
IFCO_LowLevlTimCNT++; // Increase 1 Every 625uS.
IFCO_LastVal = IFCO_CurrVal; // IFCO为过零比较.
IFCO_CurrVal = ~IFCO; // 比较器倒相!!!硬件设计错误.
if( IFCO_CurrVal != IFCO_LastVal )
{
if( IFCO_CurrVal == 0 ) // IFCO下降沿.
{
if( IFCO_FallEdgeEVT == 0 ) //
{
IFCO_2SecTimCntEN = 1; // 在IFCO下降沿使能2秒计时器
IFCO_FallEdgeEVT = 1; // 置位IFCO下降沿事件标记
IFCO_LowLevlTimCNT = 1; // IFCO下降沿计数加“1”
}
else
{
IFCO_LowLevlTimCNT++;
if( IFCO_LowLevlTimCNT >= IFCO_LowLevlTimMAX )
{
IFCO_LowLevlTimCNT = 0; // 2秒内IFCO没有出现5个过“零”点波形.
IFCO_2SecTimCntEN = 0; // 本次2秒超时计时任务结束.
IFCO_07SecTimCNT = 0; // 复位0.7秒IFCO“负”波形检测计时
IFCO_07SecTimCntEN = 0; // 本次0.7秒IFCO“负”波形检测计时任务结束.
IFCO_FallEdgeEVT = 0; // 复位首个IFCO下降沿标记
IFCO_OutOfSyncEVT = 1; // IFCO在2秒内出现5个“负”波形.
}
}
IFCO_07SecTimCntEN = 1; // 在IFCO下降沿使能0.7秒计时器
}
else // IFCO上升沿复位0.7秒IFCO“负”波形检测计时.
{
IFCO_07SecTimCNT = 0; // 复位0.7秒IFCO“负”波形检测计时
IFCO_07SecTimCntEN = 0; // 本次0.7秒IFCO“负”波形检测计时任务结束.
}
}
if( IFCO_2SecTimCntEN ) // 2秒计时超时计时
{
IFCO_2SecTimCNT++;
if( IFCO_2SecTimCNT >= 3200 ) // 2秒计时超时;3200 * 0.625uS = 2S
{
IFCO_07SecTimCNT = 0; //
IFCO_07SecTimCntEN = 0; // 本次0.7秒超时计时任务结束.
IFCO_FallEdgeEVT = 0; // 复位首个IFCO下降沿标记
IFCO_LowLevlTimCNT = 0; // 复位IFCO过“零”点计数器.
IFCO_2SecTimCntEN = 0; // 本次2秒计时任务结束.
}
}
if( IFCO_07SecTimCntEN ) // 0.7秒计时超时计时
{
IFCO_07SecTimCNT++;
if( IFCO_07SecTimCNT >= 1120 ) // 0.7秒计时超时;1120 * 0.625uS = 0.7S
{
IFCO_07SecTimCNT = 0; //
IFCO_07SecTimCntEN = 0; // 本次0.7秒超时计时任务结束.
IFCO_OutOfSyncEVT = 1; // IFCO出现超过0.7秒的“负”波形.
}
}
} // End of 失步检测功能.
}
/*****************************************************************
*** TIMER 0 SLOT 1
*** (1)ModBUS(串口0)通讯数据收发;
*** (2)功率因数电流环测量;
*****************************************************************/
if( TimSlotCNT == 1 ) // ModBUS(串口0)通讯数据收发.
{
SFRPAGE = UART0_PAGE;
if( TI0 ) // TX Over.
{
TI0 = 0; // Clear the UART0 Interrupt Flag.
if( UART0_TX_CNT < UART0_TX_NUM ) // Current Frame Send OVER ?
{
SBUF0 = *( TxDATA + UART0_TX_CNT );
UART0_TX_CNT++;
}
else
{
RS485_FramIntvlCNT++;
if( RS485_FramIntvlCNT >= 10 )
RS485_FramIntvlCNT = 10;
}
}
if( RI0 )
{
}
/*****************************************************************
*** (1)键盘扫描;
*** (2)CanBUS数据收发;
*****************************************************************/
if( TimSlotCNT == 2 )
{
/*****************************************************************
*** 键盘扫描程序,记录键的按下、释放和按下的时间长度.
*****************************************************************/
KeyScanIntvlCNT++;
if( KeyScanIntvlCNT >= KeyScanPeriod ) // Key Scan Interval: 0.625 * 20 = 12.5mS.
{
/***KEY0******************************************************/
if( KEY0 == 0 ) // Begin of Menu Key.
{ // KEY0: Menu Key.
MenuKeyPresCNT++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -