Add basic ADC calibration.
This commit is contained in:
@@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
#include <driver/ledc.h>
|
#include <driver/ledc.h>
|
||||||
#include <driver/adc.h>
|
#include <driver/adc.h>
|
||||||
|
#include <esp_adc_cal.h>
|
||||||
#include <soc/adc_channel.h>
|
#include <soc/adc_channel.h>
|
||||||
|
|
||||||
#include "wiring_analog.h"
|
#include "wiring_analog.h"
|
||||||
@@ -46,33 +47,48 @@ void analogWrite(uint32_t pin, uint32_t value)
|
|||||||
ledc_channel_config(&ledc_conf);
|
ledc_channel_config(&ledc_conf);
|
||||||
}
|
}
|
||||||
|
|
||||||
int analogRead(uint32_t pin)
|
int analogRead(uint32_t pin, uint32_t atten)
|
||||||
{
|
{
|
||||||
int channel;
|
#define DEFAULT_VREF 1100
|
||||||
|
static esp_adc_cal_characteristics_t *adc_chars;
|
||||||
|
adc_channel_t channel;
|
||||||
|
|
||||||
switch(pin)
|
switch(pin)
|
||||||
{
|
{
|
||||||
case ADC1_CHANNEL_0_GPIO_NUM:
|
case ADC1_CHANNEL_0_GPIO_NUM:
|
||||||
channel = ADC1_GPIO36_CHANNEL;
|
channel = ADC1_GPIO36_CHANNEL;
|
||||||
|
break;
|
||||||
case ADC1_CHANNEL_1_GPIO_NUM:
|
case ADC1_CHANNEL_1_GPIO_NUM:
|
||||||
channel = ADC1_GPIO37_CHANNEL;
|
channel = ADC1_GPIO37_CHANNEL;
|
||||||
|
break;
|
||||||
case ADC1_CHANNEL_2_GPIO_NUM:
|
case ADC1_CHANNEL_2_GPIO_NUM:
|
||||||
channel = ADC1_GPIO38_CHANNEL;
|
channel = ADC1_GPIO38_CHANNEL;
|
||||||
|
break;
|
||||||
case ADC1_CHANNEL_3_GPIO_NUM:
|
case ADC1_CHANNEL_3_GPIO_NUM:
|
||||||
channel = ADC1_GPIO39_CHANNEL;
|
channel = ADC1_GPIO39_CHANNEL;
|
||||||
|
break;
|
||||||
case ADC1_CHANNEL_4_GPIO_NUM:
|
case ADC1_CHANNEL_4_GPIO_NUM:
|
||||||
channel = ADC1_GPIO32_CHANNEL;
|
channel = ADC1_GPIO32_CHANNEL;
|
||||||
|
break;
|
||||||
case ADC1_CHANNEL_5_GPIO_NUM:
|
case ADC1_CHANNEL_5_GPIO_NUM:
|
||||||
channel = ADC1_GPIO33_CHANNEL;
|
channel = ADC1_GPIO33_CHANNEL;
|
||||||
|
break;
|
||||||
case ADC1_CHANNEL_6_GPIO_NUM:
|
case ADC1_CHANNEL_6_GPIO_NUM:
|
||||||
channel = ADC1_GPIO34_CHANNEL;
|
channel = ADC1_GPIO34_CHANNEL;
|
||||||
|
break;
|
||||||
case ADC1_CHANNEL_7_GPIO_NUM:
|
case ADC1_CHANNEL_7_GPIO_NUM:
|
||||||
channel = ADC1_GPIO35_CHANNEL;
|
channel = ADC1_GPIO35_CHANNEL;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
adc1_config_width(ADC_WIDTH_BIT_12);
|
adc1_config_width(ADC_WIDTH_BIT_12);
|
||||||
adc1_config_channel_atten(channel, ADC_ATTEN_DB_11);
|
adc1_config_channel_atten(channel, atten);
|
||||||
|
|
||||||
|
adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t));
|
||||||
|
esp_adc_cal_characterize(ADC_UNIT_1, atten, ADC_WIDTH_BIT_12, DEFAULT_VREF, adc_chars);
|
||||||
|
|
||||||
int val = adc1_get_raw(channel);
|
int val = adc1_get_raw(channel);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ extern "C" {
|
|||||||
|
|
||||||
extern void analogWrite(uint32_t pin, uint32_t value);
|
extern void analogWrite(uint32_t pin, uint32_t value);
|
||||||
|
|
||||||
extern int analogRead(uint32_t pin);
|
extern int analogRead(uint32_t pin, uint32_t atten);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1010,11 +1010,13 @@ int setDigitalRead(const uint8_t command[], uint8_t response[])
|
|||||||
int setAnalogRead(const uint8_t command[], uint8_t response[])
|
int setAnalogRead(const uint8_t command[], uint8_t response[])
|
||||||
{
|
{
|
||||||
uint8_t pin = command[4];
|
uint8_t pin = command[4];
|
||||||
|
uint8_t atten = command[6];
|
||||||
|
|
||||||
int value = digitalRead(pin);
|
int value = analogRead(pin, atten);
|
||||||
|
|
||||||
response[2] = 1; // number of parameters
|
response[2] = 1; // number of parameters
|
||||||
response[3] = sizeof(value); // parameter 1 length
|
response[3] = sizeof(value); // parameter 1 length
|
||||||
|
|
||||||
memcpy(&response[4], &value, sizeof(value));
|
memcpy(&response[4], &value, sizeof(value));
|
||||||
|
|
||||||
return 5 + sizeof(value);
|
return 5 + sizeof(value);
|
||||||
|
|||||||
Reference in New Issue
Block a user