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.

Sun, 13 Oct 2019 19:27:12 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Sun, 13 Oct 2019 19:27:12 +0200
changeset 12
7dc9003f86a8
parent 11
e33f2d325d15
child 13
7de246feba5f

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.

main/task_adc.c file | annotate | diff | comparison | revisions
main/task_ds18b20.c file | annotate | diff | comparison | revisions
main/task_mqtt.c file | annotate | diff | comparison | revisions
--- 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);
     }
 }
 
--- 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);
     }
 }
 
--- 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");
-    }
 }
 
 

mercurial