main/task_adc.c

changeset 76
0432d9147682
parent 68
121b3fa6b806
equal deleted inserted replaced
75:7425fa11f23e 76:0432d9147682
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");
259 } 251 }
260 252
261 return calibrated; 253 return calibrated;
262 } 254 }
263 255
264
265 static void adc_calibration_deinit(adc_cali_handle_t handle)
266 {
267 ESP_ERROR_CHECK(adc_cali_delete_scheme_line_fitting(handle));
268 }
269

mercurial