#include "ys32md211.h"
#include "adc.h"
#include "motor.h"
#include "KEY.h"
//********************************************************************//
// 过流过压欠压保护
//*********************************************************************//
void over_pretect_fun(void)
{
	  if(m_par_set.Motor_state==M_INIT)
		{
			AD_s.i_data=0;
			//return;
		}
		
    if(AD_s.i_data>Over_i)//过流关机
		{
//			  AD_s.over_i_inc++;
//			  if(AD_s.over_i_inc>10)
//		      m_par_set.Motor_state=0;
		}
		else
			AD_s.over_i_inc=0;
		
		if(AD_s.bat_data>=P_Over_VDD)//过压关机
		{
			  AD_s.over_vdd_inc++;
			  if(AD_s.over_vdd_inc>200)
				{
		      m_par_set.Motor_state=0;
					AD_s.bat_flag=1;
				}
		}
		else
			AD_s.over_vdd_inc=0;
		
		
		if(AD_s.bat_data<=P_LOW_VDD)//欠压关机
		{
			  AD_s.low_vdd_inc++;
			  if(AD_s.low_vdd_inc>200)
				{
		       m_par_set.Motor_state=0;
					 AD_s.bat_flag=1;
				}
		}
		else
			AD_s.low_vdd_inc=0;
		
		if((AD_s.bat_data>=NOR_REV_LOW_VDD)&&(AD_s.bat_data<=NOR_REV_OVRE_VDD))//REV LOW
		{
			  AD_s.REV_vdd_inc++;
			  if(AD_s.REV_vdd_inc>200)
				{
					AD_s.bat_flag=0;
				}
		}
		else
			AD_s.REV_vdd_inc=0;
		
	
}
//************************************************************************//
//   速度小于设置最小速度关机
//*************************************************************************//
uint8_t   t_20ms_inc;
uint16_t  G_speed_check[3];
uint8_t   G_speed_index;
void Locked_motor_process(void)
{
	  if(m_par_set.Motor_state!=M_RUN)
		  m_par_set.m_lock_time=0;
    m_par_set.m_lock_time++;  
		if(m_par_set.m_lock_time==LOCK_START_MIN_TIME)
			COMP12_InputHysteresisCmd(ENABLE);
    if(m_par_set.m_lock_time>=LOCK_START_MIN_TIME)	
		{
			  m_par_set.m_lock_time=LOCK_START_MIN_TIME+2;
			  
			  if(m_par_set.actual_speed<START_SPEED_MIN) //小于设置速度关机客户根据自己情况自行设定
				{
				    clr_key_state(); 
         //   if(m_par_set.Motor_state!=M_STOP)
	              m_par_set.Motor_state=0;					
				}
				if(m_par_set.m_lock_time>=LOCK_START_MAX_TIME)
				{
					 m_par_set.m_lock_time=LOCK_START_MAX_TIME;
		       t_20ms_inc++;
				   if(t_20ms_inc>=20)
				   {
				      t_20ms_inc=0;
						  if(G_speed_index<3)
							{
							   G_speed_check[G_speed_index]=m_par_set.com_common_time_60;
								 G_speed_index++;
							}
							else
							{
							   G_speed_check[0]=G_speed_check[1];  
							   G_speed_check[1]=G_speed_check[2];
								 G_speed_check[2]=m_par_set.com_common_time_60;
							}
						  
				   }
					 if(G_speed_index>2)
					 {
//					     speed_check_temp=G_speed_check[1]>>1;
//						   if(speed_check_temp>G_speed_check[0])
//								  m_par_set.Motor_state=0;
//							 speed_check_temp=G_speed_check[2]>>1;
//						   if(speed_check_temp>G_speed_check[1])
//								  m_par_set.Motor_state=0;
								 
					 }
					 
				}
				else
				{
					G_speed_index=0;
					t_20ms_inc=0;
				}
		}
		else
		{
		    t_20ms_inc=0;
		}
 // #endif
}
//*****************************************************//
//换相异常关机  比如缺相
//****************************************************//
void M_stall_process(void)
{
    if(m_par_set.m_lock_time<=LOCK_START_MIN_TIME)
		{
			 m_par_set.Abnor_time=0;
			 m_par_set.stall=0;
		   return;
		}
    m_par_set.Abnor_time++;
		if(m_par_set.Abnor_time>=800)
		{
			 m_par_set.Abnor_time=0;
		   if(m_par_set.stall>=COM_ERROR)   //换相异常关机
			 {
				  clr_key_state();
				 // if(m_par_set.Motor_state!=M_STOP)
	           m_par_set.Motor_state=0;
				  
			 }
			 m_par_set.stall=0;
		}
}

//********************************************************//
//
//
//
//*********************************************************//
void protect_process(void)
{
   Locked_motor_process();//堵转关机，一般不用//
	 M_stall_process();
	 #if(V_VDD_EN == 1)	
	   over_pretect_fun();
	 #endif

}