104 lines
2.8 KiB
C
104 lines
2.8 KiB
C
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#include "battery.h"
|
|
|
|
#include "esp_log.h"
|
|
#include "esp_adc/adc_oneshot.h"
|
|
#include "esp_adc/adc_cali.h"
|
|
#include "esp_adc/adc_cali_scheme.h"
|
|
|
|
#define TAG "battery"
|
|
|
|
battery_conf_t* get_battery_configuration(nvs_handle_t nvs){
|
|
battery_conf_t* conf = malloc(sizeof(battery_conf_t));
|
|
|
|
conf->read_retry_nb = 5;
|
|
|
|
ESP_ERROR_CHECK(nvs_get_u16(nvs, "poll_delay", &conf->poll_delay));
|
|
|
|
uint16_t min_mv, max_mv;
|
|
nvs_get_u16(nvs, "min_mv", &min_mv);
|
|
nvs_get_u16(nvs, "max_mv", &max_mv);
|
|
|
|
battery_data_t data = {
|
|
.battery_percent = 0,
|
|
.min_mv = min_mv,
|
|
.scale = (max_mv - min_mv) / 100,
|
|
};
|
|
|
|
ESP_LOGI("CONF", "min %d, max %d, scale %d", data.min_mv, max_mv, data.scale);
|
|
|
|
battery_data_t* data_h = malloc(sizeof(battery_data_t));
|
|
memcpy(data_h, &data, sizeof(battery_data_t));
|
|
conf->data = data_h;
|
|
conf->adc_channel = CONFIG_BATTMS_CHANNEL;
|
|
return conf;
|
|
}
|
|
|
|
void update_battery_level(battery_conf_t* batt_conf){
|
|
int val_raw = 0;
|
|
for(int tries=0; tries < batt_conf->read_retry_nb; tries++){
|
|
esp_err_t res = ESP_OK;
|
|
res = adc_oneshot_read(batt_conf->adc_handle, batt_conf->adc_channel, &val_raw);
|
|
if(res == ESP_ERR_TIMEOUT)// valeur invalide
|
|
continue;
|
|
|
|
ESP_ERROR_CHECK(res);
|
|
battery_data_t* data = batt_conf->data;
|
|
int val_mv=0;
|
|
ESP_ERROR_CHECK(adc_cali_raw_to_voltage(batt_conf->cali_handle, val_raw, &val_mv));
|
|
val_mv *= 2; // external voltage divider
|
|
data->battery_mv = val_mv;
|
|
if(val_mv < data->min_mv) data->battery_percent = 0;
|
|
else data->battery_percent = (val_mv - data->min_mv) / data->scale;
|
|
ESP_LOGI("BATTMS", "raw : %d, mv : %d, percent : %d, min %d, scale %d", val_raw, val_mv, data->battery_percent, data->min_mv, data->scale);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void init_battery_level_adc(battery_conf_t* batt_conf){
|
|
adc_oneshot_unit_init_cfg_t init_config1 = {
|
|
.unit_id = ADC_UNIT_1,
|
|
.ulp_mode = ADC_ULP_MODE_DISABLE,
|
|
};
|
|
ESP_LOGI(TAG, "pointer inir config %d", (int)&init_config1);
|
|
ESP_ERROR_CHECK(adc_oneshot_new_unit(&init_config1, &batt_conf->adc_handle));
|
|
|
|
adc_bitwidth_t bitwidth = ADC_BITWIDTH_DEFAULT;
|
|
switch(CONFIG_BATTMS_ADC_BITWIDTH){
|
|
case 9:
|
|
bitwidth = ADC_BITWIDTH_9;
|
|
break;
|
|
case 10:
|
|
bitwidth = ADC_BITWIDTH_10;
|
|
break;
|
|
case 11:
|
|
bitwidth = ADC_BITWIDTH_11;
|
|
break;
|
|
case 12:
|
|
bitwidth = ADC_BITWIDTH_12;
|
|
break;
|
|
case 13:
|
|
bitwidth = ADC_BITWIDTH_13;
|
|
break;
|
|
default:
|
|
bitwidth = ADC_BITWIDTH_DEFAULT;
|
|
break;
|
|
}
|
|
|
|
adc_oneshot_chan_cfg_t config = {
|
|
.bitwidth = bitwidth,
|
|
.atten = ADC_ATTEN_DB_11,
|
|
};
|
|
ESP_ERROR_CHECK(adc_oneshot_config_channel(batt_conf->adc_handle, batt_conf->adc_channel, &config));
|
|
|
|
adc_cali_curve_fitting_config_t cali_config = {
|
|
.unit_id = ADC_UNIT_1,
|
|
.atten = ADC_ATTEN_DB_11,
|
|
.bitwidth = bitwidth,
|
|
};
|
|
ESP_ERROR_CHECK(adc_cali_create_scheme_curve_fitting(&cali_config, &batt_conf->cali_handle));
|
|
}
|
|
|