test_dac.c 6.4 KB

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