Files
TX/source/battery.c

187 lines
3.6 KiB
C
Raw Normal View History

/*
* Battery.c
*
* Created on: Jun 10, 2022
* Author: Keith.Lloyd
*/
#include "arm_math.h"
#include "utils.h"
#include "battery.h"
#include "adc.h"
#include "main.h"
#include "timer.h"
2025-06-11 10:55:00 -05:00
#include "lcd.h"
#include "display.h"
#include "safety_key.h"
#include "amps.h"
#include "ports.h"
#include "hwFixes.h"
2025-06-11 10:55:00 -05:00
#include "System/system.h"
uint8_t Bat_Type;
extern uint8_t Task, Error;
extern uint16_t Low_Bat_timer;
extern uint16_t battery;
//uint16_t Bat_Level[] = {100,200,300,400,500,125,225,325,425,525}; // Battery life levels 5 Alkaline and 5 Lithium.
extern HARDWARE_FIX_t hwf;
2025-06-11 10:55:00 -05:00
extern SYSTEM_DATA_t sys;
bool Compare_With_Limit(float32_t V1 ,float32_t V2,float32_t limit)
{
float32_t tolerance;
bool result;
result = false;
tolerance = limit / 100.0;
tolerance = tolerance + 1.0;
tolerance = tolerance * V2;
if(V1 < tolerance)
result = true;
tolerance = limit /100.0;
tolerance = 1.0 - tolerance;
tolerance = tolerance * V2;
if(V1 > tolerance)
result = true;
return(result);
}
2025-06-11 10:55:00 -05:00
void battery_checkId(void)
{
}
void Check_Bat_Id(void)
{
float32_t Battery;
float32_t Bat_Mid_Point;
2025-06-11 10:55:00 -05:00
if(sys.adc.V_BID > LITHIUM_MID_POINT) // BAT_ID = 0V for lithium, mid point for Alkaline
{
2025-06-11 10:55:00 -05:00
if(Compare_With_Limit(sys.adc.V_BID,sys.adc.V_BAT,5.0))
{
Bat_Type = EXT_DC;
2025-06-11 10:55:00 -05:00
sys.maxPowerLimit = POWER_LIMIT_EXT_DC; // Limit max power to 5W.
}
else
{
Bat_Type = ALKALINE;
2025-06-11 10:55:00 -05:00
sys.maxPowerLimit = POWER_LIMIT_ALKALINE; // Limit max power to 5W.
2025-06-11 10:55:00 -05:00
Battery = sys.adc.V_BAT; // Calculate mid-point for alkaline
Bat_Mid_Point = Battery / 2;
2025-06-11 10:55:00 -05:00
if ((sys.adc.V_BID > (Bat_Mid_Point * 1.1)) || (sys.adc.V_BID < (Bat_Mid_Point * 0.9)) ) // Check if not at mid-point
Bat_Type = BAT_ERROR; // indicate battery insertion error
}
}
else
{
Bat_Type = LITHIUM;
2025-06-11 10:55:00 -05:00
sys.maxPowerLimit = POWER_LIMIT_LITHIUM; // Limit max power to 5W. 1.7 = 10.0 1.7X = 25.0
}
if(Bat_Type == BAT_ERROR)
{
LCD_Clear();
Task=BAT_INSERTION_ERROR;
while(1)
{
//safe_key();
Display_Update();
Delay_Ticks(10);
}
}
}
void Chk_Bat_Level(void)
{
if(Bat_Type == LITHIUM)
{
if(hwf.vBattCap_021)
Test_Bat_Level(CF_LITHIUM_CUT_OFF);
else
Test_Bat_Level(LITHIUM_CUT_OFF);
}
else
{
if(hwf.vBattCap_021)
Test_Bat_Level(CF_ALKALINE_CUT_OFF);
else
Test_Bat_Level(ALKALINE_CUT_OFF);
}
}
void Test_Bat_Level(float32_t Bat_Cut_Off)
{
2025-06-11 10:55:00 -05:00
if(sys.adc.V_BAT < Bat_Cut_Off && Task != LOW_BATTERY_TASK)
{
if(Task != PWR_OFF_TASK)
{
All_Amps_Off();
Disable_BC(); //Disable BC
2025-06-11 10:55:00 -05:00
Select_Estop(ISOLATED);
Delay_Ticks(25); //wait for battery voltage to rise
2025-06-11 10:55:00 -05:00
// if(sys.adc.V_BAT <= Bat_Cut_Off)
// {
Task = LOW_BATTERY_TASK;
Low_Bat_timer = DELAY_2S;
// }
// else
// {
// Task = FATAL_ERROR_TASK;
// Error = 2;
// }
}
}
}
float32_t Adjust_Battery_For_Load() // adjust to true battery voltage due to battery cable
//drop and current demand
{ // assumed frequency and efficiency may need table for frequency adjust
float32_t battery; //assumes taps are correct
2025-06-11 10:55:00 -05:00
battery = sys.adc.V_BAT;
if(Bat_Type == LITHIUM)
{
2025-06-11 10:55:00 -05:00
if(sys.adc.I_OUT_SlowFilt < DEMAND1)
battery = battery + 1.1;
2025-06-11 10:55:00 -05:00
else if(sys.adc.I_OUT_SlowFilt < DEMAND2)
battery = battery + 1.2;
2025-06-11 10:55:00 -05:00
else if(sys.adc.I_OUT_SlowFilt < DEMAND3)
battery = battery + 1.3;
2025-06-11 10:55:00 -05:00
else if(sys.adc.I_OUT_SlowFilt < DEMAND4)
battery = battery + 1.4;
2025-06-11 10:55:00 -05:00
else if(sys.adc.I_OUT_SlowFilt < DEMAND5)
battery = battery + 1.5;
2025-06-11 10:55:00 -05:00
else if(sys.adc.I_OUT_SlowFilt < DEMAND6)
battery = battery + 1.6;
else
battery = battery + 2;
return(battery);
}
else
{
}
}