/******************************************************************************************
|
--------------------------------file information-------------------------------------------
|
** The Name of File : RelayControl.c
|
** The Date of Last Modified: 2012-05-09
|
** Created By : WinTer Lee
|
** The Version : Original Version
|
** Descriptions : Control the Relays by RS485.
|
******************************************************************************************/
|
#include "RelayContorl.h"
|
#include "Define.h"
|
#include "NRF905_Driver.h"
|
#include "M64ADC_Driver.h"
|
#include <avr/wdt.h>
|
#include "Buzzer_Driver.h"
|
#include "CRC16.h"
|
//debug
|
#include"TFT_Driver.h"
|
|
|
|
|
extern FBO_Data GB_FBO_Data;
|
//
|
static unsigned int StepOutValue = 0;
|
|
static unsigned char CMDinf = 0;//ÃüÁîÐÅÏ¢
|
|
static unsigned long TimeUP = 0;
|
|
static unsigned char CommError = 1;//ÉϵçΪͨÐÅÒì³£
|
//
|
RFData m_SendCommData,m_RecCommData; //RFdataÐÍÊý¾Ý
|
|
|
|
void SetCommError(unsigned char err)
|
{
|
CommError = err;
|
}
|
|
unsigned char GetCommError(void)
|
{
|
//CommError = 0;
|
return CommError;
|
}
|
|
//---if it is low,the voltage is not divided,lower than 65v---
|
unsigned int GetStepOut(void)
|
{
|
unsigned int CRC = 0;
|
unsigned int cmd = 0;
|
|
TimeUP++;
|
CommWithRelays(CMD_StepOut,&m_SendCommData,&m_RecCommData);
|
//
|
//----------------------------------------------------------
|
if(TimeUP >= 5) //ͨÐų¬Ê±0.5S.
|
{
|
SetCommError(1); //ÖÃλ´íÎó±ê־λ
|
TimeUP = 0;
|
}
|
//----------------------------------------------------------
|
//
|
CRC = m_RecCommData.CRC;
|
cmd = m_RecCommData.CMD;
|
|
//
|
if((CRC != CalCRC16(&m_RecCommData, sizeof(RFData)-2))||(cmd != 0xF1))
|
{
|
return StepOutValue;
|
}
|
//
|
TimeUP = 0;
|
|
SetCommError(0); //ͨÐÅÕý³£
|
|
StepOutValue = m_RecCommData.VolData[1];
|
|
return StepOutValue;
|
}
|
void SetCMDenable(unsigned char cmd)
|
{
|
CMDinf = cmd;
|
}
|
|
unsigned char GetCMDinf(void)
|
{
|
return CMDinf;
|
}
|
|
//------------------ÓÃÓÚ´«Ë͵çѹµÄº¯Êý---------------------
|
void SendVoltage(void)
|
{
|
unsigned int CRC = 0;
|
m_SendCommData.VolData[0] = GetInnerSumVol();//GB_FBO_Data.SumVoltage; //´«ËÍ×é¶Ëµçѹ
|
|
SetCMDenable(0xAB);
|
CommWithRelays(CMD_Vol,&m_SendCommData,&m_RecCommData);
|
|
CRC = CalCRC16(&m_RecCommData, sizeof(RFData)-2);
|
if(CRC != m_RecCommData.CRC)
|
{
|
return;
|
}
|
|
if(m_RecCommData.VolData[2] == 0xE3)
|
{
|
SetCMDenable(0);
|
}
|
|
}
|
//----------------------ÓÃÓÚ·¢ËÍÍ£Ö¹ÐźÅ-------------------------
|
void SendStopCMD(void)
|
{
|
unsigned int CRC = 0;
|
|
SetCMDenable(0xCD);
|
CommWithRelays(CMD_ST,&m_SendCommData,&m_RecCommData);
|
|
CRC = CalCRC16(&m_RecCommData, sizeof(RFData)-2);
|
if(CRC != m_RecCommData.CRC)
|
{
|
return;
|
}
|
|
if(m_RecCommData.VolData[3] == 0xE4)
|
{
|
SetCMDenable(0);
|
}
|
|
}
|
|
//-----------the function:Get StepOut or Send voltage----------------
|
void CommWithRelays(const unsigned int CMD,void *TXData,void *RXData)
|
{
|
unsigned char *pTXdata = (unsigned char *)TXData;
|
unsigned char *pRXdata = (unsigned char *)RXData;
|
unsigned char SlaveADDR[4] = {0xAB,0xCD,0xEE,0xF1}; //0xF1Ϊ¼ÌµçÆ÷°åµØÖ·
|
for(unsigned char t=0; t<4; t++)
|
{
|
*pTXdata++ = SlaveADDR[t];
|
}
|
pTXdata = (unsigned char *)TXData;
|
((RFData*)TXData)->CMD=CMD;
|
((RFData*)TXData)->CRC = CalCRC16(TXData, sizeof(RFData)-2);//CRCУÑé
|
|
//
|
Max485SPI_CS_0; //¿ªÊ¼Æ¬Ñ¡
|
for(unsigned char t=0; t<4; t++) //·¢ËÍͬ²½Âë
|
{
|
SpiWrite(0xAA);
|
}
|
for(unsigned char t=0; t<sizeof(RFData); t++) //·¢ËÍÊý¾Ý
|
{
|
SpiWrite(*pTXdata++);
|
}
|
|
_delay_ms(10); //ÑÓʱ10ms
|
|
for(unsigned char t=0; t<sizeof(RFData); t++) //½ÓÊÕÊý¾Ý
|
{
|
*pRXdata++ = SpiRead();
|
_delay_us(10);
|
}
|
|
Max485SPI_CS_1; //½áÊøÆ¬Ñ¡
|
}
|
|
|
void ControlRelays(void)
|
{
|
if(GetCMDinf() == 0)
|
return;
|
//
|
static unsigned int i = 0;
|
i++;
|
if(i != 48)
|
return;
|
else
|
i = 0;
|
if(GetCMDinf() == 0xAB)
|
{
|
SendVoltage();
|
}
|
else if(GetCMDinf() == 0xCD)
|
{
|
SendStopCMD();
|
}
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------
|
//----------------------------sth addition------------------------------
|
/*
|
void ProcessHostData(void)
|
{
|
unsigned int crc=0;
|
static unsigned int current = 0;
|
static unsigned int settedcurrent = 0;
|
|
|
//--------- ¼ì²âÊÇ·ñͨÐų¬Ê± ----------------
|
CommTimeUpCount++;
|
|
if(CommTimeUpCount > 5)
|
{
|
CommTimeUpCount = 0;
|
COMM_State = SlaveCOMMNO;
|
if(SPWorkState == ST_working)
|
{
|
CloseDisChargePower(Stopped);
|
SPWorkState = ST_stop;
|
}
|
}
|
//----------------------------------------------------------------------------------------
|
|
crc = m_DataFromHost.CRC;
|
m_DataFromHost.CRC = 0;
|
|
if((crc != CalCRC16(&m_DataFromHost, sizeof(RFData)-2)) || (m_DataFromHost.Addr[3] != 0xF1))
|
{
|
return;
|
}
|
//-----------------------------------------------------------------------------------------
|
//
|
COMM_State = SlaveCOMMYES;//CRCУÑé¼ÓµØÖ·Ð£Ñ飬ͨÐųɹ¦¡£
|
CommTimeUpCount = 0;
|
}
|
*/
|