⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 err._c

📁 平缝机的单片机伺服控制系统源代码。本程序为用单片机控制永磁同步电机的低成本方案
💻 _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;
	}
}

// 反转保护检测
// 当电机反转180度机械角,REV_MCU由高电平转到低电平;
byte det_err_inver_protect(void)
{
	if  ( ( REV_MCU() == 0 ) && (g_MotorRun) )
	{
		g_ErrCode01  |= 0x02;
		return 1;
	}
}

// 欠压检测
// 在定时器中断服务函数中检测
byte det_err_low_vol(void)
{
	if (g_LowVol)
	{
		g_ErrCode01  |= 0x04;
		return 1;
	}
}

// 无停针信号检测
// 需要提供连续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;
	}
}

// 过压检测
// 在定时器中断服务函数中检测
byte det_err_over_vol(void)
{
	if (g_OverVol)
	{
		g_ErrCode01  |= 0x10;
		return 1;
	}

}

// 电磁阀驱动回路过流短路故障检测
// 需提供电磁阀驱动回路电流大于200mA
// T_Fault 由高电平转到低电平
byte det_err_solenoid_short(void)
{
	if (T_Fault() == 0)
	{
		g_ErrCode01  |= 0x20;
		return 1;
	}

}

// 同步编码器故障检测
// 需在连续12次FG_MCU中断而同步编码信号未监测到1次
// 置起变量 g_SynEncoderErr
byte det_err_syn_encoder(void)
{
	if (g_SynEncoderErr )
	{
		g_ErrCode01  |= 0x40;
		return 1;
	}

}

// 电机堵转检测
// 在定时器中断服务函数中检测
byte det_err_motor_block(void)
{
	if (g_MotorBlock)
	{
		g_ErrCode01  |= 0x80;
		return 1;
	}

}

// 电机HALL信号故障检测
// 需在连续10次上停针中断而FG_MCU中断信号未监测到1次
// 置起 标志g_HallErr
byte det_err_motor_hall(void)
{
	if (g_HallErr)
	{
		g_ErrCode02  |= 0x01;
		return 1;
	}

}

#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;
	}

}









⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -