Program Listing for File current.c¶
↰ Return to documentation for file (mainboard/Src/pack/current.c
)
#include "pack/current.h"
#include "adc.h"
#include "error.h"
#include "main.h"
#include "mainboard_config.h"
#define MEASURE_SAMPLE_SIZE 128
uint16_t adc_50[MEASURE_SAMPLE_SIZE] = {0};
uint16_t adc_300[MEASURE_SAMPLE_SIZE] = {0};
current_t current[CURRENT_SENSOR_NUM] = {0.f};
current_t zero[CURRENT_SENSOR_NUM] = {0.f};
current_t _current_convert_low(float volt) {
return (1 / 40.0e-3f) * (volt / (330.f / (330 + 169)) - 2.5f);
}
current_t _current_convert_high(float volt) {
return (1 / 2.5e-3f) * (volt / (330.f / (330 + 169)) - 2.5f);
}
current_t _current_convert_shunt() {
return 0.f;
}
void current_start_measure() {
HAL_ADC_Start_DMA(&ADC_HALL50, (uint32_t *)adc_50, MEASURE_SAMPLE_SIZE);
HAL_ADC_Start_DMA(&ADC_HALL300, (uint32_t *)adc_300, MEASURE_SAMPLE_SIZE);
}
uint32_t current_read() {
//TODO: measure shunt
uint32_t time = HAL_GetTick();
uint32_t avg_50 = 0;
uint32_t avg_300 = 0;
for (size_t i = 0; i < MEASURE_SAMPLE_SIZE; i++) {
avg_50 += adc_50[i];
avg_300 += adc_300[i];
}
avg_50 /= MEASURE_SAMPLE_SIZE;
avg_300 /= MEASURE_SAMPLE_SIZE;
// Convert Hall-low (50A)
float volt = (avg_50 * 3.3f) / 4095;
current[CURRENT_SENSOR_50] = _current_convert_low(volt);
// Convert Hall-high (300A)
volt = (avg_300 * 3.3f) / 4095;
current[CURRENT_SENSOR_300] = _current_convert_high(volt);
// Check for over-current
error_toggle_check(current_get_current() > PACK_MAX_CURRENT, ERROR_OVER_CURRENT, 0);
return time;
}
void current_zero() {
zero[CURRENT_SENSOR_50] += current[CURRENT_SENSOR_50];
zero[CURRENT_SENSOR_300] += current[CURRENT_SENSOR_300];
}
current_t current_get_current() {
// TODO: change this to combine all current sensors in a meaningful way.
return current[CURRENT_SENSOR_50];
}
current_t *current_get_current_sensors() {
return current;
}
current_t *current_get_zero() {
return zero;
}