22
22
#include "soc/rtc_cntl_reg.h"
23
23
#include "soc/sens_reg.h"
24
24
25
- static uint8_t __analogAttenuation = 0 ;//0db
25
+ static uint8_t __analogAttenuation = 3 ;//11db
26
26
static uint8_t __analogWidth = 3 ;//12 bits
27
27
static uint8_t __analogCycles = 8 ;
28
28
static uint8_t __analogSamples = 0 ;//1 sample
@@ -66,22 +66,24 @@ void __analogSetClockDiv(uint8_t clockDiv){
66
66
SET_PERI_REG_BITS (SENS_SAR_READ_CTRL2_REG , SENS_SAR2_CLK_DIV , __analogClockDiv , SENS_SAR2_CLK_DIV_S );
67
67
}
68
68
69
- void __analogSetAttenuation (uint8_t attenuation ){
69
+ void __analogSetAttenuation (adc_attenuation_t attenuation )
70
+ {
70
71
__analogAttenuation = attenuation & 3 ;
71
72
uint32_t att_data = 0 ;
72
- int i = 8 ;
73
+ int i = 10 ;
73
74
while (i -- ){
74
75
att_data |= __analogAttenuation << (i * 2 );
75
76
}
76
- SET_PERI_REG_BITS ( SENS_SAR_MEAS_START1_REG , SENS_MEAS1_DATA_SAR , att_data , SENS_MEAS1_DATA_SAR_S );
77
- SET_PERI_REG_BITS ( SENS_SAR_MEAS_START2_REG , SENS_MEAS2_DATA_SAR , att_data , SENS_MEAS2_DATA_SAR_S );
77
+ WRITE_PERI_REG ( SENS_SAR_ATTEN1_REG , att_data & 0xFFFF ); //ADC1 has 8 channels
78
+ WRITE_PERI_REG ( SENS_SAR_ATTEN2_REG , att_data );
78
79
}
79
80
80
81
void IRAM_ATTR __analogInit (){
81
82
static bool initialized = false;
82
83
if (initialized ){
83
84
return ;
84
85
}
86
+
85
87
__analogSetAttenuation (__analogAttenuation );
86
88
__analogSetCycles (__analogCycles );
87
89
__analogSetSamples (__analogSamples + 1 );//in samples
@@ -108,6 +110,20 @@ void IRAM_ATTR __analogInit(){
108
110
initialized = true;
109
111
}
110
112
113
+ void __analogSetPinAttenuation (uint8_t pin , adc_attenuation_t attenuation )
114
+ {
115
+ int8_t channel = digitalPinToAnalogChannel (pin );
116
+ if (channel < 0 || attenuation > 3 ){
117
+ return ;
118
+ }
119
+ __analogInit ();
120
+ if (channel > 7 ){
121
+ SET_PERI_REG_BITS (SENS_SAR_ATTEN2_REG , 3 , attenuation , ((channel - 10 ) * 2 ));
122
+ } else {
123
+ SET_PERI_REG_BITS (SENS_SAR_ATTEN1_REG , 3 , attenuation , (channel * 2 ));
124
+ }
125
+ }
126
+
111
127
uint16_t IRAM_ATTR __analogRead (uint8_t pin )
112
128
{
113
129
int8_t channel = digitalPinToAnalogChannel (pin );
@@ -150,6 +166,7 @@ uint16_t IRAM_ATTR __analogRead(uint8_t pin)
150
166
while (GET_PERI_REG_MASK (SENS_SAR_MEAS_START1_REG , SENS_MEAS1_DONE_SAR ) == 0 ) {}; //read done
151
167
return GET_PERI_REG_BITS2 (SENS_SAR_MEAS_START1_REG , SENS_MEAS1_DATA_SAR , SENS_MEAS1_DATA_SAR_S );
152
168
}
169
+
153
170
int __hallRead () //hall sensor without LNA
154
171
{
155
172
int Sens_Vp0 ;
@@ -179,5 +196,6 @@ extern void analogSetWidth(uint8_t bits) __attribute__ ((weak, alias("__analogSe
179
196
extern void analogSetCycles (uint8_t cycles ) __attribute__ ((weak , alias ("__analogSetCycles" )));
180
197
extern void analogSetSamples (uint8_t samples ) __attribute__ ((weak , alias ("__analogSetSamples" )));
181
198
extern void analogSetClockDiv (uint8_t clockDiv ) __attribute__ ((weak , alias ("__analogSetClockDiv" )));
182
- //extern void analogSetAttenuation(uint8_t attenuation) __attribute__ ((weak, alias("__analogSetAttenuation")));
199
+ extern void analogSetAttenuation (adc_attenuation_t attenuation ) __attribute__ ((weak , alias ("__analogSetAttenuation" )));
200
+ extern void analogSetPinAttenuation (uint8_t pin , adc_attenuation_t attenuation ) __attribute__ ((weak , alias ("__analogSetPinAttenuation" )));
183
201
extern int hallRead () __attribute__ ((weak , alias ("__hallRead" )));
0 commit comments