📄 user_interface.c
字号:
case 26:
case 27:
//取ibus的值,首先假定ibus=0并以此值做偏移。
ibus_offset=ibus;
ltemp=((unsigned long)user_parameters[16])*ADC_GAIN;
ltemp*=((unsigned long)user_parameters[26]);
current_trip=(ltemp/(user_parameters[27]*10))+ibus_offset;
// 在CLOSED_CURRENT模式时,计算电流极限值
pos_current_limit=(long)(current_trip-ibus_offset)*95/100;
pos_current_limit*=16384L;
neg_current_limit=-1*pos_current_limit;
//用电流控制作为起始时,重新计算起始参数
if (user_parameters[40]==FALSE)
{
ltemp2=((unsigned long)(current_trip-ibus_offset));
ltemp=((unsigned long)user_parameters[4])*ltemp2;
hold1_demand=(unsigned int)(ltemp/100);
ltemp=((unsigned long)user_parameters[5])*ltemp2;
hold2_demand=(unsigned int)(ltemp/100);
ltemp=((unsigned long)user_parameters[8])*ltemp2;
ramp_start_demand=(unsigned int)(ltemp/100);
ltemp=((unsigned long)user_parameters[9])*ltemp2;
ramp_end_demand=(unsigned int)(ltemp/100);
ramp_demand_delta=(signed int)(ramp_end_demand-ramp_start_demand);
}
ltemp2=((unsigned long)(current_trip-ibus_offset));
ltemp=((unsigned long)user_parameters[41])*ltemp2;
windmilling_demand=(ltemp/100);
break;
case 15:
case 22:
case 28:
case 29: ltemp=((unsigned long)user_parameters[15])*ADC_GAIN;
ltemp*=((unsigned long)user_parameters[28]);
voltage_trip=ltemp/((unsigned long)user_parameters[29]*10);
ltemp=((unsigned long)user_parameters[22])*ADC_GAIN;
ltemp*=((unsigned long)user_parameters[28]);
voltage_demand=ltemp/((unsigned long)user_parameters[29]*10);
break;
case 30: upper_tol=100+user_parameters[30];
lower_tol=100-user_parameters[30];
break;
case 34:
//计算阀值,用于补偿电压偏移。
vph_red_threshold=vph_red+user_parameters[34];
vph_yellow_threshold=vph_yellow+user_parameters[34];
vph_blue_threshold=vph_blue+user_parameters[34];
break;
case 40: if (user_parameters[40])
{
hold1_demand=(unsigned int)((unsigned long)user_parameters[4])*FULL_DUTY/100;
hold2_demand=(unsigned int)((unsigned long)user_parameters[5])*FULL_DUTY/100;
ramp_start_demand=(unsigned int)((unsigned long)user_parameters[8])*FULL_DUTY/100;
ramp_end_demand=(unsigned int)((unsigned long)user_parameters[9])*FULL_DUTY/100;
}
else
{
ltemp2=((unsigned long)(current_trip-ibus_offset));
ltemp=((unsigned long)user_parameters[4])*ltemp2;
hold1_demand=(unsigned int)(ltemp/100);
ltemp=((unsigned long)user_parameters[5])*ltemp2;
hold2_demand=(unsigned int)(ltemp/100);
ltemp=((unsigned long)user_parameters[8])*ltemp2;
ramp_start_demand=(unsigned int)(ltemp/100);
ltemp=((unsigned long)user_parameters[9])*ltemp2;
ramp_end_demand=(unsigned int)(ltemp/100);
}
ramp_demand_delta=(int)(ramp_end_demand-ramp_start_demand);
break;
case 41: ltemp2=((unsigned long)(current_trip-ibus_offset));
ltemp=((unsigned long)user_parameters[41])*ltemp2;
windmilling_demand=(unsigned int)(ltemp/100);
break;
default: break;
}
return;
}
//按键抖动检测程序
void debounce_switches(void)
{
static unsigned char oldest_switch_states=0;
static unsigned char previous_switch_states=0;
unsigned char switch_states;
//switch_states=(unsigned char)((~PORTG)>>6);
if (!PORTCbits.RC14)
switch_states = 0x8;
else switch_states = 0x0;
if (switch_states!=previous_switch_states)
{
oldest_switch_states=previous_switch_states;
previous_switch_states=switch_states;
return;
}
if (previous_switch_states != oldest_switch_states)
{
oldest_switch_states=previous_switch_states;
previous_switch_states=switch_states;
}
else
{
valid_switch_states=switch_states;
oldest_switch_states=previous_switch_states;
previous_switch_states=switch_states;
}
return;
}
#ifdef DEVELOPMODE
//串口处理程序
void serial_handler(void)
{
if (control_flags2.Fault)
control_flags2.Fault = 0;
if (control_flags2.CheckRX)
{
CheckHelp();
if (!control_flags2.HelpMsg)
GetMsgIndex();
if (control_flags2.SendTX)
{
SendCRLF();
TXPtr = ¶meter_data[Index].line_msg[0];
SendMsg();
SendTab();
SendValue(user_parameters[Index]);
}
// 初始化指针指向第一个字符
if (control_flags2.ErrorMsg)
SendErrorMsg();
RXPtr = &InData[0];
SendCRLF();
control_flags2.SendTX = 0;
control_flags2.CheckRX = 0;
control_flags2.ErrorMsg = 0;
control_flags2.HelpMsg = 0;
}
}
//检查帮助命令子程序
void CheckHelp(void)
{
if (InData[0] == '?')
{
switch (InData[1])
{
case '?': SendHelpMsg();
break;
case 'M': SendMotorPara();
break;
case 'L': SendLimitPara();
break;
case 'C': SendControlPara();
break;
case 'S': SendStartingPara();
break;
case 'B': SendBoardPara();
break;
case 'R': SendRunMsg();
break;
case 'F': SendFaultMsg();
break;
default: SendErrorMsg();
}
}
}
//获取信息索引
void GetMsgIndex(void)
{
Index = 0;
control_flags2.SendTX = 0;
while (Index < MAXINDEX)
{
RXPtr = &InData[0];
TXPtr = ¶meter_data[Index].quick_msg[0];
while(1)
if (*RXPtr++ == *TXPtr++)
if (*RXPtr == 0x20 || *RXPtr == 0x0D)
break;
else ;
else
{control_flags2.NextIndex = 1; break;}
if (!control_flags2.NextIndex)
if (*RXPtr == 0x20)
{SaveValue();break;}
else
{control_flags2.SendTX = 1; break;}
else {control_flags2.NextIndex = 0;Index++;}
}
if (Index == MAXINDEX) control_flags2.ErrorMsg = 1;
else control_flags2.SendTX = 1;
}
//保存值
void SaveValue()
{
unsigned char Temp[6]={"000000"};
unsigned char i, l;
while (*RXPtr++ != CR);
*RXPtr--; l = 5;
while (*RXPtr != 0x20)
Temp[l--] = *RXPtr--;
user_parameters[Index] = atoi(Temp);
//处理变量
for (i=0;i<NO_PARAMETERS;i++)
{
param=i;
process_parameters();
}
// 返回起始菜单
param=0;
}
//发送HT
void SendTab(void)
{
while (U1STAbits.UTXBF);
U1TXREG = HT;
}
//发送CDLF
void SendCRLF(void)
{
while (U1STAbits.UTXBF);
U1TXREG = CR;
while (U1STAbits.UTXBF);
U1TXREG = LF;
}
//发送错误信息
void SendErrorMsg(void)
{
TXPtr = (unsigned char*)&ErrorMsg[0];
SendMsg();
control_flags2.ErrorMsg = 0;
}
//发送信息
void SendMsg(void)
{
while (*TXPtr)
{
while (U1STAbits.UTXBF);
U1TXREG = *TXPtr++;
}
}
//发送帮助信息
void SendHelpMsg(void)
{
Index = 0;
do
{
TXPtr = &HelpMsg_data[Index].line_msg[0];
SendMsg();
TXPtr = &HelpMsg_data[Index].quick_msg[0];
SendMsg();
SendCRLF();
}
while (++Index < MAXHELPMSG);
control_flags2.HelpMsg = 1;
}
//发送帮助信息
void SendHelpInfo(unsigned char Tab)
{
unsigned char i;
i=0;
Index = 0;
do
if (Index == help_info[Tab][i])
{
TXPtr = ¶meter_data[Index].line_msg[0];
SendMsg();
SendTab();
SendTab();
TXPtr = ¶meter_data[Index].quick_msg[0];
SendMsg();
SendTab();
SendTab();
SendValue(user_parameters[Index]);
SendCRLF();
i++;
}
while (++Index < MAXINDEX);
control_flags2.HelpMsg = 1;
}
//发送数值
void SendValue(unsigned int k)
{
//unsigned int k;
unsigned char c;
c = k/10000;
if (c > 0)
k = k - c*10000;
while (U1STAbits.UTXBF);
U1TXREG = (c + 0x30);
c = k/1000;
if (c > 0)
k = k - c*1000;
while (U1STAbits.UTXBF);
U1TXREG = (c + 0x30);
c = k/100;
if (c > 0)
k = k - c*100;
while (U1STAbits.UTXBF);
U1TXREG = (c + 0x30);
c = k/10;
if (c > 0)
k = k - c*10;
while (U1STAbits.UTXBF);
U1TXREG = (c + 0x30);
while (U1STAbits.UTXBF);
U1TXREG = (char)(k + 0x30);
}
//发送故障信息
void SendFaultMsg(void)
{
TXPtr = (unsigned char *)&FaultMessage[0];
SendMsg();
control_flags2.HelpMsg = 1;
}
//发送运行信息
void SendRunMsg(void)
{
TXPtr = (unsigned char *)&RunMessage[0];
SendMsg();
control_flags2.HelpMsg = 1;
}
//发送马达参数
void SendMotorPara(void)
{
TXPtr = (unsigned char *)&MotorParaHeader[0];
SendMsg();
SendHeader();
SendHelpInfo(MOTORPARA);
}
//发送极限参数
void SendLimitPara(void)
{
TXPtr = (unsigned char *)&LimitParaHeader[0];
SendMsg();
SendHeader();
SendHelpInfo(LIMITPARA);
}
//发送控制参数
void SendControlPara(void)
{
TXPtr = (unsigned char *)&ControlParaHeader[0];
SendMsg();
SendHeader();
SendHelpInfo(CONTROLPARA);
}
//发送起始参数
void SendStartingPara(void)
{
TXPtr = (unsigned char *)&StartingParaHeader[0];
SendMsg();
SendHeader();
SendHelpInfo(STARTINGPARA);
}
//发送板参数
void SendBoardPara(void)
{
TXPtr = (unsigned char *)&BoardParaHeader[0];
SendMsg();
SendHeader();
SendHelpInfo(BOARDPARA);
}
//发送头
void SendHeader(void)
{
TXPtr = (unsigned char *)&ParaHeader[0];
SendMsg();
}
//发送运行
void send_run(void)
{
unsigned int k;
k = PDC1 >> 1;
k = PTPER - k;
k = k*100;
k = k/PTPER;
TXPtr = (unsigned char *)&RunMsg1[0];
SendMsg();
SendValue(filtered_rpm);
SendTab();
TXPtr = (unsigned char *)&RunMsg2[0];
SendMsg();
SendValue(k);
while (U1STAbits.UTXBF);
U1TXREG = CR;
}
//发送错误
void send_fault(void)
{
if (!control_flags2.Fault)
{
control_flags2.Fault = 1;
SendCRLF();
TXPtr = (unsigned char *)&fault_data[trip_state].fault_msg[0];
SendMsg();
SendTab();
TXPtr = (unsigned char *)&fault_data[0].fault_msg[0];
SendMsg();
SendCRLF();
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -