/ components / driver / test / test_adc_common.c
test_adc_common.c
  1  /*
  2   Tests for the adc device driver
  3  */
  4  #include "esp_system.h"
  5  #include "driver/adc.h"
  6  #include "driver/dac.h"
  7  #include "driver/rtc_io.h"
  8  #include "driver/gpio.h"
  9  #include "unity.h"
 10  #include "esp_system.h"
 11  #include "esp_event.h"
 12  #include "esp_wifi.h"
 13  #include "esp_log.h"
 14  #include "nvs_flash.h"
 15  #include "test_utils.h"
 16  #include "soc/adc_periph.h"
 17  
 18  #if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3)
 19  
 20  static const char *TAG = "test_adc";
 21  
 22  #ifdef CONFIG_IDF_TARGET_ESP32
 23  #define ADC1_TEST_WIDTH         ADC_WIDTH_BIT_12
 24  #define ADC2_TEST_WIDTH         ADC_WIDTH_BIT_12
 25  #elif defined CONFIG_IDF_TARGET_ESP32S2
 26  #define ADC1_TEST_WIDTH         ADC_WIDTH_BIT_13   //ESP32S2 only support 13 bit width
 27  #define ADC2_TEST_WIDTH         ADC_WIDTH_BIT_13   //ESP32S2 only support 13 bit width
 28  #endif
 29  
 30  #define ADC1_TEST_ATTEN         ADC_ATTEN_DB_11
 31  #define ADC2_TEST_ATTEN         ADC_ATTEN_DB_11
 32  
 33  #if CONFIG_IDF_TARGET_ESP32
 34  #define ADC1_TEST_CHANNEL_NUM   8
 35  #elif CONFIG_IDF_TARGET_ESP32S2
 36  #define ADC1_TEST_CHANNEL_NUM   10
 37  #endif
 38  #define ADC2_TEST_CHANNEL_NUM   6
 39  
 40  static const int adc1_ch[ADC1_TEST_CHANNEL_NUM] = {
 41      ADC1_CHANNEL_0,
 42      ADC1_CHANNEL_1,
 43      ADC1_CHANNEL_2,
 44      ADC1_CHANNEL_3,
 45      ADC1_CHANNEL_4,
 46      ADC1_CHANNEL_5,
 47      ADC1_CHANNEL_6,
 48      ADC1_CHANNEL_7,
 49  #if CONFIG_IDF_TARGET_ESP32S2
 50      ADC1_CHANNEL_8,
 51      ADC1_CHANNEL_9,
 52  #endif
 53  };
 54  
 55  static const int adc2_ch[ADC2_TEST_CHANNEL_NUM] = {
 56      ADC2_CHANNEL_0,
 57      ADC2_CHANNEL_1,
 58      ADC2_CHANNEL_2,
 59      ADC2_CHANNEL_3,
 60      ADC2_CHANNEL_4,
 61      ADC2_CHANNEL_5,
 62  };
 63  
 64  #define ADC_GET_IO_NUM(periph, channel) (adc_channel_io_map[periph][channel])
 65  
 66  void adc_fake_tie_middle(adc_unit_t adc_unit, adc_channel_t channel)
 67  {
 68      gpio_num_t gpio_num = 0;
 69      if (adc_unit & ADC_UNIT_1) {
 70          gpio_num = ADC_GET_IO_NUM(0, channel);
 71          TEST_ESP_OK(rtc_gpio_init(gpio_num));
 72          TEST_ESP_OK(rtc_gpio_pullup_en(gpio_num));
 73          TEST_ESP_OK(rtc_gpio_pulldown_en(gpio_num));
 74          TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_PULLUP_PULLDOWN));
 75          TEST_ESP_OK(rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_DISABLED));
 76      }
 77      if (adc_unit & ADC_UNIT_2) {
 78          gpio_num = ADC_GET_IO_NUM(1, channel);
 79          TEST_ESP_OK(rtc_gpio_init(gpio_num));
 80          TEST_ESP_OK(rtc_gpio_pullup_en(gpio_num));
 81          TEST_ESP_OK(rtc_gpio_pulldown_en(gpio_num));
 82          TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_PULLUP_PULLDOWN));
 83          TEST_ESP_OK(rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_DISABLED));
 84      }
 85      vTaskDelay(10 / portTICK_RATE_MS);
 86  }
 87  
 88  void adc_fake_tie_high(adc_unit_t adc_unit, adc_channel_t channel)
 89  {
 90      gpio_num_t gpio_num = 0;
 91      if (adc_unit & ADC_UNIT_1) {
 92          gpio_num = ADC_GET_IO_NUM(0, channel);
 93          TEST_ESP_OK(rtc_gpio_init(gpio_num));
 94          TEST_ESP_OK(rtc_gpio_pullup_en(gpio_num));
 95          TEST_ESP_OK(rtc_gpio_pulldown_dis(gpio_num));
 96          TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_PULLUP_ONLY));
 97          TEST_ESP_OK(rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_OUTPUT_ONLY));
 98          TEST_ESP_OK(rtc_gpio_set_level(gpio_num, 1));
 99      }
100      if (adc_unit & ADC_UNIT_2) {
101          gpio_num = ADC_GET_IO_NUM(1, channel);
102          TEST_ESP_OK(rtc_gpio_init(gpio_num));
103          TEST_ESP_OK(rtc_gpio_pullup_en(gpio_num));
104          TEST_ESP_OK(rtc_gpio_pulldown_dis(gpio_num));
105          TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_PULLUP_ONLY));
106          TEST_ESP_OK(rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_OUTPUT_ONLY));
107          TEST_ESP_OK(rtc_gpio_set_level(gpio_num, 1));
108      }
109      vTaskDelay(10 / portTICK_RATE_MS);
110  }
111  
112  void adc_fake_tie_low(adc_unit_t adc_unit, adc_channel_t channel)
113  {
114      gpio_num_t gpio_num = 0;
115      if (adc_unit & ADC_UNIT_1) {
116          gpio_num = ADC_GET_IO_NUM(0, channel);
117          TEST_ESP_OK(rtc_gpio_init(gpio_num));
118          TEST_ESP_OK(rtc_gpio_pullup_dis(gpio_num));
119          TEST_ESP_OK(rtc_gpio_pulldown_en(gpio_num));
120          TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_PULLDOWN_ONLY));
121          TEST_ESP_OK(rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_OUTPUT_ONLY));
122          TEST_ESP_OK(rtc_gpio_set_level(gpio_num, 0));
123      }
124      if (adc_unit & ADC_UNIT_2) {
125          gpio_num = ADC_GET_IO_NUM(1, channel);
126          TEST_ESP_OK(rtc_gpio_init(gpio_num));
127          TEST_ESP_OK(rtc_gpio_pullup_dis(gpio_num));
128          TEST_ESP_OK(rtc_gpio_pulldown_en(gpio_num));
129          TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_PULLDOWN_ONLY));
130          TEST_ESP_OK(rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_OUTPUT_ONLY));
131          TEST_ESP_OK(rtc_gpio_set_level(gpio_num, 0));
132      }
133      vTaskDelay(10 / portTICK_RATE_MS);
134  }
135  
136  void adc_io_normal(adc_unit_t adc_unit, adc_channel_t channel)
137  {
138      gpio_num_t gpio_num = 0;
139      if (adc_unit & ADC_UNIT_1) {
140          gpio_num = ADC_GET_IO_NUM(0, channel);
141          TEST_ESP_OK(rtc_gpio_init(gpio_num));
142          TEST_ESP_OK(rtc_gpio_pullup_dis(gpio_num));
143          TEST_ESP_OK(rtc_gpio_pulldown_dis(gpio_num));
144          TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_FLOATING));
145          TEST_ESP_OK(rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_DISABLED));
146      }
147      if (adc_unit & ADC_UNIT_2) {
148          gpio_num = ADC_GET_IO_NUM(1, channel);
149          TEST_ESP_OK(rtc_gpio_init(gpio_num));
150          TEST_ESP_OK(rtc_gpio_pullup_dis(gpio_num));
151          TEST_ESP_OK(rtc_gpio_pulldown_dis(gpio_num));
152          TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_FLOATING));
153          TEST_ESP_OK(rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_DISABLED));
154      }
155      vTaskDelay(10 / portTICK_RATE_MS);
156  }
157  
158  TEST_CASE("ADC1 rtc read", "[adc1]")
159  {
160      int adc1_val[ADC1_TEST_CHANNEL_NUM] = {0};
161  
162      /* adc1 Configure */
163      adc1_config_width(ADC1_TEST_WIDTH);
164      ESP_LOGI(TAG, "ADC1 [CH - GPIO]:");
165      for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
166          TEST_ESP_OK( adc1_config_channel_atten(adc1_ch[i], ADC1_TEST_ATTEN) );
167          ESP_LOGI(TAG, "[CH%d - IO%d]:", adc1_ch[i], ADC_GET_IO_NUM(0, adc1_ch[i]));
168      }
169      printf("ADC tie normal read: ");
170      vTaskDelay(10 / portTICK_RATE_MS);
171  
172      /* adc Read */
173      printf("ADC1: ");
174      for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
175          adc1_val[i] = adc1_get_raw((adc1_channel_t)adc1_ch[i]);
176          printf("CH%d-%d ", adc1_ch[i], adc1_val[i]);
177      }
178      printf("\n");
179  
180      /* tie high */
181      for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
182          adc_fake_tie_high(ADC_UNIT_1, adc1_ch[i]);
183      }
184      printf("ADC tie high read: ");
185      vTaskDelay(50 / portTICK_RATE_MS);
186      /* adc Read */
187      printf("ADC1: ");
188      for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
189          adc1_val[i] = adc1_get_raw((adc1_channel_t)adc1_ch[i]);
190          printf("CH%d-%d ", adc1_ch[i], adc1_val[i]);
191  #ifdef CONFIG_IDF_TARGET_ESP32S2
192          TEST_ASSERT_EQUAL( adc1_val[i], 0x1fff );
193  #endif
194      }
195      printf("\n");
196  
197      /* tie low */
198      for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
199          adc_fake_tie_low(ADC_UNIT_1, adc1_ch[i]);
200      }
201      printf("ADC tie low  read: ");
202      vTaskDelay(50 / portTICK_RATE_MS);
203      /* adc Read */
204      printf("ADC1: ");
205      for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
206          adc1_val[i] = adc1_get_raw((adc1_channel_t)adc1_ch[i]);
207          printf("CH%d-%d ", adc1_ch[i], adc1_val[i]);
208  #ifdef CONFIG_IDF_TARGET_ESP32S2
209          TEST_ASSERT_INT_WITHIN( 100, 0, adc1_val[i] );
210  #endif
211      }
212      printf("\n");
213  
214      /* tie midedle */
215      for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
216          adc_fake_tie_middle(ADC_UNIT_1, adc1_ch[i]);
217      }
218      printf("ADC tie mid  read: ");
219      vTaskDelay(50 / portTICK_RATE_MS);
220      /* adc Read */
221      printf("ADC1: ");
222      for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
223          adc1_val[i] = adc1_get_raw((adc1_channel_t)adc1_ch[i]);
224          printf("CH%d-%d ", adc1_ch[i], adc1_val[i]);
225  #ifdef CONFIG_IDF_TARGET_ESP32S2
226          TEST_ASSERT_NOT_EQUAL( adc1_val[i], 0x1fff );
227          TEST_ASSERT_NOT_EQUAL( adc1_val[i], 0 );
228  #endif
229      }
230      printf("\n");
231  
232      for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
233          adc_io_normal(ADC_UNIT_1, adc1_ch[i]);
234      }
235  }
236  
237  TEST_CASE("ADC2 rtc read", "[adc2]")
238  {
239      int adc2_val[ADC2_TEST_CHANNEL_NUM] = {0};
240  
241      /* adc2 Configure */
242      ESP_LOGI(TAG, "ADC2 [CH - GPIO]:");
243      for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
244          TEST_ESP_OK( adc2_config_channel_atten(adc2_ch[i], ADC2_TEST_ATTEN) );
245          ESP_LOGI(TAG, "[CH%d - IO%d]:", adc2_ch[i], ADC_GET_IO_NUM(1, adc2_ch[i]));
246      }
247      printf("ADC float read: ");
248      vTaskDelay(10 / portTICK_RATE_MS);
249  
250      /* adc Read */
251      printf("ADC2: ");
252      for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
253          TEST_ESP_OK( adc2_get_raw((adc2_channel_t)adc2_ch[i], ADC2_TEST_WIDTH, &adc2_val[i]) );
254          printf("CH%d-%d ", adc2_ch[i], adc2_val[i]);
255      }
256      printf("\n");
257  
258      /* tie high */
259      for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
260          adc_fake_tie_high(ADC_UNIT_2, adc2_ch[i]);
261      }
262      printf("ADC tie high read: ");
263      vTaskDelay(10 / portTICK_RATE_MS);
264      /* adc Read */
265      printf("ADC2: ");
266      for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
267          TEST_ESP_OK( adc2_get_raw((adc2_channel_t)adc2_ch[i], ADC2_TEST_WIDTH, &adc2_val[i]) );
268          printf("CH%d-%d ", adc2_ch[i], adc2_val[i]);
269  #ifdef CONFIG_IDF_TARGET_ESP32S2
270          TEST_ASSERT_EQUAL( adc2_val[i], 0x1fff );
271  #endif
272      }
273      printf("\n");
274  
275      /* tie low */
276      for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
277          adc_fake_tie_low(ADC_UNIT_2, adc2_ch[i]);
278      }
279      printf("ADC tie low read: ");
280      vTaskDelay(10 / portTICK_RATE_MS);
281      /* adc Read */
282      printf("ADC2: ");
283      for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
284          TEST_ESP_OK( adc2_get_raw((adc2_channel_t)adc2_ch[i], ADC2_TEST_WIDTH, &adc2_val[i]) );
285          printf("CH%d-%d ", adc2_ch[i], adc2_val[i]);
286  #ifdef CONFIG_IDF_TARGET_ESP32S2
287          TEST_ASSERT_INT_WITHIN( 100, 0, adc2_val[i] );
288  #endif
289      }
290      printf("\n");
291  
292      /* tie midedle */
293      for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
294          adc_fake_tie_middle(ADC_UNIT_2, adc2_ch[i]);
295      }
296      printf("ADC tie middle read: ");
297      vTaskDelay(10 / portTICK_RATE_MS);
298      /* adc Read */
299      printf("ADC2: ");
300      for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
301          TEST_ESP_OK( adc2_get_raw((adc2_channel_t)adc2_ch[i], ADC2_TEST_WIDTH, &adc2_val[i]) );
302          printf("CH%d-%d ", adc2_ch[i], adc2_val[i]);
303  #ifdef CONFIG_IDF_TARGET_ESP32S2
304          TEST_ASSERT_NOT_EQUAL( 0, adc2_val[i]  );
305          TEST_ASSERT_NOT_EQUAL( 0x1fff, adc2_val[i]  );
306  #endif
307      }
308      printf("\n");
309  
310      for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
311          adc_io_normal(ADC_UNIT_1, adc1_ch[i]);
312      }
313  }
314  
315  #include "touch_scope.h"
316  /**
317   * 0: ADC1 channels raw data debug.
318   * 1: ADC2 channels raw data debug.
319   */
320  #define SCOPE_DEBUG_TYPE            1
321  #define SCOPE_DEBUG_CHANNEL_MAX    (10)
322  #define SCOPE_DEBUG_ENABLE         (0)
323  #define SCOPE_UART_BUADRATE        (256000)
324  #define SCOPE_DEBUG_FREQ_MS        (50)
325  
326  /**
327   * Manual test: Capture ADC-DMA data and display it on the serial oscilloscope. Used to observe the stability of the data.
328   * Use step:
329   *      1. Call this function in `esp-idf/tools/unit-test-app/main/app_main.c`.
330   *      2. Use `ESP-Tuning Tool`(download from `www.espressif.com`) to capture.
331   *      3. The readings of multiple channels will be displayed on the tool.
332   */
333  void test_adc_slope_debug(void)
334  {
335      float scope_temp[SCOPE_DEBUG_CHANNEL_MAX] = {0};  // max scope channel is 10.
336      test_tp_scope_debug_init(0, -1, -1, SCOPE_UART_BUADRATE);
337  
338  #if SCOPE_DEBUG_TYPE == 0
339      /* adc1 Configure */
340      adc1_config_width(ADC1_TEST_WIDTH);
341      ESP_LOGI(TAG, "ADC1 [CH - GPIO] atten %d:", ADC1_TEST_ATTEN);
342      for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
343          TEST_ESP_OK( adc1_config_channel_atten(adc1_ch[i], ADC1_TEST_ATTEN) );
344          ESP_LOGI(TAG, "[CH%d - IO%d]", adc1_ch[i], ADC_GET_IO_NUM(0, adc1_ch[i]));
345      }
346      /* tie midedle */
347      for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
348          adc_fake_tie_middle(ADC_UNIT_1, adc1_ch[i]);
349      }
350      vTaskDelay(10 / portTICK_RATE_MS);
351  
352      while (1) {
353          /* adc Read */
354          for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
355              scope_temp[i] = adc1_get_raw((adc1_channel_t)adc1_ch[i]);
356          }
357          test_tp_print_to_scope(scope_temp, ADC1_TEST_CHANNEL_NUM);
358          vTaskDelay(SCOPE_DEBUG_FREQ_MS / portTICK_RATE_MS);
359      }
360  #elif SCOPE_DEBUG_TYPE == 1
361      int adc2_val[ADC2_TEST_CHANNEL_NUM] = {0};
362  
363      /* adc2 Configure */
364      ESP_LOGI(TAG, "ADC2 [CH - GPIO] atten %d:", ADC2_TEST_ATTEN);
365      for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
366          TEST_ESP_OK( adc2_config_channel_atten(adc2_ch[i], ADC2_TEST_ATTEN) );
367          ESP_LOGI(TAG, "[CH%d - IO%d]:", adc2_ch[i], ADC_GET_IO_NUM(1, adc2_ch[i]));
368      }
369      /* tie midedle */
370      for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
371          adc_fake_tie_middle(ADC_UNIT_2, adc2_ch[i]);
372      }
373      vTaskDelay(10 / portTICK_RATE_MS);
374  
375      while (1) {
376          /* adc Read */
377          printf("ADC2: ");
378          for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
379              adc2_get_raw((adc2_channel_t)adc2_ch[i], ADC2_TEST_WIDTH, &adc2_val[i]);
380              scope_temp[i] = adc2_val[i];
381          }
382  
383          test_tp_print_to_scope(scope_temp, ADC2_TEST_CHANNEL_NUM);
384          vTaskDelay(SCOPE_DEBUG_FREQ_MS / portTICK_RATE_MS);
385      }
386  #endif
387  }
388  
389  #endif