187 lines
3.6 KiB
C
187 lines
3.6 KiB
C
/*
|
|
* 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"
|
|
#include "lcd.h"
|
|
#include "display.h"
|
|
#include "safety_key.h"
|
|
#include "amps.h"
|
|
#include "ports.h"
|
|
#include "hwFixes.h"
|
|
#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;
|
|
|
|
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);
|
|
}
|
|
|
|
|
|
|
|
void battery_checkId(void)
|
|
{
|
|
|
|
}
|
|
|
|
void Check_Bat_Id(void)
|
|
{
|
|
float32_t Battery;
|
|
float32_t Bat_Mid_Point;
|
|
|
|
|
|
if(sys.adc.V_BID > LITHIUM_MID_POINT) // BAT_ID = 0V for lithium, mid point for Alkaline
|
|
{
|
|
if(Compare_With_Limit(sys.adc.V_BID,sys.adc.V_BAT,5.0))
|
|
{
|
|
Bat_Type = EXT_DC;
|
|
sys.maxPowerLimit = POWER_LIMIT_EXT_DC; // Limit max power to 5W.
|
|
|
|
}
|
|
else
|
|
{
|
|
Bat_Type = ALKALINE;
|
|
sys.maxPowerLimit = POWER_LIMIT_ALKALINE; // Limit max power to 5W.
|
|
|
|
Battery = sys.adc.V_BAT; // Calculate mid-point for alkaline
|
|
Bat_Mid_Point = Battery / 2;
|
|
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;
|
|
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)
|
|
{
|
|
if(sys.adc.V_BAT < Bat_Cut_Off && Task != LOW_BATTERY_TASK)
|
|
{
|
|
if(Task != PWR_OFF_TASK)
|
|
{
|
|
All_Amps_Off();
|
|
Disable_BC(); //Disable BC
|
|
Select_Estop(ISOLATED);
|
|
|
|
Delay_Ticks(25); //wait for battery voltage to rise
|
|
|
|
// 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
|
|
battery = sys.adc.V_BAT;
|
|
if(Bat_Type == LITHIUM)
|
|
{
|
|
if(sys.adc.I_OUT_SlowFilt < DEMAND1)
|
|
battery = battery + 1.1;
|
|
else if(sys.adc.I_OUT_SlowFilt < DEMAND2)
|
|
battery = battery + 1.2;
|
|
else if(sys.adc.I_OUT_SlowFilt < DEMAND3)
|
|
battery = battery + 1.3;
|
|
else if(sys.adc.I_OUT_SlowFilt < DEMAND4)
|
|
battery = battery + 1.4;
|
|
else if(sys.adc.I_OUT_SlowFilt < DEMAND5)
|
|
battery = battery + 1.5;
|
|
else if(sys.adc.I_OUT_SlowFilt < DEMAND6)
|
|
battery = battery + 1.6;
|
|
else
|
|
battery = battery + 2;
|
|
|
|
return(battery);
|
|
}
|
|
|
|
else
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|