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

📄 user_interface.c

📁 dspic开发控制程序,有助开发pic单片机程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		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 = &parameter_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 = &parameter_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 = &parameter_data[Index].line_msg[0];
		SendMsg();
		SendTab();
		SendTab();
		TXPtr = &parameter_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 + -