Avalon Firmware
 
Loading...
Searching...
No Matches
adc_utils.hpp
Go to the documentation of this file.
1
10
11#ifndef STM_UTILS_INC_ADC_UTILS_HPP_
12#define STM_UTILS_INC_ADC_UTILS_HPP_
13
14#include <adc.h>
15#include <dma.h>
16#include <stdint.h>
17#include <arm_math.h>
18#include "supercap_def.h"
19#include "main.h"
20
21// ==========================
22// ADC and Signal Definitions
23// ==========================
24
26#define ADC_RES 4095.0f
27
29#define INV_VOLT_DIV 11.0f
30
32#define ADC_REF 3.3f
33
35#define INA186A2_GAIN 50.0f
36
38#define SHUNT_RESISTOR 0.004f
39
41#define VCAP_GAIN ADC_REF * INV_VOLT_DIV / ADC_RES
42#define VBAT_GAIN ADC_REF * INV_VOLT_DIV / ADC_RES
43
45#define IBAT_GAIN -(ADC_REF / SHUNT_RESISTOR / INA186A2_GAIN / ADC_RES)
46#define ISOURCE_GAIN -(ADC_REF / SHUNT_RESISTOR / INA186A2_GAIN / ADC_RES)
47#define ICAP_GAIN -(ADC_REF / SHUNT_RESISTOR / INA186A2_GAIN / ADC_RES)
48
49// ==========================
50// Offset Calibration per Board
51// ==========================
52
53#if BOARD_ID == 0x01
54 #define VCAP_OFFSET 0.4914794921875f
55 #define VBAT_OFFSET 0.5060302734375f
56 #define IBAT_OFFSET 8.018306816f
57 #define ISOURCE_OFFSET 8.0183068822f
58 #define ICAP_OFFSET 7.97801410408f
59#elif BOARD_ID == 0x02
60 #define VCAP_OFFSET 0.5300927721875f
61 #define VBAT_OFFSET 0.6178282734375f
62 #define IBAT_OFFSET 7.9417500291f
63 #define ISOURCE_OFFSET 7.9941314767f
64 #define ICAP_OFFSET 7.95786746968f
65#elif BOARD_ID == 0x03
66 #define VCAP_OFFSET 0.5344686121875f
67 #define VBAT_OFFSET 0.5866657734375f
68 #define IBAT_OFFSET 8.018306816f
69 #define ISOURCE_OFFSET 8.0183068822f
70 #define ICAP_OFFSET 7.97801410408f
71#elif BOARD_ID == 0x04
72 #define VCAP_OFFSET 0.5344686121875f
73 #define VBAT_OFFSET 0.5866657734375f
74 #define IBAT_OFFSET 8.018306816f
75 #define ISOURCE_OFFSET 8.0183068822f
76 #define ICAP_OFFSET 7.97801410408f
77#else
78 #error "WRONG BOARD ID."
79#endif
80
81// ==========================
82// ADC Buffers and Channels
83// ==========================
84
85#define ADC1_CHANNELS 2
86#define ADC2_CHANNELS 3
87#define ADC_FIRST_BUFFER 0
88#define ADC_SECOND_BUFFER 1
89#define ADC_BUFFER_DEPTH 16
90
91// ==========================
92// Enumerations
93// ==========================
94
105
116
117// ==========================
118// Data Structures
119// ==========================
120
124typedef struct {
125 uint16_t window_filter[64];
126 uint8_t length;
127 uint8_t index;
128 uint32_t sum;
129 uint8_t full;
131
135typedef struct {
136 arm_pid_instance_f32 ArmPID_Instance;
137 float IntegMax;
138 float IntegMin;
139 float OutputMax;
140 float OutputMin;
142
143// ==========================
144// ADC Manager Class
145// ==========================
146
152public:
159 adc_manager(ADC_HandleTypeDef* adc_cap, ADC_HandleTypeDef* adc_bat, ADC_HandleTypeDef* adc_temp)
160 : adc_cap_(adc_cap), adc_bat_(adc_bat), adc_temp_(adc_temp) {}
161
167 HAL_StatusTypeDef adc_init(uint8_t* filters_length);
168
173 float get_temperature();
174
175 bool calibration_ready = false;
176
177private:
178 void set_gains_offsets();
179
180 // ADC handles
181 ADC_HandleTypeDef* adc_cap_;
182 ADC_HandleTypeDef* adc_bat_;
183 ADC_HandleTypeDef* adc_temp_;
184
185 // (Deprecated) unused PID constants
186 float P_KP_chassis, P_KI_chassis, P_KD_chassis;
187 float P_KP_battery, P_KI_battery, P_KD_battery;
188 float I_KP_supercap, I_KI_supercap, I_KD_supercap;
189 float V_KP_capMax, V_KI_capMax, V_KD_capMax;
190 float V_KP_capMin, V_KI_capMin, V_KD_capMin;
191};
192
193// ==========================
194// External Variables
195// ==========================
196
197extern uint16_t adc1_samples[2][16][2];
198extern uint16_t adc2_samples[2][16][3];
199extern uint16_t ADC_filtered_data[5];
200extern mov_avrg_filter filters[5];
201extern float adc_gains[5];
202extern float adc_offsets[5];
203
207#define GET_COMPENSATED_ADC(ADC_VAL, NAME) (((float)(ADC_VAL)) * adc_gains[NAME]) + adc_offsets[NAME]
208
209#endif /* STM_UTILS_INC_ADC_UTILS_HPP_ */
This file contains all the function prototypes for the adc.c file.
float adc_gains[5]
Gain correction per channel.
Definition adc_utils.cpp:26
uint16_t adc1_samples[2][16][2]
Raw buffer for ADC1.
Definition adc_utils.cpp:16
mov_avrg_filter filters[5]
Filter states per channel.
Definition adc_utils.cpp:20
uint16_t ADC_filtered_data[5]
Filtered data per channel.
Definition adc_utils.cpp:23
uint16_t adc2_samples[2][16][3]
Raw buffer for ADC2.
Definition adc_utils.cpp:17
float adc_offsets[5]
Offset correction per channel.
Definition adc_utils.cpp:27
pid_names
Enum for identifying PID loops.
Definition adc_utils.hpp:109
@ I_capa
Definition adc_utils.hpp:112
@ V_cap_min
Definition adc_utils.hpp:114
@ P_chassis
Definition adc_utils.hpp:111
@ V_cap_max
Definition adc_utils.hpp:113
@ P_bat
Definition adc_utils.hpp:110
adc_names
Enum for identifying ADC channels.
Definition adc_utils.hpp:98
@ I_chassis
Current flowing to chassis.
Definition adc_utils.hpp:102
@ V_cap
Voltage on supercap bank.
Definition adc_utils.hpp:100
@ I_bat
Current from PMM to board.
Definition adc_utils.hpp:103
@ I_cap
Current from capacitor side.
Definition adc_utils.hpp:99
@ V_bat
Voltage from battery input.
Definition adc_utils.hpp:101
bool calibration_ready
Optional flag for calibration flow.
Definition adc_utils.hpp:175
adc_manager(ADC_HandleTypeDef *adc_cap, ADC_HandleTypeDef *adc_bat, ADC_HandleTypeDef *adc_temp)
Constructor.
Definition adc_utils.hpp:159
HAL_StatusTypeDef adc_init(uint8_t *filters_length)
Initializes ADCs and filter states.
Definition adc_utils.cpp:38
float get_temperature()
Reads temperature using onboard NTC.
Definition adc_utils.cpp:115
This file contains all the function prototypes for the dma.c file.
: Header for main.c file. This file contains the common defines of the application.
PID loop controller structure.
Definition adc_utils.hpp:135
float OutputMin
Minimum output.
Definition adc_utils.hpp:140
float IntegMax
Maximum integral term.
Definition adc_utils.hpp:137
arm_pid_instance_f32 ArmPID_Instance
CMSIS ARM PID instance.
Definition adc_utils.hpp:136
float IntegMin
Minimum integral term.
Definition adc_utils.hpp:138
float OutputMax
Maximum output.
Definition adc_utils.hpp:139
Moving average filter structure.
Definition adc_utils.hpp:124
uint16_t window_filter[64]
Circular buffer of values.
Definition adc_utils.hpp:125
uint8_t full
True if buffer has been filled at least once.
Definition adc_utils.hpp:129
uint8_t length
Number of samples in filter.
Definition adc_utils.hpp:126
uint8_t index
Current index in circular buffer.
Definition adc_utils.hpp:127
uint32_t sum
Running sum of buffer.
Definition adc_utils.hpp:128
Configuration constants for the supercapacitor power manager firmware.