example(adc2): add example and test case for adc2.

closes #461
pull/1199/head
michael 2017-09-13 18:33:05 +08:00
rodzic 7c0020bfd0
commit d30f3e7aa8
6 zmienionych plików z 276 dodań i 0 usunięć

Wyświetl plik

@ -0,0 +1,115 @@
/*
Tests for the adc2 device driver
*/
#include "esp_system.h"
#include "driver/adc.h"
#include "driver/dac.h"
#include "unity.h"
#include "esp_system.h"
#include "esp_event_loop.h"
#include "esp_wifi.h"
#include "esp_log.h"
#include "nvs_flash.h"
static const char* TAG = "test_adc2";
#define DEFAULT_SSID "TEST_SSID"
#define DEFAULT_PWD "TEST_PASS"
static esp_err_t event_handler(void *ctx, system_event_t *event)
{
printf("ev_handle_called.\n");
switch(event->event_id) {
case SYSTEM_EVENT_STA_START:
ESP_LOGI(TAG, "SYSTEM_EVENT_STA_START");
//do not actually connect in test case
//;
break;
case SYSTEM_EVENT_STA_GOT_IP:
ESP_LOGI(TAG, "SYSTEM_EVENT_STA_GOT_IP");
ESP_LOGI(TAG, "got ip:%s\n",
ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
ESP_LOGI(TAG, "SYSTEM_EVENT_STA_DISCONNECTED");
TEST_ESP_OK(esp_wifi_connect());
break;
default:
break;
}
return ESP_OK;
}
TEST_CASE("adc2 work with wifi","[adc]")
{
int read_raw;
int target_value;
//adc and dac init
TEST_ESP_OK( dac_output_enable( DAC_CHANNEL_1 ));
TEST_ESP_OK( dac_output_enable( DAC_CHANNEL_2 ));
TEST_ESP_OK( dac_output_voltage( DAC_CHANNEL_1, 30 ));
TEST_ESP_OK( dac_output_voltage( DAC_CHANNEL_2, 60 ));
TEST_ESP_OK( adc2_config_channel_atten( ADC2_CHANNEL_8, ADC_ATTEN_0db ));
TEST_ESP_OK( adc2_config_channel_atten( ADC2_CHANNEL_9, ADC_ATTEN_0db ));
//init wifi
printf("nvs init\n");
esp_err_t r = nvs_flash_init();
if (r == ESP_ERR_NVS_NO_FREE_PAGES) {
printf("no free pages, erase..\n");
TEST_ESP_OK(nvs_flash_erase());
r = nvs_flash_init();
}
TEST_ESP_OK( r);
tcpip_adapter_init();
TEST_ESP_OK(esp_event_loop_init(event_handler, NULL));
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
TEST_ESP_OK(esp_wifi_init(&cfg));
wifi_config_t wifi_config = {
.sta = {
.ssid = DEFAULT_SSID,
.password = DEFAULT_PWD
},
};
TEST_ESP_OK(esp_wifi_set_mode(WIFI_MODE_STA));
TEST_ESP_OK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
//test read value
TEST_ESP_OK( adc2_get_raw( ADC2_CHANNEL_8, ADC_WIDTH_12Bit, &read_raw ));
target_value = 30*4096*3/256; //3 = 3.3/1.1
printf("dac set: %d, adc read: %d (target_value: %d)\n", 30, read_raw, target_value );
TEST_ASSERT_INT_WITHIN( 600, target_value, read_raw );
TEST_ESP_OK( adc2_get_raw( ADC2_CHANNEL_9, ADC_WIDTH_12Bit, &read_raw ));
target_value = 60*4096*3/256;
printf("dac set: %d, adc read: %d (target_value: %d)\n", 60, read_raw, target_value );
TEST_ASSERT_INT_WITHIN( 600, target_value, read_raw );
//now start wifi
printf("wifi start...\n");
TEST_ESP_OK(esp_wifi_start());
//test reading during wifi on
TEST_ASSERT_EQUAL( adc2_get_raw( ADC2_CHANNEL_8, ADC_WIDTH_12Bit, &read_raw ), ESP_ERR_TIMEOUT );
TEST_ASSERT_EQUAL( adc2_get_raw( ADC2_CHANNEL_9, ADC_WIDTH_12Bit, &read_raw ), ESP_ERR_TIMEOUT );
//wifi stop again
printf("wifi stop...\n");
TEST_ESP_OK( esp_wifi_stop() );
TEST_ESP_OK(esp_wifi_deinit());
nvs_flash_deinit();
//test read value
TEST_ESP_OK( adc2_get_raw( ADC2_CHANNEL_8, ADC_WIDTH_12Bit, &read_raw ));
target_value = 30*4096*3/256; //3 = 3.3/1.1
printf("dac set: %d, adc read: %d (target_value: %d)\n", 30, read_raw, target_value );
TEST_ASSERT_INT_WITHIN( 600, target_value, read_raw );
TEST_ESP_OK( adc2_get_raw( ADC2_CHANNEL_9, ADC_WIDTH_12Bit, &read_raw ));
target_value = 60*4096*3/256;
printf("dac set: %d, adc read: %d (target_value: %d)\n", 60, read_raw, target_value );
TEST_ASSERT_INT_WITHIN( 600, target_value, read_raw );
printf("test passed...\n");
TEST_IGNORE_MESSAGE("this test case is ignored due to the critical memory leak of tcpip_adapter and event_loop.");
}

Wyświetl plik

@ -0,0 +1,9 @@
#
# This is a project Makefile. It is assumed the directory this Makefile resides in is a
# project subdirectory.
#
PROJECT_NAME := adc2
include $(IDF_PATH)/make/project.mk

Wyświetl plik

@ -0,0 +1,29 @@
# Example: ADC2
This test code shows how to configure ADC2 and read the voltage connected to GPIO pin.
### ADC2 functions:
ADC1_CHANNEL_7: GPIO27, voltage range [0V..3.1V], the data range [0..4095],
saturates at about 1.1V.
DAC_CHANNEL_1: GPIO25, output range [0V..3.3V]
### Test:
Please choose the channel (GPIO) to output DAC signals and the channel to input
signals to ADC by menuconfig:
make menuconfig
Then connect two pins by a wire directly.
E.g. Choose GPIO27 for ADC and GPIO 25 for DAC in menuconfig (default option).
Then connect them up.
Connection of ADC and DAC to the same pin is also allowed. In this case, you don't
have to connect by a wire externally. E.g. choose GPIO 26 for both ADC and DAC in
menuconfig.

Wyświetl plik

@ -0,0 +1,61 @@
menu "Example Configuration"
choice ADC2_EXAMPLE_CHANNEL
bool "ADC2 Channel Num"
default ADC2_EXAMPLE_CHANNEL_7
help
The channel of ADC2 used in this example.
config ADC2_EXAMPLE_CHANNEL_0
bool "ADC2 Channel 0 (GPIO 4)"
config ADC2_EXAMPLE_CHANNEL_1
bool "ADC2 Channel 1 (GPIO 0)"
config ADC2_EXAMPLE_CHANNEL_2
bool "ADC2 Channel 2 (GPIO 2)"
config ADC2_EXAMPLE_CHANNEL_3
bool "ADC2 Channel 3 (GPIO 15)"
config ADC2_EXAMPLE_CHANNEL_4
bool "ADC2 Channel 4 (GPIO 13)"
config ADC2_EXAMPLE_CHANNEL_5
bool "ADC2 Channel 5 (GPIO 12)"
config ADC2_EXAMPLE_CHANNEL_6
bool "ADC2 Channel 6 (GPIO 14)"
config ADC2_EXAMPLE_CHANNEL_7
bool "ADC2 Channel 7 (GPIO 27)"
config ADC2_EXAMPLE_CHANNEL_8
bool "ADC2 Channel 8 (GPIO 25)"
config ADC2_EXAMPLE_CHANNEL_9
bool "ADC2 Channel 9 (GPIO 26)"
endchoice
config ADC2_EXAMPLE_CHANNEL
int
default 0 if ADC2_EXAMPLE_CHANNEL_0
default 1 if ADC2_EXAMPLE_CHANNEL_1
default 2 if ADC2_EXAMPLE_CHANNEL_2
default 3 if ADC2_EXAMPLE_CHANNEL_3
default 4 if ADC2_EXAMPLE_CHANNEL_4
default 5 if ADC2_EXAMPLE_CHANNEL_5
default 6 if ADC2_EXAMPLE_CHANNEL_6
default 7 if ADC2_EXAMPLE_CHANNEL_7
default 8 if ADC2_EXAMPLE_CHANNEL_8
default 9 if ADC2_EXAMPLE_CHANNEL_9
choice DAC_EXAMPLE_CHANNEL
bool "DAC Channel Num"
default DAC_EXAMPLE_CHANNEL_1
help
The channel of DAC used in this example.
config DAC_EXAMPLE_CHANNEL_1
bool "DAC Channel 1 (GPIO25)"
config DAC_EXAMPLE_CHANNEL_2
bool "DAC Channel 2 (GPIO26)"
endchoice
config DAC_EXAMPLE_CHANNEL
int
default 1 if DAC_EXAMPLE_CHANNEL_1
default 2 if DAC_EXAMPLE_CHANNEL_2
endmenu

Wyświetl plik

@ -0,0 +1,59 @@
/* ADC2 Example
This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#include "driver/adc.h"
#include "driver/dac.h"
#include "esp_system.h"
#include "esp_adc_cal.h"
#define DAC_EXAMPLE_CHANNEL CONFIG_DAC_EXAMPLE_CHANNEL
#define ADC2_EXAMPLE_CHANNEL CONFIG_ADC2_EXAMPLE_CHANNEL
void app_main(void)
{
uint8_t output_data=0;
int read_raw;
esp_err_t r;
gpio_num_t adc_gpio_num, dac_gpio_num;
assert( adc2_pad_get_io_num( ADC2_EXAMPLE_CHANNEL, &adc_gpio_num ) == ESP_OK );
assert( dac_pad_get_io_num( DAC_EXAMPLE_CHANNEL, &dac_gpio_num ) == ESP_OK );
printf("ADC channel %d @ GPIO %d, DAC channel %d @ GPIO %d.\n", ADC2_EXAMPLE_CHANNEL, adc_gpio_num,
DAC_EXAMPLE_CHANNEL, dac_gpio_num );
dac_output_enable( DAC_EXAMPLE_CHANNEL );
//be sure to do the init before using adc2.
printf("adc2_init...\n");
adc2_config_channel_atten( ADC2_EXAMPLE_CHANNEL, ADC_ATTEN_0db );
vTaskDelay(2 * portTICK_PERIOD_MS);
printf("start conversion.\n");
while(1) {
dac_output_voltage( DAC_EXAMPLE_CHANNEL, output_data++ );
r = adc2_get_raw( ADC2_EXAMPLE_CHANNEL, ADC_WIDTH_12Bit, &read_raw);
if ( r == ESP_OK ) {
printf("%d: %d\n", output_data, read_raw );
} else if ( r == ESP_ERR_INVALID_STATE ) {
printf("ADC2 not initialized yet.\n");
} else if ( r == ESP_ERR_TIMEOUT ) {
//This can not happen in this example. But if WiFi is in use, such error code could be returned.
printf("ADC2 is in use by Wi-Fi.\n");
}
vTaskDelay( 2 * portTICK_PERIOD_MS );
}
}

Wyświetl plik

@ -0,0 +1,3 @@
#
# Main Makefile. This is basically the same as a component makefile.
#