test_adc_common.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  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. static const char *TAG = "test_adc";
  18. #ifdef CONFIG_IDF_TARGET_ESP32
  19. #define ADC1_TEST_WIDTH ADC_WIDTH_BIT_12
  20. #define ADC2_TEST_WIDTH ADC_WIDTH_BIT_12
  21. #elif defined CONFIG_IDF_TARGET_ESP32S2
  22. #define ADC1_TEST_WIDTH ADC_WIDTH_BIT_13 //ESP32S2 only support 13 bit width
  23. #define ADC2_TEST_WIDTH ADC_WIDTH_BIT_13 //ESP32S2 only support 13 bit width
  24. #endif
  25. #define ADC1_TEST_ATTEN ADC_ATTEN_DB_11
  26. #define ADC2_TEST_ATTEN ADC_ATTEN_DB_11
  27. #define ADC1_TEST_CHANNEL_NUM 8
  28. #define ADC2_TEST_CHANNEL_NUM 6
  29. static const int adc1_ch[ADC1_TEST_CHANNEL_NUM] = {
  30. ADC1_CHANNEL_0,
  31. ADC1_CHANNEL_1,
  32. ADC1_CHANNEL_2,
  33. ADC1_CHANNEL_3,
  34. ADC1_CHANNEL_4,
  35. ADC1_CHANNEL_5,
  36. ADC1_CHANNEL_6,
  37. ADC1_CHANNEL_7,
  38. };
  39. static const int adc2_ch[ADC2_TEST_CHANNEL_NUM] = {
  40. ADC2_CHANNEL_0,
  41. ADC2_CHANNEL_1,
  42. ADC2_CHANNEL_2,
  43. ADC2_CHANNEL_3,
  44. ADC2_CHANNEL_4,
  45. ADC2_CHANNEL_5,
  46. };
  47. #define ADC_GET_IO_NUM(periph, channel) (adc_channel_io_map[periph][channel])
  48. static void adc_fake_tie_middle(adc_unit_t adc_unit, adc_channel_t channel)
  49. {
  50. gpio_num_t gpio_num = 0;
  51. if (adc_unit & ADC_UNIT_1) {
  52. gpio_num = ADC_GET_IO_NUM(0, channel);
  53. }
  54. if (adc_unit & ADC_UNIT_2) {
  55. gpio_num = ADC_GET_IO_NUM(1, channel);
  56. }
  57. TEST_ESP_OK(rtc_gpio_pullup_en(gpio_num));
  58. TEST_ESP_OK(rtc_gpio_pulldown_en(gpio_num));
  59. TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_PULLUP_PULLDOWN));
  60. }
  61. static void adc_fake_tie_high(adc_unit_t adc_unit, adc_channel_t channel)
  62. {
  63. gpio_num_t gpio_num = 0;
  64. if (adc_unit & ADC_UNIT_1) {
  65. gpio_num = ADC_GET_IO_NUM(0, channel);
  66. }
  67. if (adc_unit & ADC_UNIT_2) {
  68. gpio_num = ADC_GET_IO_NUM(1, channel);
  69. }
  70. TEST_ESP_OK(rtc_gpio_pullup_en(gpio_num));
  71. TEST_ESP_OK(rtc_gpio_pulldown_dis(gpio_num));
  72. TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_PULLUP_ONLY));
  73. }
  74. static void adc_fake_tie_low(adc_unit_t adc_unit, adc_channel_t channel)
  75. {
  76. gpio_num_t gpio_num = 0;
  77. if (adc_unit & ADC_UNIT_1) {
  78. gpio_num = ADC_GET_IO_NUM(0, channel);
  79. }
  80. if (adc_unit & ADC_UNIT_2) {
  81. gpio_num = ADC_GET_IO_NUM(1, channel);
  82. }
  83. TEST_ESP_OK(rtc_gpio_pullup_dis(gpio_num));
  84. TEST_ESP_OK(rtc_gpio_pulldown_en(gpio_num));
  85. TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_PULLDOWN_ONLY));
  86. }
  87. static void adc_io_normal(adc_unit_t adc_unit, adc_channel_t channel)
  88. {
  89. gpio_num_t gpio_num = 0;
  90. if (adc_unit & ADC_UNIT_1) {
  91. gpio_num = ADC_GET_IO_NUM(0, channel);
  92. }
  93. if (adc_unit & ADC_UNIT_2) {
  94. gpio_num = ADC_GET_IO_NUM(1, channel);
  95. }
  96. TEST_ESP_OK(rtc_gpio_pullup_dis(gpio_num));
  97. TEST_ESP_OK(rtc_gpio_pulldown_dis(gpio_num));
  98. TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_FLOATING));
  99. }
  100. TEST_CASE("ADC1 rtc read", "[adc1]")
  101. {
  102. int adc1_val[ADC1_TEST_CHANNEL_NUM] = {0};
  103. /* adc1 Configure */
  104. adc1_config_width(ADC1_TEST_WIDTH);
  105. ESP_LOGI(TAG, "ADC1 [CH - GPIO]:");
  106. for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
  107. TEST_ESP_OK( adc1_config_channel_atten(adc1_ch[i], ADC1_TEST_ATTEN) );
  108. ESP_LOGI(TAG, "[CH%d - IO%d]:", adc1_ch[i], ADC_GET_IO_NUM(0, adc1_ch[i]));
  109. }
  110. printf("ADC tie normal read: ");
  111. vTaskDelay(10 / portTICK_RATE_MS);
  112. /* adc Read */
  113. printf("ADC1: ");
  114. for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
  115. adc1_val[i] = adc1_get_raw((adc1_channel_t)adc1_ch[i]);
  116. printf("CH%d-%d ", adc1_ch[i], adc1_val[i]);
  117. }
  118. printf("\n");
  119. /* tie high */
  120. for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
  121. adc_fake_tie_high(ADC_UNIT_1, adc1_ch[i]);
  122. }
  123. printf("ADC tie high read: ");
  124. vTaskDelay(50 / portTICK_RATE_MS);
  125. /* adc Read */
  126. printf("ADC1: ");
  127. for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
  128. adc1_val[i] = adc1_get_raw((adc1_channel_t)adc1_ch[i]);
  129. printf("CH%d-%d ", adc1_ch[i], adc1_val[i]);
  130. #ifdef CONFIG_IDF_TARGET_ESP32S2
  131. TEST_ASSERT_EQUAL( adc1_val[i], 0x1fff );
  132. #endif
  133. }
  134. printf("\n");
  135. /* tie low */
  136. for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
  137. adc_fake_tie_low(ADC_UNIT_1, adc1_ch[i]);
  138. }
  139. printf("ADC tie low read: ");
  140. vTaskDelay(50 / portTICK_RATE_MS);
  141. /* adc Read */
  142. printf("ADC1: ");
  143. for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
  144. adc1_val[i] = adc1_get_raw((adc1_channel_t)adc1_ch[i]);
  145. printf("CH%d-%d ", adc1_ch[i], adc1_val[i]);
  146. #ifdef CONFIG_IDF_TARGET_ESP32S2
  147. TEST_ASSERT_INT_WITHIN( 100, 0, adc1_val[i] );
  148. #endif
  149. }
  150. printf("\n");
  151. /* tie midedle */
  152. for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
  153. adc_fake_tie_middle(ADC_UNIT_1, adc1_ch[i]);
  154. }
  155. printf("ADC tie mid read: ");
  156. vTaskDelay(50 / portTICK_RATE_MS);
  157. /* adc Read */
  158. printf("ADC1: ");
  159. for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
  160. adc1_val[i] = adc1_get_raw((adc1_channel_t)adc1_ch[i]);
  161. printf("CH%d-%d ", adc1_ch[i], adc1_val[i]);
  162. #ifdef CONFIG_IDF_TARGET_ESP32S2
  163. TEST_ASSERT_NOT_EQUAL( adc1_val[i], 0 );
  164. #endif
  165. }
  166. printf("\n");
  167. for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
  168. adc_io_normal(ADC_UNIT_1, adc1_ch[i]);
  169. }
  170. }
  171. TEST_CASE("ADC2 rtc read", "[adc2]")
  172. {
  173. int adc2_val[ADC2_TEST_CHANNEL_NUM] = {0};
  174. /* adc2 Configure */
  175. ESP_LOGI(TAG, "ADC2 [CH - GPIO]:");
  176. for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
  177. TEST_ESP_OK( adc2_config_channel_atten(adc2_ch[i], ADC2_TEST_ATTEN) );
  178. ESP_LOGI(TAG, "[CH%d - IO%d]:", adc2_ch[i], ADC_GET_IO_NUM(1, adc2_ch[i]));
  179. }
  180. printf("ADC float read: ");
  181. vTaskDelay(10 / portTICK_RATE_MS);
  182. /* adc Read */
  183. printf("ADC2: ");
  184. for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
  185. TEST_ESP_OK( adc2_get_raw((adc2_channel_t)adc2_ch[i], ADC2_TEST_WIDTH, &adc2_val[i]) );
  186. printf("CH%d-%d ", adc2_ch[i], adc2_val[i]);
  187. }
  188. printf("\n");
  189. /* tie high */
  190. for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
  191. adc_fake_tie_high(ADC_UNIT_2, adc2_ch[i]);
  192. }
  193. printf("ADC tie high read: ");
  194. vTaskDelay(10 / portTICK_RATE_MS);
  195. /* adc Read */
  196. printf("ADC2: ");
  197. for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
  198. TEST_ESP_OK( adc2_get_raw((adc2_channel_t)adc2_ch[i], ADC2_TEST_WIDTH, &adc2_val[i]) );
  199. printf("CH%d-%d ", adc2_ch[i], adc2_val[i]);
  200. #ifdef CONFIG_IDF_TARGET_ESP32S2
  201. TEST_ASSERT_EQUAL( adc2_val[i], 0x1fff );
  202. #endif
  203. }
  204. printf("\n");
  205. /* tie low */
  206. for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
  207. adc_fake_tie_low(ADC_UNIT_2, adc2_ch[i]);
  208. }
  209. printf("ADC tie low read: ");
  210. vTaskDelay(10 / portTICK_RATE_MS);
  211. /* adc Read */
  212. printf("ADC2: ");
  213. for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
  214. TEST_ESP_OK( adc2_get_raw((adc2_channel_t)adc2_ch[i], ADC2_TEST_WIDTH, &adc2_val[i]) );
  215. printf("CH%d-%d ", adc2_ch[i], adc2_val[i]);
  216. #ifdef CONFIG_IDF_TARGET_ESP32S2
  217. TEST_ASSERT_INT_WITHIN( 100, 0, adc2_val[i] );
  218. #endif
  219. }
  220. printf("\n");
  221. /* tie midedle */
  222. for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
  223. adc_fake_tie_middle(ADC_UNIT_2, adc2_ch[i]);
  224. }
  225. printf("ADC tie middle read: ");
  226. vTaskDelay(10 / portTICK_RATE_MS);
  227. /* adc Read */
  228. printf("ADC2: ");
  229. for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) {
  230. TEST_ESP_OK( adc2_get_raw((adc2_channel_t)adc2_ch[i], ADC2_TEST_WIDTH, &adc2_val[i]) );
  231. printf("CH%d-%d ", adc2_ch[i], adc2_val[i]);
  232. #ifdef CONFIG_IDF_TARGET_ESP32S2
  233. TEST_ASSERT_NOT_EQUAL( 0, adc2_val[i] );
  234. TEST_ASSERT_NOT_EQUAL( 0x1fff, adc2_val[i] );
  235. #endif
  236. }
  237. printf("\n");
  238. for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) {
  239. adc_io_normal(ADC_UNIT_1, adc1_ch[i]);
  240. }
  241. }