#include #include #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)); }