📄 user_interface.c
字号:
{
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)¶meter_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 + -