test_dac.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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. static const char *TAG = "test_dac";
  16. #ifdef CONFIG_IDF_TARGET_ESP32
  17. #define ADC_TEST_WIDTH ADC_WIDTH_BIT_12
  18. #elif defined CONFIG_IDF_TARGET_ESP32S2
  19. #define ADC_TEST_WIDTH ADC_WIDTH_BIT_13 //ESP32S2 only support 13 bit width
  20. #endif
  21. #define ADC_TEST_ATTEN ADC_ATTEN_DB_11
  22. #if CONFIG_IDF_TARGET_ESP32
  23. #define ADC_TEST_CHANNEL_NUM ADC2_CHANNEL_8 // GPIO25
  24. #define DAC_TEST_CHANNEL_NUM DAC_CHANNEL_1 // GPIO25
  25. #elif CONFIG_IDF_TARGET_ESP32S2
  26. #define ADC_TEST_CHANNEL_NUM ADC2_CHANNEL_6 // GPIO17
  27. #define DAC_TEST_CHANNEL_NUM DAC_CHANNEL_1 // GPIO17
  28. #endif
  29. #define DAC_OUT_MAX (200)
  30. #define DAC_OUT_TIMES (10)
  31. #define DAC_OUT_STEP (DAC_OUT_MAX / DAC_OUT_TIMES)
  32. #define DAC_TEST_TIMES (100)
  33. TEST_CASE("DAC output (RTC) check by adc", "[dac]")
  34. {
  35. gpio_num_t adc_gpio_num, dac_gpio_num;
  36. TEST_ESP_OK( adc2_pad_get_io_num( ADC_TEST_CHANNEL_NUM, &adc_gpio_num ) );
  37. TEST_ESP_OK( dac_pad_get_io_num( DAC_TEST_CHANNEL_NUM, &dac_gpio_num ) );
  38. printf("Please connect ADC2 CH%d-GPIO%d <--> DAC CH%d-GPIO%d.\n", ADC_TEST_CHANNEL_NUM, adc_gpio_num,
  39. DAC_TEST_CHANNEL_NUM + 1, dac_gpio_num );
  40. TEST_ESP_OK( dac_output_enable( DAC_TEST_CHANNEL_NUM ) );
  41. //be sure to do the init before using adc2.
  42. printf("adc2_init...\n");
  43. TEST_ESP_OK( adc2_config_channel_atten( ADC_TEST_CHANNEL_NUM, ADC_TEST_ATTEN ) );
  44. vTaskDelay(2 * portTICK_RATE_MS);
  45. printf("start conversion.\n");
  46. int output_data = 0;
  47. int read_raw = 0, read_old = 0;
  48. for (int i = 0; i < DAC_OUT_TIMES; i++) {
  49. TEST_ESP_OK( dac_output_voltage( DAC_TEST_CHANNEL_NUM, output_data ) );
  50. output_data += DAC_OUT_STEP;
  51. vTaskDelay(2 * portTICK_RATE_MS);
  52. TEST_ESP_OK( adc2_get_raw( ADC_TEST_CHANNEL_NUM, ADC_TEST_WIDTH, &read_raw) );
  53. ESP_LOGI(TAG, "DAC%d - ADC%d", output_data, read_raw);
  54. if (read_old != 0) {
  55. TEST_ASSERT_GREATER_THAN(read_old, read_raw);
  56. }
  57. read_old = read_raw;
  58. }
  59. TEST_ESP_OK( dac_output_disable( DAC_TEST_CHANNEL_NUM ) );
  60. }
  61. TEST_CASE("DAC cw generator output (RTC) check by adc", "[dac]")
  62. {
  63. gpio_num_t adc_gpio_num, dac_gpio_num;
  64. TEST_ESP_OK( adc2_pad_get_io_num( ADC_TEST_CHANNEL_NUM, &adc_gpio_num ) );
  65. TEST_ESP_OK( dac_pad_get_io_num( DAC_TEST_CHANNEL_NUM, &dac_gpio_num ) );
  66. printf("Please connect ADC2 CH%d-GPIO%d <--> DAC CH%d-GPIO%d.\n", ADC_TEST_CHANNEL_NUM, adc_gpio_num,
  67. DAC_TEST_CHANNEL_NUM + 1, dac_gpio_num );
  68. dac_cw_config_t cw = {
  69. .en_ch = DAC_TEST_CHANNEL_NUM,
  70. .scale = DAC_CW_SCALE_2,
  71. .phase = DAC_CW_PHASE_0,
  72. .freq = 1000,
  73. #if CONFIG_IDF_TARGET_ESP32
  74. .offset = 64,
  75. #elif CONFIG_IDF_TARGET_ESP32S2
  76. .offset = 16,
  77. #endif
  78. };
  79. TEST_ESP_OK( dac_cw_generator_config(&cw) );
  80. TEST_ESP_OK( dac_cw_generator_enable() );
  81. TEST_ESP_OK( dac_output_enable( DAC_TEST_CHANNEL_NUM ) );
  82. //be sure to do the init before using adc2.
  83. printf("adc2_init...\n");
  84. TEST_ESP_OK( adc2_config_channel_atten( ADC_TEST_CHANNEL_NUM, ADC_TEST_ATTEN ) );
  85. vTaskDelay(2 * portTICK_RATE_MS);
  86. printf("start conversion.\n");
  87. int read_raw[3] = {0};
  88. for (int i = 0; i < DAC_TEST_TIMES; i++) {
  89. vTaskDelay(10 * portTICK_RATE_MS);
  90. TEST_ESP_OK( adc2_get_raw( ADC_TEST_CHANNEL_NUM, ADC_TEST_WIDTH, &read_raw[0]) );
  91. ESP_LOGI(TAG, "ADC: %d", read_raw[0]);
  92. /* Should open after dac cali. */
  93. // if (read_raw[0] == read_raw[1]) {
  94. // TEST_ASSERT_NOT_EQUAL(read_raw[1], read_raw[2]);
  95. // }
  96. read_raw[2] = read_raw[1];
  97. read_raw[1] = read_raw[0];
  98. }
  99. TEST_ESP_OK( dac_cw_generator_disable() );
  100. TEST_ESP_OK( dac_output_disable( DAC_TEST_CHANNEL_NUM ) );
  101. }