📄 err.c
字号:
/*****************************************************************
* 文件名: Err.c
* 版本号:
* 创作日期: 2005.7.13
* 作者: Zhoujie
* 功能说明: 故障检测与故障处理
* 其它说明:
*****************************************************************/
/*****************************************************************
* 修改日期:
* 修改人:
* 修改原因:
*******************************************************************/
#include "Err.h"
// 检测以及处理故障函数
// 依次检测是否出现各种故障
// 按照检测到的先后顺序
// 控制LED 灯显示最先检测到的故障
// 随后检测到的故障将相应的错误位置起来
// 怎样清除故障显示 ?
void det_err(void)
{
byte sign;
if (g_Err_Det_Disable)
return;
sign = 1;
if (det_err_over_flow())
{
RED_ON();
GREEN_OFF();
sign = 0;
g_Err_Det_Disable = 1;
}
if ( (det_err_inver_protect()) && sign )
{
led_flicker(1,2);
GREEN_OFF();
sign = 0;
g_Err_Det_Disable = 1;
}
if ((det_err_low_vol()) && sign )
{
led_flicker(1,3);
GREEN_OFF();
sign = 0;
g_Err_Det_Disable = 1;
}
if (( det_err_no_stop_needle()) && sign)
{
led_flicker(1,4);
GREEN_OFF();
sign = 0;
g_Err_Det_Disable = 1;
}
if ((det_err_over_vol()) && sign )
{
led_flicker(1,5);
GREEN_OFF();
sign = 0;
g_Err_Det_Disable = 1;
}
if ((det_err_solenoid_short()) && sign )
{
RED_ON();
led_flicker(0,1);
sign = 0;
g_Err_Det_Disable = 1;
}
if ((det_err_syn_encoder()) && sign )
{
RED_ON();
led_flicker(0,2);
sign = 0;
g_Err_Det_Disable = 1;
}
if ((det_err_motor_block()) && sign )
{
RED_ON();
led_flicker(0,3);
sign = 0;
g_Err_Det_Disable = 1;
}
if (det_err_motor_hall() && sign)
{
RED_ON();
led_flicker(0,4);
g_Err_Det_Disable = 1;
}
}
// 硬件过流检测
// 需要A/D 模块控制当母线电流大于20A,FO_MCU由低电平转到高电平
byte det_err_over_flow(void)
{
if ( FO_MCU() != 0 )
{
g_ErrCode01 |= 0x01;
return 1;
}
else
return 0;
}
// 反转保护检测
// 当电机反转180度机械角,REV_MCU由高电平转到低电平;
byte det_err_inver_protect(void)
{
if ( ( REV_MCU() == 0 ) && (g_MotorRun) )
{
g_ErrCode01 |= 0x02;
return 1;
}
else
return 0;
}
// 欠压检测
// 在定时器中断服务函数中检测
byte det_err_low_vol(void)
{
if (g_LowVol)
{
g_ErrCode01 |= 0x04;
return 1;
}
else
return 0;
}
// 无停针信号检测
// 需要提供连续45次FG_MCU中断而下停针信号未监测到1次,
// 或者连续45次FG_MCU中断而上停针信号未监测到1次
// 的开关量g_NostopNeedle
byte det_err_no_stop_needle(void)
{
if (g_NostopNeedle)
{
g_ErrCode01 |= 0x08;
return 1;
}
else
return 0;
}
// 过压检测
// 在定时器中断服务函数中检测
byte det_err_over_vol(void)
{
if (g_OverVol)
{
g_ErrCode01 |= 0x10;
return 1;
}
else
return 0;
}
// 电磁阀驱动回路过流短路故障检测
// 需提供电磁阀驱动回路电流大于200mA
// T_Fault 由高电平转到低电平
byte det_err_solenoid_short(void)
{
if (T_Fault() == 0)
{
g_ErrCode01 |= 0x20;
return 1;
}
else
return 0;
}
// 同步编码器故障检测
// 需在连续12次FG_MCU中断而同步编码信号未监测到1次
// 置起变量 g_SynEncoderErr
byte det_err_syn_encoder(void)
{
if (g_SynEncoderErr )
{
g_ErrCode01 |= 0x40;
return 1;
}
else
return 0;
}
// 电机堵转检测
// 在定时器中断服务函数中检测
byte det_err_motor_block(void)
{
if (g_MotorBlock)
{
g_ErrCode01 |= 0x80;
return 1;
}
else
return 0;
}
// 电机HALL信号故障检测
// 需在连续10次上停针中断而FG_MCU中断信号未监测到1次
// 置起 标志g_HallErr
byte det_err_motor_hall(void)
{
if (g_HallErr)
{
g_ErrCode02 |= 0x01;
return 1;
}
else
return 0;
}
#if 0
// 硬件过流处理
// 红灯LED长亮,绿灯熄灭
void deal_err_over_flow(void)
{
RED_ON();
GREEN_OFF();
}
// 反转保护检测
// 红灯LED闪烁2下,绿灯熄灭
void deal_err_inver_protect(void)
{
led_flicker(1,2);
GREEN_OFF();
}
// 欠压检测
// 红灯LED闪烁3下,绿灯熄灭
void deal_err_low_vol(void)
{
led_flicker(1,3);
GREEN_OFF();
}
// 无停针信号检测
// 红灯LED闪烁4下,绿灯熄灭
void deal_err_no_stop_needle(void)
{
led_flicker(1,4);
GREEN_OFF();
}
// 过压检测
// 红灯LED闪烁5下,绿灯熄灭
void deal_err_over_vol(void)
{
led_flicker(1,5);
GREEN_OFF();
}
// 电磁阀驱动回路过流短路故障检测
// 红灯LED长亮,绿灯闪烁1下
void deal_err_solenoid_short(void)
{
RED_ON();
led_flicker(0,1);
}
// 同步编码器故障检测
// 红灯LED长亮,绿灯闪烁2下
void deal_err_syn_encoder(void)
{
RED_ON();
led_flicker(0,2);
}
// 电机堵转检测
// 红灯LED长亮,绿灯闪烁3下
void deal_err_motor_block(void)
{
RED_ON();
led_flicker(0,3);
}
// 电机HALL信号故障检测
// 红灯LED长亮,绿灯闪烁4下
void deal_err_motor_hall(void)
{
RED_ON();
led_flicker(0,4);
}
#endif
/****************************************************
控制LED 灯闪烁函数
参数type : 1 表示控制红灯 0 表示控制绿灯
参数times : 闪烁的次数
*****************************************************/
void led_flicker(byte type,byte times)
{
g_LedTimesT1 = 0;
g_LedTimesT2 = 0;
g_LedTimesT3 = 0;
g_LedType = type;
g_LedTimes = times;
g_LedTimesCnt = times;
g_StartLedFlick = 1;
}
// 电磁铁控制函数
// 参数 target : 电磁铁序号1~3
// 参数 ctrl : 1 启动 0 停止
void electromagne_ctrl(byte target ,byte ctrl)
{
switch (target)
{
case 1:
if (ctrl)
{
E_MAG1_ON();
}
else
{
E_MAG1_OFF();
}
break;
case 2:
if (ctrl)
{
E_MAG2_ON();
}
else
{
E_MAG2_OFF();
}
break;
case 3:
if (ctrl)
{
E_MAG3_ON();
}
else
{
E_MAG3_OFF();
}
break;
default:
break;
}
}
// 10 ms 中断 一次
// 需要提供低于220V 的信号g_singleLowVol
// 高于400V 的信号g_singleOverVol
// 电机正在运行标志g_MotorRun
// 电机速度小于10 RPM 标志g_LowSpeed
void timer1_ovf_isr_(void)
{
if (!g_MotorRun)
{
if (g_SingleLowVol)
{
g_Lower220VCnt ++;
}
else
{
g_Over220VCnt ++;
}
if (g_Lower220VCnt + g_Over220VCnt > 300)
{
if (g_Lower220VCnt > g_Over220VCnt)
{
g_LowVol = 1;
}
else
{
g_LowVol = 0;
}
g_Lower220VCnt = 0;
g_Over220VCnt = 0;
}
g_LowSpeedCnt = 0;
}
else
{
g_Lower220VCnt = 0;
g_Over220VCnt = 0;
if (g_LowSpeed)
{
g_LowSpeedCnt ++;
}
else
{
g_LowSpeedCnt = 0;
}
if (g_LowSpeedCnt > 200)
{
g_MotorBlock = 1;
g_LowSpeedCnt = 0;
}
}
if (g_SingleOverVol)
{
g_Lower400VCnt ++;
}
else
{
g_Over400VCnt ++;
}
if (g_Lower400VCnt + g_Over400VCnt > 300)
{
if (g_Lower400VCnt >= g_Over400VCnt)
{
g_OverVol = 1;
}
else
{
g_OverVol = 0;
}
g_Lower400VCnt = 0;
g_Over400VCnt = 0;
}
if (g_StartLedFlick)
{
if (g_LedTimesCnt)
{
if (g_LedTimesT1 < LEDFLICKTIME1)
{
if (g_LedType)
{
RED_ON();
}
else
{
GREEN_ON();
}
g_LedTimesT1 ++;
}
else
{
if (g_LedType)
{
RED_OFF();
}
else
{
GREEN_OFF();
}
g_LedTimesT2 ++;
if (g_LedTimesT2 == LEDFLICKTIME2)
{
g_LedTimesT2 = 0;
g_LedTimesT1 = 0;
g_LedTimesCnt--;
}
}
}
if (g_LedTimesCnt == 0)
{
g_LedTimesT3 ++;
if (g_LedTimesT3 == LEDFLICKTIME3)
{
g_LedTimesT3 = 0;
g_LedTimesCnt = g_LedTimes;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -