Add analogSetAttenuation and analogSetPinAttenuation

This commit is contained in:
me-no-dev 2016-12-14 02:29:51 +02:00
parent 7defc6ebf3
commit e92634a92b
2 changed files with 46 additions and 7 deletions

View File

@ -22,7 +22,7 @@
#include "soc/rtc_cntl_reg.h" #include "soc/rtc_cntl_reg.h"
#include "soc/sens_reg.h" #include "soc/sens_reg.h"
static uint8_t __analogAttenuation = 0;//0db static uint8_t __analogAttenuation = 3;//11db
static uint8_t __analogWidth = 3;//12 bits static uint8_t __analogWidth = 3;//12 bits
static uint8_t __analogCycles = 8; static uint8_t __analogCycles = 8;
static uint8_t __analogSamples = 0;//1 sample static uint8_t __analogSamples = 0;//1 sample
@ -66,15 +66,16 @@ void __analogSetClockDiv(uint8_t clockDiv){
SET_PERI_REG_BITS(SENS_SAR_READ_CTRL2_REG, SENS_SAR2_CLK_DIV, __analogClockDiv, SENS_SAR2_CLK_DIV_S); SET_PERI_REG_BITS(SENS_SAR_READ_CTRL2_REG, SENS_SAR2_CLK_DIV, __analogClockDiv, SENS_SAR2_CLK_DIV_S);
} }
void __analogSetAttenuation(uint8_t attenuation){ void __analogSetAttenuation(adc_attenuation_t attenuation)
{
__analogAttenuation = attenuation & 3; __analogAttenuation = attenuation & 3;
uint32_t att_data = 0; uint32_t att_data = 0;
int i = 8; int i = 10;
while(i--){ while(i--){
att_data |= __analogAttenuation << (i * 2); att_data |= __analogAttenuation << (i * 2);
} }
SET_PERI_REG_BITS(SENS_SAR_MEAS_START1_REG, SENS_MEAS1_DATA_SAR, att_data, SENS_MEAS1_DATA_SAR_S); WRITE_PERI_REG(SENS_SAR_ATTEN1_REG, att_data & 0xFFFF);//ADC1 has 8 channels
SET_PERI_REG_BITS(SENS_SAR_MEAS_START2_REG, SENS_MEAS2_DATA_SAR, att_data, SENS_MEAS2_DATA_SAR_S); WRITE_PERI_REG(SENS_SAR_ATTEN2_REG, att_data);
} }
void IRAM_ATTR __analogInit(){ void IRAM_ATTR __analogInit(){
@ -82,6 +83,7 @@ void IRAM_ATTR __analogInit(){
if(initialized){ if(initialized){
return; return;
} }
__analogSetAttenuation(__analogAttenuation); __analogSetAttenuation(__analogAttenuation);
__analogSetCycles(__analogCycles); __analogSetCycles(__analogCycles);
__analogSetSamples(__analogSamples + 1);//in samples __analogSetSamples(__analogSamples + 1);//in samples
@ -108,6 +110,20 @@ void IRAM_ATTR __analogInit(){
initialized = true; initialized = true;
} }
void __analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation)
{
int8_t channel = digitalPinToAnalogChannel(pin);
if(channel < 0 || attenuation > 3){
return ;
}
__analogInit();
if(channel > 7){
SET_PERI_REG_BITS(SENS_SAR_ATTEN2_REG, 3, attenuation, ((channel - 10) * 2));
} else {
SET_PERI_REG_BITS(SENS_SAR_ATTEN1_REG, 3, attenuation, (channel * 2));
}
}
uint16_t IRAM_ATTR __analogRead(uint8_t pin) uint16_t IRAM_ATTR __analogRead(uint8_t pin)
{ {
int8_t channel = digitalPinToAnalogChannel(pin); int8_t channel = digitalPinToAnalogChannel(pin);
@ -150,6 +166,7 @@ uint16_t IRAM_ATTR __analogRead(uint8_t pin)
while (GET_PERI_REG_MASK(SENS_SAR_MEAS_START1_REG, SENS_MEAS1_DONE_SAR) == 0) {}; //read done while (GET_PERI_REG_MASK(SENS_SAR_MEAS_START1_REG, SENS_MEAS1_DONE_SAR) == 0) {}; //read done
return GET_PERI_REG_BITS2(SENS_SAR_MEAS_START1_REG, SENS_MEAS1_DATA_SAR, SENS_MEAS1_DATA_SAR_S); return GET_PERI_REG_BITS2(SENS_SAR_MEAS_START1_REG, SENS_MEAS1_DATA_SAR, SENS_MEAS1_DATA_SAR_S);
} }
int __hallRead() //hall sensor without LNA int __hallRead() //hall sensor without LNA
{ {
int Sens_Vp0; int Sens_Vp0;
@ -179,5 +196,6 @@ extern void analogSetWidth(uint8_t bits) __attribute__ ((weak, alias("__analogSe
extern void analogSetCycles(uint8_t cycles) __attribute__ ((weak, alias("__analogSetCycles"))); extern void analogSetCycles(uint8_t cycles) __attribute__ ((weak, alias("__analogSetCycles")));
extern void analogSetSamples(uint8_t samples) __attribute__ ((weak, alias("__analogSetSamples"))); extern void analogSetSamples(uint8_t samples) __attribute__ ((weak, alias("__analogSetSamples")));
extern void analogSetClockDiv(uint8_t clockDiv) __attribute__ ((weak, alias("__analogSetClockDiv"))); extern void analogSetClockDiv(uint8_t clockDiv) __attribute__ ((weak, alias("__analogSetClockDiv")));
//extern void analogSetAttenuation(uint8_t attenuation) __attribute__ ((weak, alias("__analogSetAttenuation"))); extern void analogSetAttenuation(adc_attenuation_t attenuation) __attribute__ ((weak, alias("__analogSetAttenuation")));
extern void analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation) __attribute__ ((weak, alias("__analogSetPinAttenuation")));
extern int hallRead() __attribute__ ((weak, alias("__hallRead"))); extern int hallRead() __attribute__ ((weak, alias("__hallRead")));

View File

@ -26,13 +26,22 @@ extern "C" {
#include "esp32-hal.h" #include "esp32-hal.h"
typedef enum {
ADC_0db,
ADC_2_5db,
ADC_6db,
ADC_11db
} adc_attenuation_t;
/* /*
* Get ADC value for pin * Get ADC value for pin
* */ * */
uint16_t analogRead(uint8_t pin); uint16_t analogRead(uint8_t pin);
/* /*
* Sets the sample bits (9 - 12) * Sets the sample bits
* Default is 12bit (0 - 4095)
* Range is 9 - 12
* */ * */
void analogSetWidth(uint8_t bits); void analogSetWidth(uint8_t bits);
@ -61,6 +70,18 @@ void analogSetSamples(uint8_t samples);
* */ * */
void analogSetClockDiv(uint8_t clockDiv); void analogSetClockDiv(uint8_t clockDiv);
/*
* Set the attenuation for all channels
* Default is 11db
* */
void analogSetAttenuation(adc_attenuation_t attenuation);
/*
* Set the attenuation for particular pin
* Default is 11db
* */
void analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation);
/* /*
* Get value for HALL sensor (without LNA) * Get value for HALL sensor (without LNA)
* connected to pins 36(SVP) and 39(SVN) * connected to pins 36(SVP) and 39(SVN)