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

📄 user_interface.c

📁 用于motor控制的dispic实现
💻 C
📖 第 1 页 / 共 3 页
字号:
{
	static unsigned char initializing_timer=20;
	static unsigned char previous_valid_switch_states=0xFF;
	static unsigned char key_hold_timer=0;
	static unsigned int param_increment=1;

	if (initializing_timer==1)	run_state=STANDBY;
	if (initializing_timer) initializing_timer--;

	if ((previous_valid_switch_states==valid_switch_states) \
		&& (interface_flags.EDIT_MENU==FALSE))	
	{
		previous_valid_switch_states=valid_switch_states;
		return;
	}

	if (((previous_valid_switch_states & 0x01)==FALSE) && (valid_switch_states & 0x01))
		interface_flags.S4_RISING=TRUE;
	else
		interface_flags.S4_RISING=FALSE;

	if (((previous_valid_switch_states & 0x02)==FALSE) && (valid_switch_states & 0x02))
		interface_flags.S5_RISING=TRUE;
	else
		interface_flags.S5_RISING=FALSE;

	if (((previous_valid_switch_states & 0x04)==FALSE) && (valid_switch_states & 0x04))
		interface_flags.S6_RISING=TRUE;
	else
		interface_flags.S6_RISING=FALSE;

	if (((previous_valid_switch_states & 0x08)==FALSE) && (valid_switch_states & 0x08))
		interface_flags.S7_RISING=TRUE;
	else
		interface_flags.S7_RISING=FALSE;

	previous_valid_switch_states=valid_switch_states;

	if ((interface_flags.EDIT_MENU==TRUE) && \
		 (interface_flags.EDIT_PARAM==FALSE))
	{
		if (interface_flags.S5_RISING)
		{
			if (param<(NO_PARAMETERS-1))	param++;
			else				param=0;
		}
		if (interface_flags.S4_RISING)
		{
			if (param>0)	param--;
			else				param=(NO_PARAMETERS-1);
		}
		if (interface_flags.S6_RISING)	
		{
			interface_flags.EDIT_PARAM=TRUE;
			new_param_value=user_parameters[param];
		}
		if (interface_flags.S7_RISING)	interface_flags.EDIT_MENU=FALSE;
		return;
	}
	if (interface_flags.EDIT_PARAM)
	{
		if (key_hold_timer > FAST_RATE_T)	param_increment=parameter_data[param].fast;
		else
		{
			if (key_hold_timer > MED_RATE_T) param_increment=parameter_data[param].med;
			else	param_increment=1;
		}

		if (valid_switch_states & 0x02)
		{
			if (new_param_value < (parameter_data[param].max - param_increment))
				new_param_value+=param_increment;
			else
				new_param_value=parameter_data[param].max;

			if (key_hold_timer<255)	key_hold_timer++;
		}

		if (valid_switch_states & 0x01)
		{
			if (new_param_value > (parameter_data[param].min + param_increment))
				new_param_value-=param_increment;
			else
				new_param_value=parameter_data[param].min;

			if (key_hold_timer<255)	key_hold_timer++;
		}
		if ((!(valid_switch_states & 0x01)) && (!(valid_switch_states & 0x02)))
		{
			key_hold_timer=0;
			interface_flags.PARAM_CHANGING=FALSE;
		}
		else	interface_flags.PARAM_CHANGING=TRUE;

		if (interface_flags.S6_RISING)
		{
			save_parameter();
			process_parameters();
			param_increment=1;
			interface_flags.EDIT_PARAM=FALSE;
		}
		if (interface_flags.S7_RISING)	
		{
			param_increment=1;
			interface_flags.EDIT_PARAM=FALSE;
		}
		return;
	}

	switch(run_state)
	{
		case INITIALIZING: break;

		case STANDBY:	if (interface_flags.S7_RISING)
							{
								DISABLE_INTERRUPTS;
								control_flags2.ROTATION_CHECK=TRUE;
								control_flags2.WINDMILLING=FALSE;
								control_flags2.RETRY_FLAG=FALSE;
								control_flags.LOCK1=FALSE;
								control_flags.LOCK2=FALSE;
								control_flags.RAMP=FALSE;
								control_flags.SENSORLESS=FALSE;
								control_flags.ACQUIRE2=FALSE;
								control_flags.ACQUIRE1=FALSE;
								control_flags.DIR=user_parameters[0];
								ENABLE_INTERRUPTS;
								run_state=STARTING;
								interface_flags.EDIT_MENU=FALSE;
								interface_flags.RUN_FRAME=0;
							}
							if (interface_flags.S4_RISING)
								interface_flags.EDIT_MENU=TRUE;
							break;

		case STARTING:	if (interface_flags.S7_RISING)
							{
								DISABLE_FIRING;
								control_flags.SENSORLESS=FALSE;
								control_flags.ACQUIRE2=FALSE;
								IEC0bits.T1IE=FALSE;
								IEC0bits.T2IE=FALSE;
								run_state=STANDBY;
							}
							break;

		case RUNNING: 	if (interface_flags.S7_RISING)
							{
								DISABLE_FIRING;
								control_flags.SENSORLESS=FALSE;
								control_flags.ACQUIRE2=FALSE;
								IEC0bits.T1IE=FALSE;
								IEC0bits.T2IE=FALSE;
								run_state=STANDBY;
							}
							if (interface_flags.S4_RISING)
								interface_flags.RUN_FRAME= !interface_flags.RUN_FRAME;
							break;
		case FAULT:		if (interface_flags.S7_RISING)
							{
								trip_state=NO_TRIP;
								DISABLE_INTERRUPTS;
								control_flags.LOCK1=FALSE;
								control_flags.LOCK2=FALSE;
								control_flags.RAMP=FALSE;
								control_flags.SENSORLESS=FALSE;
								control_flags.ACQUIRE1=FALSE;
								control_flags.ACQUIRE2=FALSE;
								IEC0bits.T1IE=FALSE;
								IEC0bits.T2IE=FALSE;
								ENABLE_INTERRUPTS;
								period_measurement=1000;
								FAULT_RESET=TRUE;
								Write_Screen(&line1_reset_message[0],&line2_reset_message[0]);
								FAULT_RESET=FALSE;
								run_state=STANDBY;
							}
							if (interface_flags.S4_RISING)
								interface_flags.EDIT_MENU=TRUE;
							break;
		default:			break;
	}

	return;
}

void save_parameter(void)
{
	unsigned char i,j;

	// Disable interrupts to ensure the erase and write
	// sequence are not disturbed as otherwise they may
	// not execute correctly.

	DISABLE_INTERRUPTS;
	// Calculate the block index offset to be written
	i = param & 0xE0;
	
	// Take a copy of the user parameter block to be written to
	for (j=0;j<32;j++)	parameter_mirror[j]=user_parameters[i+j];

	// Insert the new value
	parameter_mirror[(param & 0x1F)]=new_param_value;

	// Erase the 32 location row of flash
	erase_flash_row((unsigned int)&user_parameters[i]);
	
	// Write the 32 parameters back 
	program_flash((unsigned int)&user_parameters[i],(unsigned int)&parameter_mirror[0]);


	ENABLE_INTERRUPTS;

	return;

}
// This function does the necessary calculations when a parameter
// value changes. Some parameters values are used directly, others
// form the basis for other variables but these need to be calculated.
void process_parameters(void)
{
	unsigned long ltemp,ltemp2;

	// If a value is missing from this switch statement this implies the
	// user parameter is used directly.
	// Note that parameters that affect other variables should also be in
	// this list e.g.if Voltage scaling changes, voltage demand and trips
	// need to be recalculated.
	switch (param)
	{
		case 0:	control_flags.DIR=user_parameters[0];
					break;
		case 4:	// If using voltage control for starting
					if (user_parameters[40])
						hold1_demand=(unsigned int)((unsigned long)user_parameters[4])*FULL_DUTY/100;
					else //Using current control assume scaling is in % of trip
					{
						ltemp=((unsigned long)(current_trip-ibus_offset));
						ltemp*=((unsigned long)user_parameters[4]);
						hold1_demand=(unsigned int)(ltemp/100);
					}	
					break;
		case 5:	// If using voltage control for starting
					if (user_parameters[40])
						hold2_demand=(unsigned int)((unsigned long)user_parameters[5])*FULL_DUTY/100;
					else //Using current control assume scaling is in % of trip
					{
						ltemp=(unsigned long)(current_trip-ibus_offset);
						ltemp*=((unsigned long)user_parameters[5]);
						hold2_demand=(unsigned int)(ltemp/100);
					}	
					break;
		case 8:	// If using voltage control for starting
					if (user_parameters[40])
						ramp_start_demand=(unsigned int)((unsigned long)user_parameters[8])*FULL_DUTY/100;
					else //Using current control assume scaling is in % of trip
					{
						ltemp=(unsigned long)(current_trip-ibus_offset);
						ltemp*=((unsigned long)user_parameters[8]);
						ramp_start_demand=(unsigned int)(ltemp/100);
					}
					ramp_demand_delta=(signed int)(ramp_end_demand-ramp_start_demand);
					break;

		case 9:	// If using voltage control for starting
					if (user_parameters[40])
						ramp_end_demand=(unsigned int)((unsigned long)user_parameters[9])*FULL_DUTY/100;
					else //Using current control assume scaling is in % of trip
					{
						ltemp=(unsigned long)(current_trip-ibus_offset);
						ltemp*=((unsigned long)user_parameters[9]);
						ramp_end_demand=(unsigned int)(ltemp/100);
					}
					ramp_demand_delta=(signed int)(ramp_end_demand-ramp_start_demand);
					break;

					// ramp time is used to hold user_parameters[10] so that
					// it can be directly referenced in some inline assembly 
		case 10: ramp_time=user_parameters[10];
					break;
		case 17:	iloop_p_gain=(int)user_parameters[17];
					break;
		case 18: iloop_i_gain=(int)user_parameters[18];
					break;
		case 19: iloop_d_gain=(int)user_parameters[19];
					break;
		case 20:	wloop_p_gain=(int)user_parameters[20];
					break;
		case 21:	wloop_i_gain=(int)user_parameters[21];
					break;
		case 23:	vloop_p_gain=(int)user_parameters[23];
					break;
		case 24:	vloop_i_gain=(int)user_parameters[24];
					break;
		case 6:	
		case 7:
		case 25:
		case 44: // Calculate step rates in units of TIMER2 from 
					// user parameters in RPM ensuring no overflows occur
					ltemp=((unsigned long)user_parameters[6]*(unsigned long)user_parameters[25])/20;
					// This check ensures that ramp_start_rate is calculated with no overflow
					if ((COUNTER_RATE/ltemp) > 65535)
					{	
						ramp_start_rate=65535;
						ramp_start_speed=COUNTER_RATE*20/(65535*(unsigned long)user_parameters[25]);
					}
					else

⌨️ 快捷键说明

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