test_dac.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /*
  2. * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. /*
  7. Tests for the dac device driver
  8. */
  9. #include "esp_system.h"
  10. #include "unity.h"
  11. #include "esp_system.h"
  12. #include "esp_event.h"
  13. #include "esp_wifi.h"
  14. #include "esp_log.h"
  15. #include "nvs_flash.h"
  16. #include "test_utils.h"
  17. #include "soc/soc_caps.h"
  18. #define CONFIG_ADC_SUPPRESS_DEPRECATE_WARN 1
  19. #include "driver/adc.h"
  20. #if SOC_DAC_SUPPORTED
  21. #include "driver/dac.h"
  22. #include "esp_adc_cal.h"
  23. static const char *TAG = "test_dac";
  24. #ifdef CONFIG_IDF_TARGET_ESP32
  25. #define ADC_TEST_WIDTH ADC_WIDTH_BIT_12
  26. #elif defined CONFIG_IDF_TARGET_ESP32S2
  27. #define ADC_TEST_WIDTH ADC_WIDTH_BIT_13 //ESP32S2 only support 13 bit width
  28. #endif
  29. #define ADC_TEST_ATTEN ADC_ATTEN_DB_11
  30. #if CONFIG_IDF_TARGET_ESP32
  31. #define ADC_TEST_CHANNEL_NUM ADC2_CHANNEL_8 // GPIO25
  32. #define DAC_TEST_CHANNEL_NUM DAC_CHANNEL_1 // GPIO25
  33. #elif CONFIG_IDF_TARGET_ESP32S2
  34. #define ADC_TEST_CHANNEL_NUM ADC2_CHANNEL_6 // GPIO17
  35. #define DAC_TEST_CHANNEL_NUM DAC_CHANNEL_1 // GPIO17
  36. #endif
  37. #define DAC_OUT_MAX (200)
  38. #define DAC_OUT_TIMES (10)
  39. #define DAC_OUT_STEP (DAC_OUT_MAX / DAC_OUT_TIMES)
  40. #define DAC_TEST_TIMES (100)
  41. TEST_CASE("DAC output (RTC) check by adc", "[dac]")
  42. {
  43. gpio_num_t adc_gpio_num, dac_gpio_num;
  44. TEST_ESP_OK( adc2_pad_get_io_num( ADC_TEST_CHANNEL_NUM, &adc_gpio_num ) );
  45. TEST_ESP_OK( dac_pad_get_io_num( DAC_TEST_CHANNEL_NUM, &dac_gpio_num ) );
  46. printf("Please connect ADC2 CH%d-GPIO%d <--> DAC CH%d-GPIO%d.\n", ADC_TEST_CHANNEL_NUM, adc_gpio_num,
  47. DAC_TEST_CHANNEL_NUM + 1, dac_gpio_num );
  48. TEST_ESP_OK( dac_output_enable( DAC_TEST_CHANNEL_NUM ) );
  49. //be sure to do the init before using adc2.
  50. printf("adc2_init...\n");
  51. TEST_ESP_OK( adc2_config_channel_atten( ADC_TEST_CHANNEL_NUM, ADC_TEST_ATTEN ) );
  52. vTaskDelay(2 * portTICK_PERIOD_MS);
  53. printf("start conversion.\n");
  54. int output_data = 0;
  55. int read_raw = 0, read_old = 0;
  56. for (int i = 0; i < DAC_OUT_TIMES; i++) {
  57. TEST_ESP_OK( dac_output_voltage( DAC_TEST_CHANNEL_NUM, output_data ) );
  58. output_data += DAC_OUT_STEP;
  59. vTaskDelay(2 * portTICK_PERIOD_MS);
  60. TEST_ESP_OK( adc2_get_raw( ADC_TEST_CHANNEL_NUM, ADC_TEST_WIDTH, &read_raw) );
  61. ESP_LOGI(TAG, "DAC%d - ADC%d", output_data, read_raw);
  62. if (read_old != 0) {
  63. TEST_ASSERT_GREATER_THAN(read_old, read_raw);
  64. }
  65. read_old = read_raw;
  66. }
  67. TEST_ESP_OK( dac_output_disable( DAC_TEST_CHANNEL_NUM ) );
  68. }
  69. TEST_CASE("DAC cw generator output (RTC) check by adc", "[dac]")
  70. {
  71. gpio_num_t adc_gpio_num, dac_gpio_num;
  72. TEST_ESP_OK( adc2_pad_get_io_num( ADC_TEST_CHANNEL_NUM, &adc_gpio_num ) );
  73. TEST_ESP_OK( dac_pad_get_io_num( DAC_TEST_CHANNEL_NUM, &dac_gpio_num ) );
  74. printf("Please connect ADC2 CH%d-GPIO%d <--> DAC CH%d-GPIO%d.\n", ADC_TEST_CHANNEL_NUM, adc_gpio_num,
  75. DAC_TEST_CHANNEL_NUM + 1, dac_gpio_num );
  76. dac_cw_config_t cw = {
  77. .en_ch = DAC_TEST_CHANNEL_NUM,
  78. .scale = DAC_CW_SCALE_2,
  79. .phase = DAC_CW_PHASE_0,
  80. .freq = 1000,
  81. #if CONFIG_IDF_TARGET_ESP32
  82. .offset = 64,
  83. #elif CONFIG_IDF_TARGET_ESP32S2
  84. .offset = 16,
  85. #endif
  86. };
  87. TEST_ESP_OK( dac_cw_generator_config(&cw) );
  88. TEST_ESP_OK( dac_cw_generator_enable() );
  89. TEST_ESP_OK( dac_output_enable( DAC_TEST_CHANNEL_NUM ) );
  90. //be sure to do the init before using adc2.
  91. printf("adc2_init...\n");
  92. TEST_ESP_OK( adc2_config_channel_atten( ADC_TEST_CHANNEL_NUM, ADC_TEST_ATTEN ) );
  93. vTaskDelay(2 * portTICK_PERIOD_MS);
  94. printf("start conversion.\n");
  95. int read_raw[3] = {0};
  96. for (int i = 0; i < DAC_TEST_TIMES; i++) {
  97. vTaskDelay(10 * portTICK_PERIOD_MS);
  98. TEST_ESP_OK( adc2_get_raw( ADC_TEST_CHANNEL_NUM, ADC_TEST_WIDTH, &read_raw[0]) );
  99. ESP_LOGI(TAG, "ADC: %d", read_raw[0]);
  100. /* Should open after dac cali. */
  101. // if (read_raw[0] == read_raw[1]) {
  102. // TEST_ASSERT_NOT_EQUAL(read_raw[1], read_raw[2]);
  103. // }
  104. read_raw[2] = read_raw[1];
  105. read_raw[1] = read_raw[0];
  106. }
  107. TEST_ESP_OK( dac_cw_generator_disable() );
  108. TEST_ESP_OK( dac_output_disable( DAC_TEST_CHANNEL_NUM ) );
  109. }
  110. #if CONFIG_IDF_TARGET_ESP32S2
  111. static int helper_calc_dac_output(int mV)
  112. {
  113. return mV * 0.07722;
  114. }
  115. static bool subtest_adc_dac(int mV_ref, esp_adc_cal_characteristics_t * chars)
  116. {
  117. dac_output_voltage(DAC_TEST_CHANNEL_NUM, helper_calc_dac_output(mV_ref));
  118. vTaskDelay(pdMS_TO_TICKS(80));
  119. int raw;
  120. adc2_get_raw((adc2_channel_t)ADC_TEST_CHANNEL_NUM, ADC_WIDTH_BIT_13, &raw);
  121. uint32_t voltage = esp_adc_cal_raw_to_voltage(raw, chars);
  122. TEST_ASSERT_INT_WITHIN( 200, mV_ref, voltage ); // 200 mV error allowance, because both DAC and ADC have error
  123. return true;
  124. }
  125. TEST_CASE("esp32s2 adc2-dac with adc2 calibration", "[adc-dac]")
  126. {
  127. gpio_num_t adc_gpio_num, dac_gpio_num;
  128. if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_TP) != ESP_OK) {
  129. TEST_IGNORE_MESSAGE("Warning: This esp32s2 board does not support calibration. This test will be skipped.\n");
  130. }
  131. TEST_ESP_OK( adc2_pad_get_io_num( ADC_TEST_CHANNEL_NUM, &adc_gpio_num ) );
  132. TEST_ESP_OK( dac_pad_get_io_num( DAC_TEST_CHANNEL_NUM, &dac_gpio_num ) );
  133. printf("Please connect ADC2 CH%d-GPIO%d <--> DAC CH%d-GPIO%d.\n", ADC_TEST_CHANNEL_NUM, adc_gpio_num,
  134. DAC_TEST_CHANNEL_NUM + 1, dac_gpio_num );
  135. TEST_ESP_OK( dac_output_enable( DAC_TEST_CHANNEL_NUM ) );
  136. esp_adc_cal_characteristics_t chars;
  137. printf("Test 0dB atten...\n");
  138. adc2_config_channel_atten((adc2_channel_t)ADC_TEST_CHANNEL_NUM, ADC_ATTEN_DB_0);
  139. esp_adc_cal_characterize(ADC_UNIT_2, ADC_ATTEN_DB_0, ADC_WIDTH_BIT_13, 0, &chars);
  140. printf("a %d, b %d\n", chars.coeff_a, chars.coeff_b);
  141. subtest_adc_dac(750, &chars);
  142. printf("Test 2.5dB atten...\n");
  143. adc2_config_channel_atten((adc2_channel_t)ADC_TEST_CHANNEL_NUM, ADC_ATTEN_DB_2_5);
  144. esp_adc_cal_characterize(ADC_UNIT_2, ADC_ATTEN_DB_2_5, ADC_WIDTH_BIT_13, 0, &chars);
  145. printf("a %d, b %d\n", chars.coeff_a, chars.coeff_b);
  146. subtest_adc_dac(1100, &chars);
  147. printf("Test 6dB atten...\n");
  148. adc2_config_channel_atten((adc2_channel_t)ADC_TEST_CHANNEL_NUM, ADC_ATTEN_DB_6);
  149. esp_adc_cal_characterize(ADC_UNIT_2, ADC_ATTEN_DB_6, ADC_WIDTH_BIT_13, 0, &chars);
  150. printf("a %d, b %d\n", chars.coeff_a, chars.coeff_b);
  151. subtest_adc_dac(800, &chars);
  152. subtest_adc_dac(1250, &chars);
  153. printf("Test 11dB atten...\n");
  154. adc2_config_channel_atten((adc2_channel_t)ADC_TEST_CHANNEL_NUM, ADC_ATTEN_DB_11);
  155. esp_adc_cal_characterize(ADC_UNIT_2, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_13, 0, &chars);
  156. printf("a %d, b %d\n", chars.coeff_a, chars.coeff_b);
  157. subtest_adc_dac(1500, &chars);
  158. subtest_adc_dac(2500, &chars);
  159. }
  160. #endif
  161. #endif // SOC_DAC_SUPPORTED