28 const int TASK_ADC_REQUEST_PRESSURE = BIT0; ///< Request temperature measurements |
28 const int TASK_ADC_REQUEST_PRESSURE = BIT0; ///< Request temperature measurements |
29 const int TASK_ADC_REQUEST_DONE = BIT1; ///< Request is completed |
29 const int TASK_ADC_REQUEST_DONE = BIT1; ///< Request is completed |
30 |
30 |
31 |
31 |
32 static bool adc_calibration_init(adc_unit_t unit, adc_atten_t atten, adc_cali_handle_t *out_handle); |
32 static bool adc_calibration_init(adc_unit_t unit, adc_atten_t atten, adc_cali_handle_t *out_handle); |
33 static void adc_calibration_deinit(adc_cali_handle_t handle); |
|
34 |
33 |
35 |
34 |
36 void request_adc(void) |
35 void request_adc(void) |
37 { |
36 { |
38 xEventGroupClearBits(xEventGroupADC, TASK_ADC_REQUEST_DONE); |
37 xEventGroupClearBits(xEventGroupADC, TASK_ADC_REQUEST_DONE); |
142 adc_reading = -1; |
141 adc_reading = -1; |
143 break; |
142 break; |
144 } |
143 } |
145 } |
144 } |
146 |
145 |
147 adc1_cali_handle = NULL; |
|
148 do_calibration = adc_calibration_init(ADC_UNIT_1, atten, &adc1_cali_handle); |
146 do_calibration = adc_calibration_init(ADC_UNIT_1, atten, &adc1_cali_handle); |
149 |
147 |
150 if (xSemaphoreTake(xSemaphoreADC, 10) == pdTRUE) { |
148 if (xSemaphoreTake(xSemaphoreADC, 10) == pdTRUE) { |
151 if (adc_reading < 0) { |
149 if (adc_reading < 0) { |
152 adc_state->Pressure[i].error = ADC_ERR_READ; |
150 adc_state->Pressure[i].error = ADC_ERR_READ; |
153 adc_state->Pressure[i].voltage = 0; |
151 adc_state->Pressure[i].voltage = 0; |
154 } else { |
152 } else { |
155 adc_reading /= NO_OF_SAMPLES; |
153 adc_reading /= NO_OF_SAMPLES; |
156 adc_cali_raw_to_voltage(adc1_cali_handle, adc_reading, &voltage); |
154 adc_cali_raw_to_voltage(adc1_cali_handle, adc_reading, &voltage); // voltage in mV |
157 adc_state->Pressure[i].voltage = voltage; |
155 adc_state->Pressure[i].voltage = voltage; |
158 //adc_state->Pressure[i].voltage = esp_adc_cal_raw_to_voltage(adc_reading, adc_chars); // voltage in mV |
|
159 // ESP_LOGI(TAG, "Voltage %d %d", i, voltage); |
|
160 adc_state->Pressure[i].error = ADC_ERR_NONE; |
156 adc_state->Pressure[i].error = ADC_ERR_NONE; |
161 } |
157 } |
162 xSemaphoreGive(xSemaphoreADC); |
158 xSemaphoreGive(xSemaphoreADC); |
163 } else { |
159 } else { |
164 ESP_LOGE(TAG, "Missed lock 1"); |
160 ESP_LOGE(TAG, "Missed lock 1"); |
165 } |
161 } |
166 ESP_LOGI(TAG, "Pressure %d raw: %4d, atten: %d, %.3f volt, error: %d", |
162 ESP_LOGI(TAG, "Pressure %d raw: %4d, atten: %d, %.3f volt, error: %d", |
167 i, adc_reading, atten, (adc_state->Pressure[i].voltage / 1000.0), adc_state->Pressure[i].error); |
163 i, adc_reading, atten, (adc_state->Pressure[i].voltage / 1000.0), adc_state->Pressure[i].error); |
168 |
164 |
169 //Tear Down |
165 //Tear Down |
170 ESP_ERROR_CHECK(adc_oneshot_del_unit(adc1_handle)); |
166 adc_oneshot_del_unit(adc1_handle); |
171 if (do_calibration) { |
167 if (do_calibration) { |
172 adc_calibration_deinit(adc1_cali_handle); |
168 adc_cali_delete_scheme_line_fitting(adc1_cali_handle); |
173 } |
169 } |
174 do_calibration = false; |
170 do_calibration = false; |
175 } |
171 } |
176 |
172 |
177 /* |
173 /* |
178 * Read VDD by reading 1/2 VDD from a precision ladder. |
174 * Read VDD by reading 1/2 VDD from a precision ladder. |
179 */ |
175 */ |
180 adc_reading = 0; |
176 adc_reading = 0; |
181 atten = ADC_ATTEN_DB_6; // Don't use DB_11, it has a bad linearity. |
177 atten = ADC_ATTEN_DB_6; // Don't use DB_11, it has a bad linearity. |
182 adc1_cali_handle = NULL; |
|
183 channel = (adc_unit_t)BATT_CHANNEL; |
178 channel = (adc_unit_t)BATT_CHANNEL; |
184 ESP_ERROR_CHECK(adc_oneshot_new_unit(&init_config1, &adc1_handle)); |
179 ESP_ERROR_CHECK(adc_oneshot_new_unit(&init_config1, &adc1_handle)); |
185 do_calibration = adc_calibration_init(ADC_UNIT_1, atten, &adc1_cali_handle); |
180 do_calibration = adc_calibration_init(ADC_UNIT_1, atten, &adc1_cali_handle); |
186 |
181 |
187 config_adc.bitwidth = ADC_BITWIDTH_DEFAULT; |
182 config_adc.bitwidth = ADC_BITWIDTH_DEFAULT; |
212 xSemaphoreGive(xSemaphoreADC); |
207 xSemaphoreGive(xSemaphoreADC); |
213 } else { |
208 } else { |
214 ESP_LOGE(TAG, "Missed lock 2"); |
209 ESP_LOGE(TAG, "Missed lock 2"); |
215 } |
210 } |
216 |
211 |
217 ESP_ERROR_CHECK(adc_oneshot_del_unit(adc1_handle)); |
212 adc_oneshot_del_unit(adc1_handle); |
218 if (do_calibration) { |
213 if (do_calibration) { |
219 adc_calibration_deinit(adc1_cali_handle); |
214 adc_cali_delete_scheme_line_fitting(adc1_cali_handle); |
220 } |
215 } |
221 do_calibration = false; |
216 do_calibration = false; |
222 |
217 |
223 xEventGroupClearBits(xEventGroupADC, TASK_ADC_REQUEST_PRESSURE); |
218 xEventGroupClearBits(xEventGroupADC, TASK_ADC_REQUEST_PRESSURE); |
224 xEventGroupSetBits(xEventGroupADC, TASK_ADC_REQUEST_DONE); |
219 xEventGroupSetBits(xEventGroupADC, TASK_ADC_REQUEST_DONE); |
234 ADC Calibration |
229 ADC Calibration |
235 ---------------------------------------------------------------*/ |
230 ---------------------------------------------------------------*/ |
236 static bool adc_calibration_init(adc_unit_t unit, adc_atten_t atten, adc_cali_handle_t *out_handle) |
231 static bool adc_calibration_init(adc_unit_t unit, adc_atten_t atten, adc_cali_handle_t *out_handle) |
237 { |
232 { |
238 adc_cali_handle_t handle = NULL; |
233 adc_cali_handle_t handle = NULL; |
239 esp_err_t ret = ESP_FAIL; |
|
240 bool calibrated = false; |
234 bool calibrated = false; |
241 |
235 |
242 if (!calibrated) { |
236 adc_cali_line_fitting_config_t cali_config = { |
243 adc_cali_line_fitting_config_t cali_config = { |
237 .unit_id = unit, |
244 .unit_id = unit, |
238 .atten = atten, |
245 .atten = atten, |
239 .bitwidth = ADC_BITWIDTH_DEFAULT, |
246 .bitwidth = ADC_BITWIDTH_DEFAULT, |
240 }; |
247 }; |
241 esp_err_t ret = adc_cali_create_scheme_line_fitting(&cali_config, &handle); |
248 ret = adc_cali_create_scheme_line_fitting(&cali_config, &handle); |
242 if (ret == ESP_OK) { |
249 if (ret == ESP_OK) { |
243 calibrated = true; |
250 calibrated = true; |
|
251 } |
|
252 } |
244 } |
253 |
245 |
254 *out_handle = handle; |
246 *out_handle = handle; |
255 if (ret == ESP_ERR_NOT_SUPPORTED || !calibrated) { |
247 if (ret == ESP_ERR_NOT_SUPPORTED || !calibrated) { |
256 ESP_LOGW(TAG, "eFuse not burnt, skip software calibration"); |
248 ESP_LOGW(TAG, "eFuse not burnt, skip software calibration"); |