test_adc_common.c
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 18 #if !TEMPORARY_DISABLED_FOR_TARGETS(ESP32S3) 19 20 static const char *TAG = "test_adc"; 21 22 #ifdef CONFIG_IDF_TARGET_ESP32 23 #define ADC1_TEST_WIDTH ADC_WIDTH_BIT_12 24 #define ADC2_TEST_WIDTH ADC_WIDTH_BIT_12 25 #elif defined CONFIG_IDF_TARGET_ESP32S2 26 #define ADC1_TEST_WIDTH ADC_WIDTH_BIT_13 //ESP32S2 only support 13 bit width 27 #define ADC2_TEST_WIDTH ADC_WIDTH_BIT_13 //ESP32S2 only support 13 bit width 28 #endif 29 30 #define ADC1_TEST_ATTEN ADC_ATTEN_DB_11 31 #define ADC2_TEST_ATTEN ADC_ATTEN_DB_11 32 33 #if CONFIG_IDF_TARGET_ESP32 34 #define ADC1_TEST_CHANNEL_NUM 8 35 #elif CONFIG_IDF_TARGET_ESP32S2 36 #define ADC1_TEST_CHANNEL_NUM 10 37 #endif 38 #define ADC2_TEST_CHANNEL_NUM 6 39 40 static const int adc1_ch[ADC1_TEST_CHANNEL_NUM] = { 41 ADC1_CHANNEL_0, 42 ADC1_CHANNEL_1, 43 ADC1_CHANNEL_2, 44 ADC1_CHANNEL_3, 45 ADC1_CHANNEL_4, 46 ADC1_CHANNEL_5, 47 ADC1_CHANNEL_6, 48 ADC1_CHANNEL_7, 49 #if CONFIG_IDF_TARGET_ESP32S2 50 ADC1_CHANNEL_8, 51 ADC1_CHANNEL_9, 52 #endif 53 }; 54 55 static const int adc2_ch[ADC2_TEST_CHANNEL_NUM] = { 56 ADC2_CHANNEL_0, 57 ADC2_CHANNEL_1, 58 ADC2_CHANNEL_2, 59 ADC2_CHANNEL_3, 60 ADC2_CHANNEL_4, 61 ADC2_CHANNEL_5, 62 }; 63 64 #define ADC_GET_IO_NUM(periph, channel) (adc_channel_io_map[periph][channel]) 65 66 void adc_fake_tie_middle(adc_unit_t adc_unit, adc_channel_t channel) 67 { 68 gpio_num_t gpio_num = 0; 69 if (adc_unit & ADC_UNIT_1) { 70 gpio_num = ADC_GET_IO_NUM(0, channel); 71 TEST_ESP_OK(rtc_gpio_init(gpio_num)); 72 TEST_ESP_OK(rtc_gpio_pullup_en(gpio_num)); 73 TEST_ESP_OK(rtc_gpio_pulldown_en(gpio_num)); 74 TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_PULLUP_PULLDOWN)); 75 TEST_ESP_OK(rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_DISABLED)); 76 } 77 if (adc_unit & ADC_UNIT_2) { 78 gpio_num = ADC_GET_IO_NUM(1, channel); 79 TEST_ESP_OK(rtc_gpio_init(gpio_num)); 80 TEST_ESP_OK(rtc_gpio_pullup_en(gpio_num)); 81 TEST_ESP_OK(rtc_gpio_pulldown_en(gpio_num)); 82 TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_PULLUP_PULLDOWN)); 83 TEST_ESP_OK(rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_DISABLED)); 84 } 85 vTaskDelay(10 / portTICK_RATE_MS); 86 } 87 88 void adc_fake_tie_high(adc_unit_t adc_unit, adc_channel_t channel) 89 { 90 gpio_num_t gpio_num = 0; 91 if (adc_unit & ADC_UNIT_1) { 92 gpio_num = ADC_GET_IO_NUM(0, channel); 93 TEST_ESP_OK(rtc_gpio_init(gpio_num)); 94 TEST_ESP_OK(rtc_gpio_pullup_en(gpio_num)); 95 TEST_ESP_OK(rtc_gpio_pulldown_dis(gpio_num)); 96 TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_PULLUP_ONLY)); 97 TEST_ESP_OK(rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_OUTPUT_ONLY)); 98 TEST_ESP_OK(rtc_gpio_set_level(gpio_num, 1)); 99 } 100 if (adc_unit & ADC_UNIT_2) { 101 gpio_num = ADC_GET_IO_NUM(1, channel); 102 TEST_ESP_OK(rtc_gpio_init(gpio_num)); 103 TEST_ESP_OK(rtc_gpio_pullup_en(gpio_num)); 104 TEST_ESP_OK(rtc_gpio_pulldown_dis(gpio_num)); 105 TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_PULLUP_ONLY)); 106 TEST_ESP_OK(rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_OUTPUT_ONLY)); 107 TEST_ESP_OK(rtc_gpio_set_level(gpio_num, 1)); 108 } 109 vTaskDelay(10 / portTICK_RATE_MS); 110 } 111 112 void adc_fake_tie_low(adc_unit_t adc_unit, adc_channel_t channel) 113 { 114 gpio_num_t gpio_num = 0; 115 if (adc_unit & ADC_UNIT_1) { 116 gpio_num = ADC_GET_IO_NUM(0, channel); 117 TEST_ESP_OK(rtc_gpio_init(gpio_num)); 118 TEST_ESP_OK(rtc_gpio_pullup_dis(gpio_num)); 119 TEST_ESP_OK(rtc_gpio_pulldown_en(gpio_num)); 120 TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_PULLDOWN_ONLY)); 121 TEST_ESP_OK(rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_OUTPUT_ONLY)); 122 TEST_ESP_OK(rtc_gpio_set_level(gpio_num, 0)); 123 } 124 if (adc_unit & ADC_UNIT_2) { 125 gpio_num = ADC_GET_IO_NUM(1, channel); 126 TEST_ESP_OK(rtc_gpio_init(gpio_num)); 127 TEST_ESP_OK(rtc_gpio_pullup_dis(gpio_num)); 128 TEST_ESP_OK(rtc_gpio_pulldown_en(gpio_num)); 129 TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_PULLDOWN_ONLY)); 130 TEST_ESP_OK(rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_OUTPUT_ONLY)); 131 TEST_ESP_OK(rtc_gpio_set_level(gpio_num, 0)); 132 } 133 vTaskDelay(10 / portTICK_RATE_MS); 134 } 135 136 void adc_io_normal(adc_unit_t adc_unit, adc_channel_t channel) 137 { 138 gpio_num_t gpio_num = 0; 139 if (adc_unit & ADC_UNIT_1) { 140 gpio_num = ADC_GET_IO_NUM(0, channel); 141 TEST_ESP_OK(rtc_gpio_init(gpio_num)); 142 TEST_ESP_OK(rtc_gpio_pullup_dis(gpio_num)); 143 TEST_ESP_OK(rtc_gpio_pulldown_dis(gpio_num)); 144 TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_FLOATING)); 145 TEST_ESP_OK(rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_DISABLED)); 146 } 147 if (adc_unit & ADC_UNIT_2) { 148 gpio_num = ADC_GET_IO_NUM(1, channel); 149 TEST_ESP_OK(rtc_gpio_init(gpio_num)); 150 TEST_ESP_OK(rtc_gpio_pullup_dis(gpio_num)); 151 TEST_ESP_OK(rtc_gpio_pulldown_dis(gpio_num)); 152 TEST_ESP_OK(gpio_set_pull_mode(gpio_num, GPIO_FLOATING)); 153 TEST_ESP_OK(rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_DISABLED)); 154 } 155 vTaskDelay(10 / portTICK_RATE_MS); 156 } 157 158 TEST_CASE("ADC1 rtc read", "[adc1]") 159 { 160 int adc1_val[ADC1_TEST_CHANNEL_NUM] = {0}; 161 162 /* adc1 Configure */ 163 adc1_config_width(ADC1_TEST_WIDTH); 164 ESP_LOGI(TAG, "ADC1 [CH - GPIO]:"); 165 for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) { 166 TEST_ESP_OK( adc1_config_channel_atten(adc1_ch[i], ADC1_TEST_ATTEN) ); 167 ESP_LOGI(TAG, "[CH%d - IO%d]:", adc1_ch[i], ADC_GET_IO_NUM(0, adc1_ch[i])); 168 } 169 printf("ADC tie normal read: "); 170 vTaskDelay(10 / portTICK_RATE_MS); 171 172 /* adc Read */ 173 printf("ADC1: "); 174 for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) { 175 adc1_val[i] = adc1_get_raw((adc1_channel_t)adc1_ch[i]); 176 printf("CH%d-%d ", adc1_ch[i], adc1_val[i]); 177 } 178 printf("\n"); 179 180 /* tie high */ 181 for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) { 182 adc_fake_tie_high(ADC_UNIT_1, adc1_ch[i]); 183 } 184 printf("ADC tie high read: "); 185 vTaskDelay(50 / portTICK_RATE_MS); 186 /* adc Read */ 187 printf("ADC1: "); 188 for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) { 189 adc1_val[i] = adc1_get_raw((adc1_channel_t)adc1_ch[i]); 190 printf("CH%d-%d ", adc1_ch[i], adc1_val[i]); 191 #ifdef CONFIG_IDF_TARGET_ESP32S2 192 TEST_ASSERT_EQUAL( adc1_val[i], 0x1fff ); 193 #endif 194 } 195 printf("\n"); 196 197 /* tie low */ 198 for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) { 199 adc_fake_tie_low(ADC_UNIT_1, adc1_ch[i]); 200 } 201 printf("ADC tie low read: "); 202 vTaskDelay(50 / portTICK_RATE_MS); 203 /* adc Read */ 204 printf("ADC1: "); 205 for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) { 206 adc1_val[i] = adc1_get_raw((adc1_channel_t)adc1_ch[i]); 207 printf("CH%d-%d ", adc1_ch[i], adc1_val[i]); 208 #ifdef CONFIG_IDF_TARGET_ESP32S2 209 TEST_ASSERT_INT_WITHIN( 100, 0, adc1_val[i] ); 210 #endif 211 } 212 printf("\n"); 213 214 /* tie midedle */ 215 for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) { 216 adc_fake_tie_middle(ADC_UNIT_1, adc1_ch[i]); 217 } 218 printf("ADC tie mid read: "); 219 vTaskDelay(50 / portTICK_RATE_MS); 220 /* adc Read */ 221 printf("ADC1: "); 222 for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) { 223 adc1_val[i] = adc1_get_raw((adc1_channel_t)adc1_ch[i]); 224 printf("CH%d-%d ", adc1_ch[i], adc1_val[i]); 225 #ifdef CONFIG_IDF_TARGET_ESP32S2 226 TEST_ASSERT_NOT_EQUAL( adc1_val[i], 0x1fff ); 227 TEST_ASSERT_NOT_EQUAL( adc1_val[i], 0 ); 228 #endif 229 } 230 printf("\n"); 231 232 for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) { 233 adc_io_normal(ADC_UNIT_1, adc1_ch[i]); 234 } 235 } 236 237 TEST_CASE("ADC2 rtc read", "[adc2]") 238 { 239 int adc2_val[ADC2_TEST_CHANNEL_NUM] = {0}; 240 241 /* adc2 Configure */ 242 ESP_LOGI(TAG, "ADC2 [CH - GPIO]:"); 243 for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) { 244 TEST_ESP_OK( adc2_config_channel_atten(adc2_ch[i], ADC2_TEST_ATTEN) ); 245 ESP_LOGI(TAG, "[CH%d - IO%d]:", adc2_ch[i], ADC_GET_IO_NUM(1, adc2_ch[i])); 246 } 247 printf("ADC float read: "); 248 vTaskDelay(10 / portTICK_RATE_MS); 249 250 /* adc Read */ 251 printf("ADC2: "); 252 for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) { 253 TEST_ESP_OK( adc2_get_raw((adc2_channel_t)adc2_ch[i], ADC2_TEST_WIDTH, &adc2_val[i]) ); 254 printf("CH%d-%d ", adc2_ch[i], adc2_val[i]); 255 } 256 printf("\n"); 257 258 /* tie high */ 259 for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) { 260 adc_fake_tie_high(ADC_UNIT_2, adc2_ch[i]); 261 } 262 printf("ADC tie high read: "); 263 vTaskDelay(10 / portTICK_RATE_MS); 264 /* adc Read */ 265 printf("ADC2: "); 266 for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) { 267 TEST_ESP_OK( adc2_get_raw((adc2_channel_t)adc2_ch[i], ADC2_TEST_WIDTH, &adc2_val[i]) ); 268 printf("CH%d-%d ", adc2_ch[i], adc2_val[i]); 269 #ifdef CONFIG_IDF_TARGET_ESP32S2 270 TEST_ASSERT_EQUAL( adc2_val[i], 0x1fff ); 271 #endif 272 } 273 printf("\n"); 274 275 /* tie low */ 276 for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) { 277 adc_fake_tie_low(ADC_UNIT_2, adc2_ch[i]); 278 } 279 printf("ADC tie low read: "); 280 vTaskDelay(10 / portTICK_RATE_MS); 281 /* adc Read */ 282 printf("ADC2: "); 283 for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) { 284 TEST_ESP_OK( adc2_get_raw((adc2_channel_t)adc2_ch[i], ADC2_TEST_WIDTH, &adc2_val[i]) ); 285 printf("CH%d-%d ", adc2_ch[i], adc2_val[i]); 286 #ifdef CONFIG_IDF_TARGET_ESP32S2 287 TEST_ASSERT_INT_WITHIN( 100, 0, adc2_val[i] ); 288 #endif 289 } 290 printf("\n"); 291 292 /* tie midedle */ 293 for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) { 294 adc_fake_tie_middle(ADC_UNIT_2, adc2_ch[i]); 295 } 296 printf("ADC tie middle read: "); 297 vTaskDelay(10 / portTICK_RATE_MS); 298 /* adc Read */ 299 printf("ADC2: "); 300 for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) { 301 TEST_ESP_OK( adc2_get_raw((adc2_channel_t)adc2_ch[i], ADC2_TEST_WIDTH, &adc2_val[i]) ); 302 printf("CH%d-%d ", adc2_ch[i], adc2_val[i]); 303 #ifdef CONFIG_IDF_TARGET_ESP32S2 304 TEST_ASSERT_NOT_EQUAL( 0, adc2_val[i] ); 305 TEST_ASSERT_NOT_EQUAL( 0x1fff, adc2_val[i] ); 306 #endif 307 } 308 printf("\n"); 309 310 for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) { 311 adc_io_normal(ADC_UNIT_1, adc1_ch[i]); 312 } 313 } 314 315 #include "touch_scope.h" 316 /** 317 * 0: ADC1 channels raw data debug. 318 * 1: ADC2 channels raw data debug. 319 */ 320 #define SCOPE_DEBUG_TYPE 1 321 #define SCOPE_DEBUG_CHANNEL_MAX (10) 322 #define SCOPE_DEBUG_ENABLE (0) 323 #define SCOPE_UART_BUADRATE (256000) 324 #define SCOPE_DEBUG_FREQ_MS (50) 325 326 /** 327 * Manual test: Capture ADC-DMA data and display it on the serial oscilloscope. Used to observe the stability of the data. 328 * Use step: 329 * 1. Call this function in `esp-idf/tools/unit-test-app/main/app_main.c`. 330 * 2. Use `ESP-Tuning Tool`(download from `www.espressif.com`) to capture. 331 * 3. The readings of multiple channels will be displayed on the tool. 332 */ 333 void test_adc_slope_debug(void) 334 { 335 float scope_temp[SCOPE_DEBUG_CHANNEL_MAX] = {0}; // max scope channel is 10. 336 test_tp_scope_debug_init(0, -1, -1, SCOPE_UART_BUADRATE); 337 338 #if SCOPE_DEBUG_TYPE == 0 339 /* adc1 Configure */ 340 adc1_config_width(ADC1_TEST_WIDTH); 341 ESP_LOGI(TAG, "ADC1 [CH - GPIO] atten %d:", ADC1_TEST_ATTEN); 342 for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) { 343 TEST_ESP_OK( adc1_config_channel_atten(adc1_ch[i], ADC1_TEST_ATTEN) ); 344 ESP_LOGI(TAG, "[CH%d - IO%d]", adc1_ch[i], ADC_GET_IO_NUM(0, adc1_ch[i])); 345 } 346 /* tie midedle */ 347 for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) { 348 adc_fake_tie_middle(ADC_UNIT_1, adc1_ch[i]); 349 } 350 vTaskDelay(10 / portTICK_RATE_MS); 351 352 while (1) { 353 /* adc Read */ 354 for (int i = 0; i < ADC1_TEST_CHANNEL_NUM; i++) { 355 scope_temp[i] = adc1_get_raw((adc1_channel_t)adc1_ch[i]); 356 } 357 test_tp_print_to_scope(scope_temp, ADC1_TEST_CHANNEL_NUM); 358 vTaskDelay(SCOPE_DEBUG_FREQ_MS / portTICK_RATE_MS); 359 } 360 #elif SCOPE_DEBUG_TYPE == 1 361 int adc2_val[ADC2_TEST_CHANNEL_NUM] = {0}; 362 363 /* adc2 Configure */ 364 ESP_LOGI(TAG, "ADC2 [CH - GPIO] atten %d:", ADC2_TEST_ATTEN); 365 for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) { 366 TEST_ESP_OK( adc2_config_channel_atten(adc2_ch[i], ADC2_TEST_ATTEN) ); 367 ESP_LOGI(TAG, "[CH%d - IO%d]:", adc2_ch[i], ADC_GET_IO_NUM(1, adc2_ch[i])); 368 } 369 /* tie midedle */ 370 for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) { 371 adc_fake_tie_middle(ADC_UNIT_2, adc2_ch[i]); 372 } 373 vTaskDelay(10 / portTICK_RATE_MS); 374 375 while (1) { 376 /* adc Read */ 377 printf("ADC2: "); 378 for (int i = 0; i < ADC2_TEST_CHANNEL_NUM; i++) { 379 adc2_get_raw((adc2_channel_t)adc2_ch[i], ADC2_TEST_WIDTH, &adc2_val[i]); 380 scope_temp[i] = adc2_val[i]; 381 } 382 383 test_tp_print_to_scope(scope_temp, ADC2_TEST_CHANNEL_NUM); 384 vTaskDelay(SCOPE_DEBUG_FREQ_MS / portTICK_RATE_MS); 385 } 386 #endif 387 } 388 389 #endif