How to send float voltage data over CANBus?

88 Views Asked by At

I have 9 signals that are read by my GPIO pins and assigned to different variables. I want to read these voltages and send them over CANBus. I thougth about using 8-bit as its first 4 byte to be a counter (to indicate which signal it is) and the last to be the read voltage. But I am confused about the float values. I read some blogs they say use its resolution (Vh-Vl)/2^n and convert them into binary values. I tried something but I am kinda new in embedded programming so I couldn't make it clear in my head.

const float32 TEST_ADC_RES = (float32) (5.0 / 16.0); // defining ADC resolution of 4 bit test message of voltage read 

typedef struct
{ // defining my struct
uint32 untMsgCount;
uint32 untADCValue;
} tsTestMessage;

Controller_U.mkub_InArray_bdod.esi_InjCrntTiRaw_v = ((float32)g_ResultEQADCData[TE_ENJ1]) * ADC_RESOLUTION; //this is my first variable 
 signal_can_msg.untMsgCount = 1;
 signal_can_msg.untADCValue = (uint32)Controller_U.mkub_InArray_bdod.esi_InjCrntTiRaw_v / TEST_ADC_RES;
 transmitDTOMessage((uint8*)&signal_can_msg);

 Controller_U.mkub_InArray_bdod.esi_OilPump1CrntRaw_v = ((float32)g_ResultEQADCData[TE_EOP1]) * ADC_RESOLUTION; //second variable
 signal_can_msg.untMsgCount = 2;
 signal_can_msg.untADCValue = (uint32)Controller_U.mkub_InArray_bdod.esi_OilPump1CrntRaw_v / TEST_ADC_RES;
 transmitDTOMessage((uint8*)&signal_can_msg);
... //continues same for 9 variables.

transmitDTOMessage content:

void transmitDTOMessage(uint8* ptr_uchCCPMessageData)
{
uint8 uchDataIndex = 0;

for (uchDataIndex = 0; uchDataIndex < sizeof(s_sServiceTXBuffer.uchTXDataBuffer); uchDataIndex++)
{
s_sServiceTXBuffer.uchTXDataBuffer[uchDataIndex] = ptr_uchCCPMessageData[uchDataIndex];
}
  
// Determine transmit message length
s_sServiceTXBuffer.sBufferConfig.uchBufferIndex = sizeof(s_sServiceTXBuffer.uchTXDataBuffer);
transmitFlexCAN(&s_sServiceTXBuffer);   
}

Is anyone able to help me? Thanks in advance.

0

There are 0 best solutions below