Select one of the symbols to view example projects that use it.
 
Outline
#include <string.h>
#include <stdio.h>
#include "sdkconfig.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
#include "esp_adc/adc_continuous.h"
#define EXAMPLE_ADC_UNIT
#define _EXAMPLE_ADC_UNIT_STR
#define EXAMPLE_ADC_UNIT_STR
#define EXAMPLE_ADC_CONV_MODE
#define EXAMPLE_ADC_ATTEN
#define EXAMPLE_ADC_BIT_WIDTH
#define EXAMPLE_ADC_OUTPUT_TYPE
#define EXAMPLE_ADC_GET_CHANNEL
#define EXAMPLE_ADC_GET_DATA
#define EXAMPLE_ADC_OUTPUT_TYPE
#define EXAMPLE_ADC_GET_CHANNEL
#define EXAMPLE_ADC_GET_DATA
#define EXAMPLE_READ_LEN
channel
s_task_handle
TAG
s_conv_done_cb(adc_continuous_handle_t, const adc_continuous_evt_data_t *, void *)
continuous_adc_init(adc_channel_t *, uint8_t, adc_continuous_handle_t *)
app_main()
Files
loading...
SourceVuESP-IDF Framework and Examplescontinuous_read samplemain/continuous_read_main.c
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/* * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 *//* ... */ #include <string.h> #include <stdio.h> #include "sdkconfig.h" #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/semphr.h" #include "esp_adc/adc_continuous.h"8 includes #define EXAMPLE_ADC_UNIT ADC_UNIT_1 #define _EXAMPLE_ADC_UNIT_STR(unit) #unit #define EXAMPLE_ADC_UNIT_STR(unit) _EXAMPLE_ADC_UNIT_STR(unit) #define EXAMPLE_ADC_CONV_MODE ADC_CONV_SINGLE_UNIT_1 #define EXAMPLE_ADC_ATTEN ADC_ATTEN_DB_0 #define EXAMPLE_ADC_BIT_WIDTH SOC_ADC_DIGI_MAX_BITWIDTH6 defines #if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 #define EXAMPLE_ADC_OUTPUT_TYPE ADC_DIGI_OUTPUT_FORMAT_TYPE1 #define EXAMPLE_ADC_GET_CHANNEL(p_data) ((p_data)->type1.channel) #define EXAMPLE_ADC_GET_DATA(p_data) ((p_data)->type1.data)/* ... */ #else #define EXAMPLE_ADC_OUTPUT_TYPE ADC_DIGI_OUTPUT_FORMAT_TYPE2 #define EXAMPLE_ADC_GET_CHANNEL(p_data) ((p_data)->type2.channel) #define EXAMPLE_ADC_GET_DATA(p_data) ((p_data)->type2.data)/* ... */ #endif #define EXAMPLE_READ_LEN 256 #if CONFIG_IDF_TARGET_ESP32 static adc_channel_t channel[2] = {ADC_CHANNEL_6, ADC_CHANNEL_7}; #else static adc_channel_t channel[2] = {ADC_CHANNEL_2, ADC_CHANNEL_3}; #endif static TaskHandle_t s_task_handle; static const char *TAG = "EXAMPLE"; static bool IRAM_ATTR s_conv_done_cb(adc_continuous_handle_t handle, const adc_continuous_evt_data_t *edata, void *user_data) { BaseType_t mustYield = pdFALSE; //Notify that ADC continuous driver has done enough number of conversions vTaskNotifyGiveFromISR(s_task_handle, &mustYield); return (mustYield == pdTRUE); }{ ... } static void continuous_adc_init(adc_channel_t *channel, uint8_t channel_num, adc_continuous_handle_t *out_handle) { adc_continuous_handle_t handle = NULL; adc_continuous_handle_cfg_t adc_config = { .max_store_buf_size = 1024, .conv_frame_size = EXAMPLE_READ_LEN, }{...}; ESP_ERROR_CHECK(adc_continuous_new_handle(&adc_config, &handle)); adc_continuous_config_t dig_cfg = { .sample_freq_hz = 20 * 1000, .conv_mode = EXAMPLE_ADC_CONV_MODE, .format = EXAMPLE_ADC_OUTPUT_TYPE, }{...}; adc_digi_pattern_config_t adc_pattern[SOC_ADC_PATT_LEN_MAX] = {0}; dig_cfg.pattern_num = channel_num; for (int i = 0; i < channel_num; i++) { adc_pattern[i].atten = EXAMPLE_ADC_ATTEN; adc_pattern[i].channel = channel[i] & 0x7; adc_pattern[i].unit = EXAMPLE_ADC_UNIT; adc_pattern[i].bit_width = EXAMPLE_ADC_BIT_WIDTH; ESP_LOGI(TAG, "adc_pattern[%d].atten is :%"PRIx8, i, adc_pattern[i].atten); ESP_LOGI(TAG, "adc_pattern[%d].channel is :%"PRIx8, i, adc_pattern[i].channel); ESP_LOGI(TAG, "adc_pattern[%d].unit is :%"PRIx8, i, adc_pattern[i].unit); }{...} dig_cfg.adc_pattern = adc_pattern; ESP_ERROR_CHECK(adc_continuous_config(handle, &dig_cfg)); *out_handle = handle; }{ ... } void app_main(void) { esp_err_t ret; uint32_t ret_num = 0; uint8_t result[EXAMPLE_READ_LEN] = {0}; memset(result, 0xcc, EXAMPLE_READ_LEN); s_task_handle = xTaskGetCurrentTaskHandle(); adc_continuous_handle_t handle = NULL; continuous_adc_init(channel, sizeof(channel) / sizeof(adc_channel_t), &handle); adc_continuous_evt_cbs_t cbs = { .on_conv_done = s_conv_done_cb, }{...}; ESP_ERROR_CHECK(adc_continuous_register_event_callbacks(handle, &cbs, NULL)); ESP_ERROR_CHECK(adc_continuous_start(handle)); while (1) { /** * This is to show you the way to use the ADC continuous mode driver event callback. * This `ulTaskNotifyTake` will block when the data processing in the task is fast. * However in this example, the data processing (print) is slow, so you barely block here. * * Without using this event callback (to notify this task), you can still just call * `adc_continuous_read()` here in a loop, with/without a certain block timeout. *//* ... */ ulTaskNotifyTake(pdTRUE, portMAX_DELAY); char unit[] = EXAMPLE_ADC_UNIT_STR(EXAMPLE_ADC_UNIT); while (1) { ret = adc_continuous_read(handle, result, EXAMPLE_READ_LEN, &ret_num, 0); if (ret == ESP_OK) { ESP_LOGI("TASK", "ret is %x, ret_num is %"PRIu32" bytes", ret, ret_num); for (int i = 0; i < ret_num; i += SOC_ADC_DIGI_RESULT_BYTES) { adc_digi_output_data_t *p = (adc_digi_output_data_t*)&result[i]; uint32_t chan_num = EXAMPLE_ADC_GET_CHANNEL(p); uint32_t data = EXAMPLE_ADC_GET_DATA(p); /* Check the channel number validation, the data is invalid if the channel num exceed the maximum channel */ if (chan_num < SOC_ADC_CHANNEL_NUM(EXAMPLE_ADC_UNIT)) { ESP_LOGI(TAG, "Unit: %s, Channel: %"PRIu32", Value: %"PRIx32, unit, chan_num, data); }{...} else { ESP_LOGW(TAG, "Invalid data [%s_%"PRIu32"_%"PRIx32"]", unit, chan_num, data); }{...} }{...} /** * Because printing is slow, so every time you call `ulTaskNotifyTake`, it will immediately return. * To avoid a task watchdog timeout, add a delay here. When you replace the way you process the data, * usually you don't need this delay (as this task will block for a while). *//* ... */ vTaskDelay(1); }{...} else if (ret == ESP_ERR_TIMEOUT) { //We try to read `EXAMPLE_READ_LEN` until API returns timeout, which means there's no available data break; }{...} }{...} }{...} ESP_ERROR_CHECK(adc_continuous_stop(handle)); ESP_ERROR_CHECK(adc_continuous_deinit(handle)); }{ ... }
Details
Show:
from
Types: Columns:
This file uses the notable symbols shown below. Click anywhere in the file to view more details.