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

📄 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;
	}
	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 + -