Compare commits
4 Commits
86f6026a1c
...
284f9e4d71
| Author | SHA1 | Date |
|---|---|---|
|
|
284f9e4d71 | |
|
|
2abdd7be0c | |
|
|
1d2d1ce6bc | |
|
|
3d7a783905 |
|
|
@ -1,11 +1,16 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "esp_attr.h"
|
||||||
#include "esp_err.h"
|
#include "esp_err.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "esp_adc/adc_cali.h"
|
#include "esp_adc/adc_cali.h"
|
||||||
#include "esp_adc/adc_cali_scheme.h"
|
#include "esp_adc/adc_cali_scheme.h"
|
||||||
#include "esp_adc/adc_continuous.h"
|
#include "esp_adc/adc_continuous.h"
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
#include "freertos/portmacro.h"
|
||||||
#include "hal/adc_types.h"
|
#include "hal/adc_types.h"
|
||||||
|
#include "soc/soc_caps.h"
|
||||||
|
|
||||||
/* ADC input pins */
|
/* ADC input pins */
|
||||||
#define ADC_INPUT_1_PIN 4
|
#define ADC_INPUT_1_PIN 4
|
||||||
|
|
@ -13,39 +18,59 @@
|
||||||
#define ADC_INPUT_3_PIN 9 /* TODO Reroute from pin 46 to 9 on schematic, cant do ADC */
|
#define ADC_INPUT_3_PIN 9 /* TODO Reroute from pin 46 to 9 on schematic, cant do ADC */
|
||||||
#define ADC_INPUT_4_PIN 10
|
#define ADC_INPUT_4_PIN 10
|
||||||
|
|
||||||
|
#define ADC_READ_LEN 256
|
||||||
|
|
||||||
/* ADC channels */
|
/* ADC channels */
|
||||||
static adc_channel_t channel[4] = {ADC_CHANNEL_3, ADC_CHANNEL_5, ADC_CHANNEL_8, ADC_CHANNEL_9};
|
static adc_channel_t channel[4] = {ADC_CHANNEL_3, ADC_CHANNEL_5, ADC_CHANNEL_8, ADC_CHANNEL_9};
|
||||||
|
|
||||||
|
/* ADC handles */
|
||||||
|
static adc_continuous_handle_t adc_handle;
|
||||||
|
static adc_cali_handle_t adc_cali_handle;
|
||||||
|
static TaskHandle_t adc_task_handle;
|
||||||
|
|
||||||
static const char *TAG = "EERG";
|
static const char *TAG = "EERG";
|
||||||
|
|
||||||
|
|
||||||
|
/* ADC conversion finished callback */
|
||||||
|
static bool IRAM_ATTR adc_conv_cb(adc_continuous_handle_t handle, const adc_continuous_evt_data_t *edata, void *user_data)
|
||||||
|
{
|
||||||
|
BaseType_t mustYield = pdFALSE;
|
||||||
|
/* Send notification to handler task */
|
||||||
|
vTaskNotifyGiveFromISR(adc_task_handle, &mustYield);
|
||||||
|
return (mustYield == pdTRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Deinitializes ADC handles */
|
||||||
|
static void adc_cleanup(void)
|
||||||
|
{
|
||||||
|
ESP_LOGI(TAG, "Cleaning up ADC");
|
||||||
|
ESP_ERROR_CHECK(adc_continuous_stop(adc_handle));
|
||||||
|
ESP_ERROR_CHECK(adc_continuous_deinit(adc_handle));
|
||||||
|
ESP_ERROR_CHECK(adc_cali_delete_scheme_curve_fitting(adc_cali_handle));
|
||||||
|
}
|
||||||
|
|
||||||
/* Initializes calibration driver of internal 12bit ADC */
|
/* Initializes calibration driver of internal 12bit ADC */
|
||||||
static void adc_cali_init(void)
|
static void adc_cali_init(void)
|
||||||
{
|
{
|
||||||
ESP_LOGI(TAG, "Initializing ADC calibration driver");
|
ESP_LOGI(TAG, "Initializing ADC calibration driver");
|
||||||
adc_cali_handle_t cali_handle;
|
|
||||||
/* Create and apply calibration driver configuration */
|
/* Create and apply calibration driver configuration */
|
||||||
adc_cali_curve_fitting_config_t cali_config = {
|
adc_cali_curve_fitting_config_t cali_config = {
|
||||||
.unit_id = ADC_UNIT_1,
|
.unit_id = ADC_UNIT_1,
|
||||||
.atten = ADC_ATTEN_DB_0,
|
.atten = ADC_ATTEN_DB_0,
|
||||||
.bitwidth = ADC_BITWIDTH_DEFAULT
|
.bitwidth = ADC_BITWIDTH_DEFAULT
|
||||||
};
|
};
|
||||||
ESP_ERROR_CHECK(adc_cali_create_scheme_curve_fitting(&cali_config, &cali_handle));
|
ESP_ERROR_CHECK(adc_cali_create_scheme_curve_fitting(&cali_config, &adc_cali_handle));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initializes internal 12bit ADC */
|
/* Initializes internal 12bit ADC */
|
||||||
static void adc_init(void)
|
static void adc_cont_init(void)
|
||||||
{
|
{
|
||||||
/* Initialize calibration driver */
|
|
||||||
adc_cali_init();
|
|
||||||
|
|
||||||
ESP_LOGI(TAG, "Initializing ADC continuous mode driver");
|
ESP_LOGI(TAG, "Initializing ADC continuous mode driver");
|
||||||
|
|
||||||
/* Create continuous mode driver handle */
|
/* Create continuous mode driver handle */
|
||||||
adc_continuous_handle_t adc_handle = NULL;
|
|
||||||
adc_continuous_handle_cfg_t adc_handle_config = {
|
adc_continuous_handle_cfg_t adc_handle_config = {
|
||||||
.max_store_buf_size = 1024,
|
.max_store_buf_size = 1024,
|
||||||
.conv_frame_size = 100
|
.conv_frame_size = ADC_READ_LEN
|
||||||
};
|
};
|
||||||
ESP_ERROR_CHECK(adc_continuous_new_handle(&adc_handle_config, &adc_handle));
|
ESP_ERROR_CHECK(adc_continuous_new_handle(&adc_handle_config, &adc_handle));
|
||||||
|
|
||||||
|
|
@ -67,10 +92,48 @@ static void adc_init(void)
|
||||||
}
|
}
|
||||||
adc_config.adc_pattern = adc_pattern;
|
adc_config.adc_pattern = adc_pattern;
|
||||||
ESP_ERROR_CHECK(adc_continuous_config(adc_handle, & adc_config));
|
ESP_ERROR_CHECK(adc_continuous_config(adc_handle, & adc_config));
|
||||||
|
|
||||||
|
/* Configure callbacks */
|
||||||
|
adc_continuous_evt_cbs_t cbs = {
|
||||||
|
.on_conv_done = adc_conv_cb
|
||||||
|
};
|
||||||
|
ESP_ERROR_CHECK(adc_continuous_register_event_callbacks(adc_handle, &cbs, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_main(void)
|
void app_main(void)
|
||||||
{
|
{
|
||||||
/* Initialize internal ADC */
|
/* Initialize internal ADC */
|
||||||
adc_init();
|
/* Initialize calibration driver */
|
||||||
|
adc_cali_init();
|
||||||
|
/* Initialize continuous driver */
|
||||||
|
adc_cont_init();
|
||||||
|
/* Start the continuous driver */
|
||||||
|
adc_task_handle = xTaskGetCurrentTaskHandle();
|
||||||
|
ESP_ERROR_CHECK(adc_continuous_start(adc_handle));
|
||||||
|
|
||||||
|
esp_err_t adc_ret;
|
||||||
|
uint32_t ret_num = 0;
|
||||||
|
uint8_t result[ADC_READ_LEN] = {0};
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
/* Perform a read */
|
||||||
|
adc_ret = adc_continuous_read(adc_handle, result, ADC_READ_LEN, &ret_num, 0);
|
||||||
|
if (adc_ret == ESP_OK) {
|
||||||
|
for (int i = 0; i < ret_num; i+= SOC_ADC_DIGI_RESULT_BYTES) {
|
||||||
|
/* Grab the data and channel number */
|
||||||
|
adc_digi_output_data_t *p_data = (void*)&result[i];
|
||||||
|
uint32_t chan = ((p_data)->type2.channel);
|
||||||
|
uint32_t data = ((p_data)->type2.data);
|
||||||
|
/* Check channel number to see if data is bogus */
|
||||||
|
if (chan < SOC_ADC_CHANNEL_NUM(ADC_UNIT_1)) {
|
||||||
|
ESP_LOGI("adc", "ADC_1_%"PRIu32" value: %"PRIx32, chan, data);
|
||||||
|
} else {
|
||||||
|
ESP_LOGW("adc", "Invalid data from ADC_1_%"PRIu32, chan);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cleanup ADC */
|
||||||
|
adc_cleanup();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue