From 537641a53a8829951802f7d6cc764b809cb6838a Mon Sep 17 00:00:00 2001
From: hamza <hamza.tmm@tuta.com>
Date: Thu, 4 Jul 2024 18:07:32 +0300
Subject: [PATCH] V1.0

---
 Core/Inc/PWM_control.h   |  3 +--
 Core/Src/PWM_control.c   | 32 +++++++++++++++++++++++++++-----
 Core/Src/state_machine.c |  9 ++++-----
 3 files changed, 32 insertions(+), 12 deletions(-)

diff --git a/Core/Inc/PWM_control.h b/Core/Inc/PWM_control.h
index d88cdf8..a76fb7f 100644
--- a/Core/Inc/PWM_control.h
+++ b/Core/Inc/PWM_control.h
@@ -20,8 +20,6 @@ CCR * DUTY_CYCLE
 CCR: 1/20 -> 500, 2/20 -> 1000
 */
 #define POWERGROUND_FREQ            50
-#define POWERGROUND_MAX_DUTY_CYCLE  0.1
-#define POWERGROUND_MIN_DUTY_CYCLE  0.05
 
 //#define BATTERY_COOLING_FREQ        20000
 
@@ -29,5 +27,6 @@ void PWM_control_init(TIM_HandleTypeDef* powerground, TIM_HandleTypeDef* battery
 
 void PWM_powerground_control(uint8_t percent);
 void PWM_battery_cooling_control(uint8_t percent);
+void PWM_set_throttle();
 
 #endif /* INC_CHANNEL_CONTROL_H */
diff --git a/Core/Src/PWM_control.c b/Core/Src/PWM_control.c
index 09adf92..ed16140 100644
--- a/Core/Src/PWM_control.c
+++ b/Core/Src/PWM_control.c
@@ -1,4 +1,6 @@
 #include "PWM_control.h"
+#include "stm32f3xx_hal.h"
+#include <stdint.h>
 
 uint8_t battery_cooling_status;
 //uint32_t powerground1_CCR, powerground2_CCR, battery_cooling_CCR;
@@ -13,29 +15,49 @@ TIM_HandleTypeDef* powerground, *battery_cooling;
 void PWM_control_init(TIM_HandleTypeDef* pg, TIM_HandleTypeDef* bat_cool){
   powerground_status = 0;
   battery_cooling_status = 0;
+  
+  powerground = pg;
+  battery_cooling = bat_cool;
 
   HAL_TIM_PWM_Start(pg, TIM_CHANNEL_1);          //TIM15CH1
   HAL_TIM_PWM_Start(pg, TIM_CHANNEL_2);          //TIM15CH2
   HAL_TIM_PWM_Start(bat_cool, TIM_CHANNEL_3);     //TIM1CH3
 
-  powerground = pg;
-  battery_cooling = bat_cool;
-  __HAL_TIM_SET_COMPARE(powerground, TIM_CHANNEL_1, 2000);
-  __HAL_TIM_SET_COMPARE(powerground, TIM_CHANNEL_2, 2000);
+  __HAL_TIM_SET_COMPARE(powerground, TIM_CHANNEL_1, 0);
+  __HAL_TIM_SET_COMPARE(powerground, TIM_CHANNEL_2, 0);
+
+  //PWM_powerground_control(0);
   //__HAL_TIM_SET_COMPARE(battery_cooling, TIM_CHANNEL_3, 2000);
 }              
 
 /*
   controls the duty cycle of the fans by setting the CCR of the channel percent/100 = x/ARR
+  DUTYCYCLE = 40000 * X/100
 */
 void PWM_powerground_control(uint8_t percent){
   if (percent > 100) //something went wrong
     return;
   powerground_status = percent;
+
   int ccr = 2000 + ((2000) * (percent/100.0));
   __HAL_TIM_SET_COMPARE(powerground, TIM_CHANNEL_1, ccr);
-  __HAL_TIM_SET_COMPARE(powerground, TIM_CHANNEL_2, 2000 + ((2000) * (percent/100.0)));
+  __HAL_TIM_SET_COMPARE(powerground, TIM_CHANNEL_2, ccr);
   //TIM15->CCR1 = (TIM15->ARR*POWERGROUND_MAX_DUTY_CYCLE-TIM15->ARR*POWERGROUND_MIN_DUTY_CYCLE) * (percent/100.0) + TIM15->ARR*POWERGROUND_MIN_DUTY_CYCLE;
 }
 
+void PWM_set_throttle(){
+  uint32_t timestamp = HAL_GetTick() + 5000;
+  while (timestamp > HAL_GetTick()) {}
+
+  __HAL_TIM_SET_COMPARE(powerground, TIM_CHANNEL_1, 4000);
+  __HAL_TIM_SET_COMPARE(powerground, TIM_CHANNEL_2, 4000);
+  timestamp = HAL_GetTick() + 2000;
+  while (timestamp > HAL_GetTick()) {}
+
+  __HAL_TIM_SET_COMPARE(powerground, TIM_CHANNEL_1, 2000);
+  __HAL_TIM_SET_COMPARE(powerground, TIM_CHANNEL_2, 2000);
+  timestamp = HAL_GetTick() + 1000;
+  while (timestamp > HAL_GetTick()) {}
+}
+
 void PWM_battery_cooling_control(uint8_t percent){}
\ No newline at end of file
diff --git a/Core/Src/state_machine.c b/Core/Src/state_machine.c
index 7008496..c8a78ab 100644
--- a/Core/Src/state_machine.c
+++ b/Core/Src/state_machine.c
@@ -74,8 +74,10 @@ State sm_update_precharge(){
     case STATE_INACTIVE:          // if CAN Signal 0000 0000 then immidiete shutdown
       return STATE_DISCHARGE;
     case STATE_PRECHARGE:
-      if (RELAY_BAT_SIDE_VOLTAGE-RELAY_ESC_SIDE_VOLTAGE < 100)
+      if (RELAY_BAT_SIDE_VOLTAGE-RELAY_ESC_SIDE_VOLTAGE < 100){
+        PWM_set_throttle();
         return STATE_READY;
+      }
       break;
     case STATE_DISCHARGE:
       return STATE_DISCHARGE;
@@ -228,21 +230,18 @@ void sm_handle_ams_in(const uint8_t *data){
   switch (data[0]) {
     case 0x00:
       if (state.current_state != STATE_INACTIVE){
-        PWM_powerground_control(0);
         state.target_state = STATE_DISCHARGE;
       }
       break;
     case 0x01:
       if (state.target_state == STATE_INACTIVE || state.target_state == STATE_DISCHARGE){
-        PWM_powerground_control(0);
         state.target_state = STATE_PRECHARGE;
       } else if (state.target_state == STATE_ACTIVE){
-        PWM_powerground_control(0);
         state.target_state = STATE_READY;
       }
       break;
     case 0x02:
-      if (state.current_state == STATE_READY){
+      if (state.current_state == STATE_READY || state.current_state == STATE_ACTIVE){
         PWM_powerground_control(data[1]);
         state.target_state = STATE_ACTIVE;        // READY -> ACTIVE
       }