-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbattery.c
110 lines (83 loc) · 2.16 KB
/
battery.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
//==============================================================================
// aegis/src/battery.c
//------------------------------------------------------------------------------
// Battery management
//==============================================================================
#include "aegis.h"
typedef struct battery_s
{
uint16_t vcell1;
uint16_t vcell2;
uint16_t vtotal;
BATT_STATUS status;
uint8_t cell1_low :1;
uint8_t cell2_low :1;
}
battery_t;
static battery_t battery;
//------------------------------------------------------------------------------
// Initialization. Call at startup.
//------------------------------------------------------------------------------
void BMStartup( void )
{
battery.status = BATT_UNK;
}
void BMShutdown( void )
{
battery.status = BATT_UNK;
}
void BMUpdateBattery( void )
{
static uint32_t last = 0;
uint32_t t = GetSysTick();
if ( t - last > TI_UPDATE_BATTERY )
{
BMReadBattery();
BMUpdateStatus();
}
}
void BMReadBattery( void )
{
uint32_t sample;
uint32_t vbat1, vbat2;
sample = ADCSample( ADC_CH_BATT_CELL1, 1 );
vbat1 = 3 * ADC_VREF * sample >> 13;
sample = ADCSample( ADC_CH_BATT_TOTAL, 1 );
vbat2 = 3 * ADC_VREF * sample >> 12;
if ( battery.status == BATT_LOW ) vbat2 += BVO_PF4;
if ( vbat2 > vbat1 ) vbat2 -= vbat1;
if ( vbat1 > 0 ) vbat1 += BVO_CELL1;
if ( vbat2 > 0 ) vbat2 += BVO_CELL2;
battery.vcell1 = vbat1;
battery.vcell2 = vbat2;
battery.vtotal = vbat1 + vbat2;
VOISet( VOI_VCELL1, &battery.vcell1 );
VOISet( VOI_VCELL2, &battery.vcell2 );
}
void BMUpdateStatus( void )
{
BATT_STATUS old = battery.status;
if ( battery.vcell1 < 3000 ) battery.cell1_low = 1;
else if ( battery.vcell1 >= 3100 ) battery.cell1_low = 0;
if ( battery.vcell2 < 3000 ) battery.cell2_low = 1;
else if ( battery.vcell2 >= 3100 ) battery.cell2_low = 0;
if ( battery.cell1_low || battery.cell2_low )
{
battery.status = BATT_LOW;
PF4 = 0;
}
else
{
battery.status = BATT_OK;
PF4 = 1;
}
VOISet( VOI_BATT_STATUS, &battery.status );
if ( battery.status != old )
{
EMSendEvent1P( EVENT_HARDWARE, EV_H_BATT_STATUS, battery.status );
}
}
BATT_STATUS BMGetStatus( void )
{
return battery.status;
}