# HG changeset patch # User Michiel Broek # Date 1570987632 -7200 # Node ID 7dc9003f86a8d114ac42c2d15fefd272247c8951 # Parent e33f2d325d153220462bfaae1b52b7a21afb9d94 ADC1 source code cleanup. Switched to 12 bit resolution again. Multisample set to 128. Improved adc-state structure locking. Improved ADC read error detection. DS18B20 extra error logging. MQTT better publish counter locking. diff -r e33f2d325d15 -r 7dc9003f86a8 main/task_adc.c --- a/main/task_adc.c Sun Oct 13 12:24:14 2019 +0200 +++ b/main/task_adc.c Sun Oct 13 19:27:12 2019 +0200 @@ -9,7 +9,7 @@ #define DEFAULT_VREF 1093 ///< Use adc2_vref_to_gpio() to obtain a better estimate -#define NO_OF_SAMPLES 64 ///< Multisampling +#define NO_OF_SAMPLES 128 ///< Multisampling #define PRESSURE_1 (CONFIG_PRESSURE_1) @@ -46,19 +46,6 @@ } -/* -static void print_char_val_type(esp_adc_cal_value_t val_type) -{ - if (val_type == ESP_ADC_CAL_VAL_EFUSE_TP) { - ESP_LOGI(TAG, "Characterized using Two Point Value"); - } else if (val_type == ESP_ADC_CAL_VAL_EFUSE_VREF) { - ESP_LOGI(TAG, "Characterized using eFuse Vref"); - } else { - ESP_LOGI(TAG, "Characterized using Default Vref"); - } -} -*/ - /* * Task to read pressure sensors and battery voltage on request. @@ -69,18 +56,10 @@ adc_atten_t atten = ADC_ATTEN_DB_0; ESP_LOGI(TAG, "Starting task ADC sensors"); -// esp_log_level_set("task_adc", ESP_LOG_DEBUG); - - //Check TP is burned into eFuse -// ESP_LOGI(TAG, "eFuse Two Point: %supported", (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_TP) == ESP_OK) ? "S":"NOT s"); - //Check Vref is burned into eFuse -// ESP_LOGI(TAG, "eFuse Vref: %supported", (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_VREF) == ESP_OK) ? "S":"NOT s"); - adc_state = malloc(sizeof(ADC_State)); for (i = 0; i < 3; i++) { adc_state->Pressure[i].valid = false; -// adc_state->Pressure[i].atten = ADC_ATTEN_DB_2_5; // Optimal 100..1250 mV, max 1500 mV. max 4,5 bar. - adc_state->Pressure[i].atten = ADC_ATTEN_DB_6; // Optimal 150..1750 mV, max 2200 mV, max 6,3 bar. + adc_state->Pressure[i].atten = ADC_ATTEN_DB_0; adc_state->Pressure[i].voltage = 0; adc_state->Pressure[i].error = ADC_ERR_NONE; } @@ -92,8 +71,6 @@ //Characterize ADC esp_adc_cal_characteristics_t *adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t)); -// esp_adc_cal_value_t val_type = esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_6, ADC_WIDTH_BIT_11, DEFAULT_VREF, adc_chars); -// print_char_val_type(val_type); /* event handler and event group for this task */ xEventGroupADC = xEventGroupCreate(); @@ -108,7 +85,8 @@ if (uxBits & TASK_ADC_REQUEST_PRESSURE) { - adc1_config_width(ADC_WIDTH_BIT_11); + ESP_LOGI(TAG, "Requested ADC readings"); + adc1_config_width(ADC_WIDTH_BIT_12); for (i = 0; i < 3; i++) { adc_reading = 0; @@ -118,18 +96,14 @@ * Autoranging the ADC conversion */ while (1) { - esp_adc_cal_characterize(ADC_UNIT_1, atten, ADC_WIDTH_BIT_11, DEFAULT_VREF, adc_chars); + esp_adc_cal_characterize(ADC_UNIT_1, atten, ADC_WIDTH_BIT_12, DEFAULT_VREF, adc_chars); adc1_config_channel_atten((adc1_channel_t)adc_state->Pressure[i].channel, atten); int raw = adc1_get_raw((adc1_channel_t)adc_state->Pressure[i].channel); -// printf("raw: %d atten: %d\n", raw, atten); -// if (raw < 3400) -// break; - - if (atten == ADC_ATTEN_DB_0 && raw > 1850) + if (atten == ADC_ATTEN_DB_0 && raw > 3700) atten = ADC_ATTEN_DB_2_5; - else if (atten == ADC_ATTEN_DB_2_5 && raw > 1850) + else if (atten == ADC_ATTEN_DB_2_5 && raw > 3700) atten = ADC_ATTEN_DB_6; - else if (atten == ADC_ATTEN_DB_6 && raw > 1850) + else if (atten == ADC_ATTEN_DB_6 && raw > 3700) atten = ADC_ATTEN_DB_11; else break; @@ -140,44 +114,56 @@ */ for (int j = 0; j < NO_OF_SAMPLES; j++) { int tmp = adc1_get_raw((adc1_channel_t)adc_state->Pressure[i].channel); + if (tmp < 0) { + adc_reading = -1; + break; + } adc_reading += tmp; -// printf("%4d ", tmp); - //adc_reading += adc1_get_raw((adc1_channel_t)adc_state->Pressure[i].channel); } -// printf("\n"); - if (adc_reading < 0) { - adc_state->Pressure[i].error = ADC_ERR_READ; - adc_state->Pressure[i].voltage = 0; - } else { - adc_reading /= NO_OF_SAMPLES; - if (xSemaphoreTake(xSemaphoreADC, 25) == pdTRUE) { + if (xSemaphoreTake(xSemaphoreADC, 10) == pdTRUE) { + if (adc_reading < 0) { + adc_state->Pressure[i].error = ADC_ERR_READ; + adc_state->Pressure[i].voltage = 0; + } else { + adc_reading /= NO_OF_SAMPLES; adc_state->Pressure[i].voltage = esp_adc_cal_raw_to_voltage(adc_reading, adc_chars); // voltage in mV adc_state->Pressure[i].error = ADC_ERR_NONE; - xSemaphoreGive(xSemaphoreADC); } + xSemaphoreGive(xSemaphoreADC); + } else { + ESP_LOGE(TAG, "Missed lock 1"); } ESP_LOGI(TAG, "Pressure %d raw: %4d, atten: %d, %.3f volt, error: %d", i, adc_reading, atten, adc_state->Pressure[i].voltage / 1000.0, adc_state->Pressure[i].error); } + /* + * Read VDD by reading 1/2 VDD from a precision ladder. + */ adc_reading = 0; atten = ADC_ATTEN_DB_6; // Don't use DB_11, it has a bad linearity. - esp_adc_cal_characterize(ADC_UNIT_1, atten, ADC_WIDTH_BIT_11, DEFAULT_VREF, adc_chars); + esp_adc_cal_characterize(ADC_UNIT_1, atten, ADC_WIDTH_BIT_12, DEFAULT_VREF, adc_chars); adc1_config_channel_atten((adc1_channel_t)BATT_CHANNEL, atten); for (int j = 0; j < NO_OF_SAMPLES; j++) { - adc_reading += adc1_get_raw((adc1_channel_t)BATT_CHANNEL); + int tmp = adc1_get_raw((adc1_channel_t)BATT_CHANNEL); + if (tmp < 0) { + adc_reading = -1; + break; + } + adc_reading += tmp; } - - if (adc_reading < 0) { - adc_state->Batt_voltage = 0; - adc_state->Batt_error = ADC_ERR_READ; - } else { - adc_reading /= NO_OF_SAMPLES; - if (xSemaphoreTake(xSemaphoreADC, 25) == pdTRUE) { + if (xSemaphoreTake(xSemaphoreADC, 10) == pdTRUE) { + if (adc_reading < 0) { + adc_state->Batt_voltage = 3.3; + adc_state->Batt_error = ADC_ERR_READ; + } else { + adc_reading /= NO_OF_SAMPLES; adc_state->Batt_voltage = esp_adc_cal_raw_to_voltage(adc_reading, adc_chars) * 2; // Chip supply voltage in mV adc_state->Batt_error = ADC_ERR_NONE; - xSemaphoreGive(xSemaphoreADC); - } + } + xSemaphoreGive(xSemaphoreADC); + } else { + ESP_LOGE(TAG, "Missed lock 2"); } xEventGroupClearBits(xEventGroupADC, TASK_ADC_REQUEST_PRESSURE); @@ -186,7 +172,6 @@ ESP_LOGI(TAG, "Battery raw: %4d, atten: %d %.3f volt, error: %d", adc_reading, atten, adc_state->Batt_voltage / 1000.0, adc_state->Batt_error); #endif } - vTaskDelay( (TickType_t)10); } } diff -r e33f2d325d15 -r 7dc9003f86a8 main/task_ds18b20.c --- a/main/task_ds18b20.c Sun Oct 13 12:24:14 2019 +0200 +++ b/main/task_ds18b20.c Sun Oct 13 19:27:12 2019 +0200 @@ -1,8 +1,7 @@ /** * @file task_ds18b20.c - * @brief The FreeRTOS task to query the DS18B20 sensors on one or two - * one-wire busses. Each bus must have only one sensor. That way - * we don't need to care about the DS18B20 internal ROM address. + * @brief The FreeRTOS task to query the DS18B20 sensors on the + * one-wire bus. * The task will update the DS18B20_State structure. */ @@ -158,6 +157,8 @@ } ds18b20_state->num_sensors = num_devices; xSemaphoreGive(xSemaphoreDS18B20); + } else { + ESP_LOGE(TAG, "Missed lock 1"); } } else { @@ -175,12 +176,13 @@ ds18b20_state->sensor[i].error = DS18B20_ERR_READ; } xSemaphoreGive(xSemaphoreDS18B20); + } else { + ESP_LOGE(TAG, "Missed lock 2"); } xEventGroupClearBits(xEventGroupDS18B20, TASK_DS18B20_REQUEST_TEMPS); xEventGroupSetBits(xEventGroupDS18B20, TASK_DS18B20_REQUEST_DONE); } - vTaskDelay(10 / portTICK_PERIOD_MS); } } diff -r e33f2d325d15 -r 7dc9003f86a8 main/task_mqtt.c --- a/main/task_mqtt.c Sun Oct 13 12:24:14 2019 +0200 +++ b/main/task_mqtt.c Sun Oct 13 19:27:12 2019 +0200 @@ -86,18 +86,21 @@ void publisher(char *topic, char *payload) { - // publish the data + /* + * First count, then sent the data. + */ + if (xSemaphoreTake(xSemaphorePcounter, 10) == pdTRUE) { + count_pub++; +printf(" up %d\n", count_pub); + xSemaphoreGive(xSemaphorePcounter); + } else { + ESP_LOGE(TAG, "Missed lock 1"); + } + if (payload) esp_mqtt_client_publish(client, topic, payload, strlen(payload), 1, 0); else esp_mqtt_client_publish(client, topic, NULL, 0, 1, 0); - if (xSemaphoreTake(xSemaphorePcounter, 10) == pdTRUE) { - count_pub++; -printf(" up %d\n", count_pub); - xSemaphoreGive(xSemaphorePcounter); - } else { - ESP_LOGE(TAG, "Missed lock 1"); - } }