From 15cac319c4e2a78c728dfed2502061ed20c22138 Mon Sep 17 00:00:00 2001 From: Jiwoo Date: Sat, 30 Sep 2023 17:16:36 +0000 Subject: [PATCH 1/6] Added UpdateDisplay_SetRegen (UpdateDisplay) and editing Task_ReadTritium to get BackEMF --- Apps/Inc/UpdateDisplay.h | 7 +++++++ Apps/Src/ReadTritium.c | 9 +++++++-- Apps/Src/SendTritium.c | 2 +- Apps/Src/UpdateDisplay.c | 14 ++++++++++++++ Tests/Test_App_UpdateDisplay.c | 2 +- 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/Apps/Inc/UpdateDisplay.h b/Apps/Inc/UpdateDisplay.h index a2204518f..b1c806f0b 100644 --- a/Apps/Inc/UpdateDisplay.h +++ b/Apps/Inc/UpdateDisplay.h @@ -95,6 +95,13 @@ UpdateDisplayError_t UpdateDisplay_SetVelocity(uint32_t mphTenths); */ UpdateDisplayError_t UpdateDisplay_SetAccel(uint8_t percent); +/** + * @brief Sets the regeneration slider value on the display + * @param percent pressure on regenerator in percent + * @returns UpdateDisplayError_t + */ +UpdateDisplayError_t UpdateDisplay_SetRegen(uint8_t regPercent); + /** * @brief Sets the array indicator state on the display * @param state array contactor on (true) or off (false) diff --git a/Apps/Src/ReadTritium.c b/Apps/Src/ReadTritium.c index a9799bcbc..78f3b3270 100755 --- a/Apps/Src/ReadTritium.c +++ b/Apps/Src/ReadTritium.c @@ -17,8 +17,9 @@ uint16_t Motor_FaultBitmap = T_NONE; -static float Motor_RPM = CAR_STOPPED; //Car is stopped until velocity is read -static float Motor_Velocity = CAR_STOPPED; //^^^^ +static float Motor_RPM = CAR_STOPPED; //Car is stopped until velocity is read +static float Motor_Velocity = CAR_STOPPED; //^^^^ +static float BEMFq = CAR_STOPPED; //^^^^ /** * @brief Returns highest priority tritium error code @@ -87,9 +88,13 @@ void Task_ReadTritium(void *p_arg){ } case VELOCITY:{ + // Forward (Acceleration) memcpy(&Motor_RPM, &dataBuf.data[0], sizeof(float)); memcpy(&Motor_Velocity, &dataBuf.data[4], sizeof(float)); + // Backward (Regeneration) + memcpy(&BEMFq, &dataBuf.data[8], sizeof(float)); + //Motor RPM is in bytes 0-3 Motor_RPM = *((float*)(&dataBuf.data[0])); diff --git a/Apps/Src/SendTritium.c b/Apps/Src/SendTritium.c index f6610bb96..84ca9be36 100644 --- a/Apps/Src/SendTritium.c +++ b/Apps/Src/SendTritium.c @@ -646,7 +646,7 @@ void Task_SendTritium(void *p_arg){ state.stateHandler(); // do what the current state does #ifndef SENDTRITIUM_EXPOSE_VARS readInputs(); // read inputs from the system - UpdateDisplay_SetAccel(accelPedalPercent); + UpdateDisplay_SetRegenAccel(accelPedalPercent); #endif state.stateDecider(); // decide what the next state is diff --git a/Apps/Src/UpdateDisplay.c b/Apps/Src/UpdateDisplay.c index 1356491e2..b18721365 100644 --- a/Apps/Src/UpdateDisplay.c +++ b/Apps/Src/UpdateDisplay.c @@ -38,6 +38,7 @@ typedef enum{ // Non-boolean components VELOCITY, ACCEL_METER, + REGEN_METER, SOC, SUPP_BATT, CRUISE_ST, @@ -306,6 +307,19 @@ UpdateDisplayError_t UpdateDisplay_SetAccel(uint8_t percent){ return ret; } +UpdateDisplayError_t UpdateDisplay_SetRegen(uint8_t regPercent){ + static uint8_t lastPercentRegen = 0; + if(regPercent == lastPercentRegen){ + return UPDATEDISPLAY_ERR_NO_CHANGE; + } + + UpdateDisplayError_t ret = UpdateDisplay_SetComponent(REGEN_METER, regPercent); + assertUpdateDisplayError(ret); + + if(ret == UPDATEDISPLAY_ERR_NONE) lastPercentRegen = regPercent; + return ret; +} + UpdateDisplayError_t UpdateDisplay_SetArray(bool state){ static bool lastState = false; if(state == lastState){ diff --git a/Tests/Test_App_UpdateDisplay.c b/Tests/Test_App_UpdateDisplay.c index 072805e2b..7c0ed8612 100644 --- a/Tests/Test_App_UpdateDisplay.c +++ b/Tests/Test_App_UpdateDisplay.c @@ -124,7 +124,7 @@ void Task1(void *arg) OSTimeDlyHMSM(0, 0, 0, 200, OS_OPT_TIME_HMSM_STRICT, &e); - testPercentageComp(&UpdateDisplay_SetAccel); + testPercentageComp(&UpdateDisplay_SetRegenAccel); error = Display_Fault(OSErrLocBitmap, FaultBitmap); assertDisplayError(error); From 877ff990deb76f5cbe818b38bb5f47708de7c633 Mon Sep 17 00:00:00 2001 From: Jiwoo Date: Sat, 30 Sep 2023 19:52:09 +0000 Subject: [PATCH 2/6] Added MC_BUS and BACKEMF cases to ReadTritium --- Apps/Src/ReadTritium.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/Apps/Src/ReadTritium.c b/Apps/Src/ReadTritium.c index 78f3b3270..5ac872c5a 100755 --- a/Apps/Src/ReadTritium.c +++ b/Apps/Src/ReadTritium.c @@ -17,9 +17,11 @@ uint16_t Motor_FaultBitmap = T_NONE; -static float Motor_RPM = CAR_STOPPED; //Car is stopped until velocity is read +static float Motor_RPM = CAR_STOPPED; //Car is stopped until velocity is read static float Motor_Velocity = CAR_STOPPED; //^^^^ -static float BEMFq = CAR_STOPPED; //^^^^ +static float Back_EMF = CAR_STOPPED; //^^^^ +static float Bus_Current = CAR_STOPPED; //^^^^ +static float Bus_Voltage = CAR_STOPPED; //^^^^ /** * @brief Returns highest priority tritium error code @@ -88,13 +90,9 @@ void Task_ReadTritium(void *p_arg){ } case VELOCITY:{ - // Forward (Acceleration) memcpy(&Motor_RPM, &dataBuf.data[0], sizeof(float)); memcpy(&Motor_Velocity, &dataBuf.data[4], sizeof(float)); - // Backward (Regeneration) - memcpy(&BEMFq, &dataBuf.data[8], sizeof(float)); - //Motor RPM is in bytes 0-3 Motor_RPM = *((float*)(&dataBuf.data[0])); @@ -106,7 +104,24 @@ void Task_ReadTritium(void *p_arg){ Car_Velocity = ((Car_Velocity / 160934) * 10); //Converting from m/h to mph, multiplying by 10 to make value "larger" for displaying UpdateDisplay_SetVelocity(Car_Velocity); + } + + case MC_BUS:{ + memcpy(&Bus_Voltage, &dataBuf.data[0], sizeof(float)); + memcpy(&Bus_Current, &dataBuf.data[4], sizeof(float)); + + //Bus voltage is in bytes 0-4 + Bus_Voltage = *((float*)(&dataBuf.data[0])); + + //Bus Current is in bytes 0-4 + Bus_Current = *((float*)(&dataBuf.data[4])); + } + + case BACKEMF:{ + memcpy(&Back_EMF, &dataBuf.data[0], sizeof(float)); // BEMFq (The peak of the phase to neutral motor voltage) + //BackEMF is in bytes 0-4 + Back_EMF = *((float*)(&dataBuf.data[0])); } default:{ From 46713337f048e895f3c6365658854ab9a98094a0 Mon Sep 17 00:00:00 2001 From: Jiwoo Date: Sat, 30 Sep 2023 20:39:23 +0000 Subject: [PATCH 3/6] Multuply Back_EMF and Bus_Current to get Regen_Power. Scale float->uint32_t by multiplying by 100 --- Apps/Inc/UpdateDisplay.h | 2 +- Apps/Src/ReadTritium.c | 14 +++++++------- Apps/Src/UpdateDisplay.c | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Apps/Inc/UpdateDisplay.h b/Apps/Inc/UpdateDisplay.h index b1c806f0b..f12f631c0 100644 --- a/Apps/Inc/UpdateDisplay.h +++ b/Apps/Inc/UpdateDisplay.h @@ -100,7 +100,7 @@ UpdateDisplayError_t UpdateDisplay_SetAccel(uint8_t percent); * @param percent pressure on regenerator in percent * @returns UpdateDisplayError_t */ -UpdateDisplayError_t UpdateDisplay_SetRegen(uint8_t regPercent); +UpdateDisplayError_t UpdateDisplay_SetBackEMF(uint32_t emfPercent); /** * @brief Sets the array indicator state on the display diff --git a/Apps/Src/ReadTritium.c b/Apps/Src/ReadTritium.c index 5ac872c5a..09461e8f9 100755 --- a/Apps/Src/ReadTritium.c +++ b/Apps/Src/ReadTritium.c @@ -19,9 +19,9 @@ uint16_t Motor_FaultBitmap = T_NONE; static float Motor_RPM = CAR_STOPPED; //Car is stopped until velocity is read static float Motor_Velocity = CAR_STOPPED; //^^^^ -static float Back_EMF = CAR_STOPPED; //^^^^ -static float Bus_Current = CAR_STOPPED; //^^^^ -static float Bus_Voltage = CAR_STOPPED; //^^^^ +static float Back_EMF = 0; +static float Bus_Current = 0; +static float Bus_Voltage = 0; /** * @brief Returns highest priority tritium error code @@ -113,7 +113,7 @@ void Task_ReadTritium(void *p_arg){ //Bus voltage is in bytes 0-4 Bus_Voltage = *((float*)(&dataBuf.data[0])); - //Bus Current is in bytes 0-4 + //Bus Current is in bytes 4-8 Bus_Current = *((float*)(&dataBuf.data[4])); } @@ -122,15 +122,15 @@ void Task_ReadTritium(void *p_arg){ //BackEMF is in bytes 0-4 Back_EMF = *((float*)(&dataBuf.data[0])); + uint32_t Regen_Power = (Back_EMF * 100) * (Bus_Current * 100); // Fixed point factor (100) + + UpdateDisplay_SetBackEMF(Regen_Power); } default:{ break; //for cases not handled currently } - } - - } OSTimeDlyHMSM(0, 0, 0, 10, OS_OPT_TIME_HMSM_NON_STRICT, &err); diff --git a/Apps/Src/UpdateDisplay.c b/Apps/Src/UpdateDisplay.c index b18721365..407f6c94a 100644 --- a/Apps/Src/UpdateDisplay.c +++ b/Apps/Src/UpdateDisplay.c @@ -307,16 +307,16 @@ UpdateDisplayError_t UpdateDisplay_SetAccel(uint8_t percent){ return ret; } -UpdateDisplayError_t UpdateDisplay_SetRegen(uint8_t regPercent){ +UpdateDisplayError_t UpdateDisplay_SetBackEMF(uint32_t emfPercent){ static uint8_t lastPercentRegen = 0; - if(regPercent == lastPercentRegen){ + if(emfPercent == lastPercentRegen){ return UPDATEDISPLAY_ERR_NO_CHANGE; } - UpdateDisplayError_t ret = UpdateDisplay_SetComponent(REGEN_METER, regPercent); + UpdateDisplayError_t ret = UpdateDisplay_SetComponent(REGEN_METER, emfPercent); assertUpdateDisplayError(ret); - if(ret == UPDATEDISPLAY_ERR_NONE) lastPercentRegen = regPercent; + if(ret == UPDATEDISPLAY_ERR_NONE) lastPercentRegen = emfPercent; return ret; } From 403185d17a3a8750bf234c6d558f6b03bac19175 Mon Sep 17 00:00:00 2001 From: Jiwoo Date: Sat, 30 Sep 2023 20:42:55 +0000 Subject: [PATCH 4/6] Change name back to the correct version on SendTritium --- Apps/Src/SendTritium.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Apps/Src/SendTritium.c b/Apps/Src/SendTritium.c index 84ca9be36..f6610bb96 100644 --- a/Apps/Src/SendTritium.c +++ b/Apps/Src/SendTritium.c @@ -646,7 +646,7 @@ void Task_SendTritium(void *p_arg){ state.stateHandler(); // do what the current state does #ifndef SENDTRITIUM_EXPOSE_VARS readInputs(); // read inputs from the system - UpdateDisplay_SetRegenAccel(accelPedalPercent); + UpdateDisplay_SetAccel(accelPedalPercent); #endif state.stateDecider(); // decide what the next state is From 0230f34d910a67375e90c724ed93f1e9567a0e8f Mon Sep 17 00:00:00 2001 From: Jiwoo Date: Sat, 21 Oct 2023 20:30:27 +0000 Subject: [PATCH 5/6] ReadTritium.c: Added Forward power calculation. UpdateDisplay.c: Function that calls both forward and regen power display. --- Apps/Inc/UpdateDisplay.h | 21 ++++++-- Apps/Src/ReadTritium.c | 10 +++- Apps/Src/SendTritium.c | 2 +- Apps/Src/UpdateDisplay.c | 32 ++++++++++-- Tests/Test_App_DisplayRegen.c | 94 ++++++++++++++++++++++++++++++++++ Tests/Test_App_UpdateDisplay.c | 2 +- 6 files changed, 149 insertions(+), 12 deletions(-) create mode 100644 Tests/Test_App_DisplayRegen.c diff --git a/Apps/Inc/UpdateDisplay.h b/Apps/Inc/UpdateDisplay.h index f12f631c0..3d2bf91e1 100644 --- a/Apps/Inc/UpdateDisplay.h +++ b/Apps/Inc/UpdateDisplay.h @@ -96,11 +96,26 @@ UpdateDisplayError_t UpdateDisplay_SetVelocity(uint32_t mphTenths); UpdateDisplayError_t UpdateDisplay_SetAccel(uint8_t percent); /** - * @brief Sets the regeneration slider value on the display - * @param percent pressure on regenerator in percent + * @brief Sets the forward slider value on the display + * @param percent forward power in percent * @returns UpdateDisplayError_t */ -UpdateDisplayError_t UpdateDisplay_SetBackEMF(uint32_t emfPercent); +UpdateDisplayError_t UpdateDisplay_SetForwardPower(uint8_t percent); + +/** + * @brief Sets the regeneration power slider value on the display + * @param percent regenerative power in percent + * @returns UpdateDisplayError_t + */ +UpdateDisplayError_t UpdateDisplay_SetRegenPower(int32_t percent); + +/** + * @brief Sets both regeneration and forward power slider value. + * @param forwardPercent + * @param regenPercent + * @returns UpdateDisplayError_t +*/ +void UpdateDisplay_SetBackEMF(uint8_t accPercent, int32_t regenPercent); /** * @brief Sets the array indicator state on the display diff --git a/Apps/Src/ReadTritium.c b/Apps/Src/ReadTritium.c index 09461e8f9..7dc2346a1 100755 --- a/Apps/Src/ReadTritium.c +++ b/Apps/Src/ReadTritium.c @@ -115,6 +115,11 @@ void Task_ReadTritium(void *p_arg){ //Bus Current is in bytes 4-8 Bus_Current = *((float*)(&dataBuf.data[4])); + + int32_t Forward_Power = Bus_Voltage * Bus_Current; + + // Divide by maximum power to input percentage + UpdateDisplay_SetForwardPower(Forward_Power / 5000); } case BACKEMF:{ @@ -122,9 +127,10 @@ void Task_ReadTritium(void *p_arg){ //BackEMF is in bytes 0-4 Back_EMF = *((float*)(&dataBuf.data[0])); - uint32_t Regen_Power = (Back_EMF * 100) * (Bus_Current * 100); // Fixed point factor (100) + int32_t Regen_Power = (Back_EMF * 100) * (Bus_Current * 100); // Fixed point factor (100) - UpdateDisplay_SetBackEMF(Regen_Power); + // Divide by maximum power to input percentage + UpdateDisplay_SetRegen(Regen_Power / 5000); } default:{ diff --git a/Apps/Src/SendTritium.c b/Apps/Src/SendTritium.c index f6610bb96..c336881fc 100644 --- a/Apps/Src/SendTritium.c +++ b/Apps/Src/SendTritium.c @@ -646,7 +646,7 @@ void Task_SendTritium(void *p_arg){ state.stateHandler(); // do what the current state does #ifndef SENDTRITIUM_EXPOSE_VARS readInputs(); // read inputs from the system - UpdateDisplay_SetAccel(accelPedalPercent); + UpdateDisplay_SetBackEMF(accelPedalPercent, brakePedalPercent); #endif state.stateDecider(); // decide what the next state is diff --git a/Apps/Src/UpdateDisplay.c b/Apps/Src/UpdateDisplay.c index 407f6c94a..77cfbe913 100644 --- a/Apps/Src/UpdateDisplay.c +++ b/Apps/Src/UpdateDisplay.c @@ -56,6 +56,7 @@ const char* compStrings[15]= { // Non-boolean components "vel", "accel", + "regen", "soc", "supp", "cruiseSt", @@ -307,19 +308,40 @@ UpdateDisplayError_t UpdateDisplay_SetAccel(uint8_t percent){ return ret; } -UpdateDisplayError_t UpdateDisplay_SetBackEMF(uint32_t emfPercent){ - static uint8_t lastPercentRegen = 0; - if(emfPercent == lastPercentRegen){ +UpdateDisplayError_t UpdateDisplay_SetForwardPower(uint8_t percent) { + static uint8_t lastPercentPower = 0; + if(percent == lastPercentPower){ return UPDATEDISPLAY_ERR_NO_CHANGE; } - UpdateDisplayError_t ret = UpdateDisplay_SetComponent(REGEN_METER, emfPercent); + UpdateDisplayError_t ret = UpdateDisplay_SetComponent(MOTOR, percent); assertUpdateDisplayError(ret); - if(ret == UPDATEDISPLAY_ERR_NONE) lastPercentRegen = emfPercent; + if(ret == UPDATEDISPLAY_ERR_NONE) lastPercentPower = percent; return ret; } +UpdateDisplayError_t UpdateDisplay_SetRegenPower(int32_t percent){ + static uint8_t lastPercentRegen = 0; + if(percent == lastPercentRegen){ + return UPDATEDISPLAY_ERR_NO_CHANGE; + } + + UpdateDisplayError_t ret = UpdateDisplay_SetComponent(REGEN_METER, percent); + assertUpdateDisplayError(ret); + + if(ret == UPDATEDISPLAY_ERR_NONE) lastPercentRegen = percent; + + // In Nextion, we are displaying regeneration slider by + // modifying the background percentage. + return (100 - ret); +} + +void UpdateDisplay_SetBackEMF(uint8_t forwardPercent, int32_t regenPercent) { + UpdateDisplay_SetForwardPower(forwardPercent); + UpdateDisplay_SetRegenPower(regenPercent); +} + UpdateDisplayError_t UpdateDisplay_SetArray(bool state){ static bool lastState = false; if(state == lastState){ diff --git a/Tests/Test_App_DisplayRegen.c b/Tests/Test_App_DisplayRegen.c new file mode 100644 index 000000000..fa0f99b1f --- /dev/null +++ b/Tests/Test_App_DisplayRegen.c @@ -0,0 +1,94 @@ +// General Imports. +#include "common.h" +#include "config.h" +#include "os.h" +#include "Tasks.h" + +// Device specfic imports. +#include "UpdateDisplay.h" +#include "ReadTritium.h" + +#define STACK_SIZE 128 + +static OS_TCB Task1TCB; +static OS_TCB Task2TCB; +static CPU_STK Task1Stk[STACK_SIZE]; +static CPU_STK Task2Stk[STACK_SIZE]; + +int main() { + OS_ERR err; + OSInit(&err); + if (err != OS_ERR_NONE) { + printf("OS error code %d\n", err); + } + + // SendTritium + OSTaskCreate( + (OS_TCB*)&SendTritium_TCB, + (CPU_CHAR*)"SendTritium", + (OS_TASK_PTR)Task_SendTritium, + (void*) NULL, + (OS_PRIO)TASK_SEND_TRITIUM_PRIO, + (CPU_STK*)SendTritium_Stk, + (CPU_STK_SIZE)WATERMARK_STACK_LIMIT/10, + (CPU_STK_SIZE)TASK_SEND_TRITIUM_STACK_SIZE, + (OS_MSG_QTY) 0, + (OS_TICK)NULL, + (void*)NULL, + (OS_OPT)(OS_OPT_TASK_STK_CLR), + (OS_ERR*)&err + ); + + if (err != OS_ERR_NONE) { + printf("SendTritium Task error code %d\n", err); + } + + // ReadTritium + OSTaskCreate( + (OS_TCB*)&ReadTritium_TCB, + (CPU_CHAR*)"ReadTritium", + (OS_TASK_PTR)Task_ReadTritium, + (void*) NULL, + (OS_PRIO)TASK_READ_TRITIUM_PRIO, + (CPU_STK*)SendTritium_Stk, + (CPU_STK_SIZE)WATERMARK_STACK_LIMIT/10, + (CPU_STK_SIZE)TASK_READ_TRITIUM_STACK_SIZE, + (OS_MSG_QTY) 0, + (OS_TICK)NULL, + (void*)NULL, + (OS_OPT)(OS_OPT_TASK_STK_CLR), + (OS_ERR*)&err + ); + + if (err != OS_ERR_NONE) { + printf("ReadTritium Task error code %d\n", err); + } + + // UpdateDisplay + OSTaskCreate( + (OS_TCB *)&UpdateDisplay_TCB, + (CPU_CHAR *)"UpdateDisplay_TCB", + (OS_TASK_PTR)Task_UpdateDisplay, + (void *)NULL, + (OS_PRIO)TASK_UPDATE_DISPLAY_PRIO, + (CPU_STK *)UpdateDisplay_Stk, + (CPU_STK_SIZE)DEFAULT_STACK_SIZE / 10, + (CPU_STK_SIZE)DEFAULT_STACK_SIZE, + (OS_MSG_QTY)0, + (OS_TICK)NULL, + (void *)NULL, + (OS_OPT)(OS_OPT_TASK_STK_CLR), + (OS_ERR *)&err); + + if (err != OS_ERR_NONE) { + printf("UpdateDisplay Task error code %d\n", err); + } + + OSStart(&err); + + if (err != OS_ERR_NONE) { + printf("OS error code %d\n", err); + } + + return 0; +} \ No newline at end of file diff --git a/Tests/Test_App_UpdateDisplay.c b/Tests/Test_App_UpdateDisplay.c index 7c0ed8612..072805e2b 100644 --- a/Tests/Test_App_UpdateDisplay.c +++ b/Tests/Test_App_UpdateDisplay.c @@ -124,7 +124,7 @@ void Task1(void *arg) OSTimeDlyHMSM(0, 0, 0, 200, OS_OPT_TIME_HMSM_STRICT, &e); - testPercentageComp(&UpdateDisplay_SetRegenAccel); + testPercentageComp(&UpdateDisplay_SetAccel); error = Display_Fault(OSErrLocBitmap, FaultBitmap); assertDisplayError(error); From c00939a03ce409faf2bdfa040295948750527be5 Mon Sep 17 00:00:00 2001 From: Jiwoo Date: Sat, 21 Oct 2023 20:31:52 +0000 Subject: [PATCH 6/6] Wrong functio name. Fixed --- Apps/Src/ReadTritium.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Apps/Src/ReadTritium.c b/Apps/Src/ReadTritium.c index 7dc2346a1..4064369ae 100755 --- a/Apps/Src/ReadTritium.c +++ b/Apps/Src/ReadTritium.c @@ -130,7 +130,7 @@ void Task_ReadTritium(void *p_arg){ int32_t Regen_Power = (Back_EMF * 100) * (Bus_Current * 100); // Fixed point factor (100) // Divide by maximum power to input percentage - UpdateDisplay_SetRegen(Regen_Power / 5000); + UpdateDisplay_SetRegenPower(Regen_Power / 5000); } default:{