test_dac.c 6.7 KB

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