1414// configure the ADCs in RTC mode
1515// saves about 3us per call
1616// going from 12us to 9us
17+ //
18+ // TODO: See if we need to configure both ADCs or we can just configure the one we'll use
19+ // For the moment we will configure both
1720void __configFastADCs (){
18-
21+
22+ SIMPLEFOC_ESP32_CS_DEBUG (" Configuring fast ADCs" );
23+
1924 // configure both ADCs in RTC mode
2025 SET_PERI_REG_MASK (SENS_SAR_READ_CTRL_REG, SENS_SAR1_DATA_INV);
2126 SET_PERI_REG_MASK (SENS_SAR_READ_CTRL2_REG, SENS_SAR2_DATA_INV);
@@ -41,32 +46,40 @@ uint16_t IRAM_ATTR adcRead(uint8_t pin)
4146 int8_t channel = digitalPinToAnalogChannel (pin);
4247 if (channel < 0 ){
4348 SIMPLEFOC_ESP32_CS_DEBUG (" ERROR: Not ADC pin: " +String (pin));
44- return false ;// not adc pin
45- }
46-
47- // start teh ADC conversion
48- if (channel > 9 ){
49- CLEAR_PERI_REG_MASK (SENS_SAR_MEAS_START2_REG, SENS_MEAS2_START_SAR_M);
50- SET_PERI_REG_BITS (SENS_SAR_MEAS_START2_REG, SENS_SAR2_EN_PAD, (1 << (channel - 10 )), SENS_SAR2_EN_PAD_S);
51- SET_PERI_REG_MASK (SENS_SAR_MEAS_START2_REG, SENS_MEAS2_START_SAR_M);
52- } else {
53- CLEAR_PERI_REG_MASK (SENS_SAR_MEAS_START1_REG, SENS_MEAS1_START_SAR_M);
54- SET_PERI_REG_BITS (SENS_SAR_MEAS_START1_REG, SENS_SAR1_EN_PAD, (1 << channel), SENS_SAR1_EN_PAD_S);
55- SET_PERI_REG_MASK (SENS_SAR_MEAS_START1_REG, SENS_MEAS1_START_SAR_M);
49+ return false ; // not adc pin
5650 }
51+
52+ // channels <= MAX_CHANNEL_NUM belong to ADC1
53+ // channels > MAX_CHANNEL_NUM belong to ADC2 (where the channel number is number-SOC_ADC_MAX_CHANNEL_NUM)
54+ uint8_t adc_num = (channel >= SOC_ADC_MAX_CHANNEL_NUM) ? 2 : 1 ;
55+ uint8_t adc_channel = (adc_num == 2 ) ? (channel - SOC_ADC_MAX_CHANNEL_NUM) : channel;
5756
57+ // variable to hold the ADC value
5858 uint16_t value = 0 ;
59-
60- if (channel > 7 ){
61- // wait for conversion
62- while (GET_PERI_REG_MASK (SENS_SAR_MEAS_START2_REG, SENS_MEAS2_DONE_SAR) == 0 );
63- // read the value
64- value = GET_PERI_REG_BITS2 (SENS_SAR_MEAS_START2_REG, SENS_MEAS2_DATA_SAR, SENS_MEAS2_DATA_SAR_S);
65- } else {
66- // wait for conversion
67- while (GET_PERI_REG_MASK (SENS_SAR_MEAS_START1_REG, SENS_MEAS1_DONE_SAR) == 0 );
68- // read the value
69- value = GET_PERI_REG_BITS2 (SENS_SAR_MEAS_START1_REG, SENS_MEAS1_DATA_SAR, SENS_MEAS1_DATA_SAR_S);
59+ // do the ADC conversion
60+ switch (adc_num){
61+ case 1 :
62+ // start the ADC1 conversion
63+ CLEAR_PERI_REG_MASK (SENS_SAR_MEAS_START1_REG, SENS_MEAS1_START_SAR_M);
64+ SET_PERI_REG_BITS (SENS_SAR_MEAS_START1_REG, SENS_SAR1_EN_PAD, (1 << channel), SENS_SAR1_EN_PAD_S);
65+ SET_PERI_REG_MASK (SENS_SAR_MEAS_START1_REG, SENS_MEAS1_START_SAR_M);
66+
67+ // wait for conversion
68+ while (GET_PERI_REG_MASK (SENS_SAR_MEAS_START1_REG, SENS_MEAS1_DONE_SAR) == 0 );
69+ // read the value
70+ value = GET_PERI_REG_BITS2 (SENS_SAR_MEAS_START1_REG, SENS_MEAS1_DATA_SAR, SENS_MEAS1_DATA_SAR_S);
71+ break ;
72+ case 2 :
73+ // start the ADC2 conversion
74+ CLEAR_PERI_REG_MASK (SENS_SAR_MEAS_START2_REG, SENS_MEAS2_START_SAR_M);
75+ SET_PERI_REG_BITS (SENS_SAR_MEAS_START2_REG, SENS_SAR2_EN_PAD, (1 << (adc_channel)), SENS_SAR2_EN_PAD_S);
76+ SET_PERI_REG_MASK (SENS_SAR_MEAS_START2_REG, SENS_MEAS2_START_SAR_M);
77+
78+ // wait for conversion
79+ while (GET_PERI_REG_MASK (SENS_SAR_MEAS_START2_REG, SENS_MEAS2_DONE_SAR) == 0 );
80+ // read the value
81+ value = GET_PERI_REG_BITS2 (SENS_SAR_MEAS_START2_REG, SENS_MEAS2_DATA_SAR, SENS_MEAS2_DATA_SAR_S);
82+ break ;
7083 }
7184
7285 // return value
@@ -105,32 +118,40 @@ uint16_t IRAM_ATTR adcRead(uint8_t pin)
105118 int8_t channel = digitalPinToAnalogChannel (pin);
106119 if (channel < 0 ){
107120 SIMPLEFOC_ESP32_CS_DEBUG (" ERROR: Not ADC pin: " +String (pin));
108- return false ;// not adc pin
121+ return false ; // not adc pin
109122 }
110123
111- // start the ADC conversion
112- if (channel > 9 ){
113- CLEAR_PERI_REG_MASK (SENS_SAR_MEAS2_CTRL2_REG, SENS_MEAS2_START_SAR_M);
114- SET_PERI_REG_BITS (SENS_SAR_MEAS2_CTRL2_REG, SENS_SAR2_EN_PAD, (1 << (channel - 10 )), SENS_SAR2_EN_PAD_S);
115- SET_PERI_REG_MASK (SENS_SAR_MEAS2_CTRL2_REG, SENS_MEAS2_START_SAR_M);
116- } else {
117- CLEAR_PERI_REG_MASK (SENS_SAR_MEAS1_CTRL2_REG, SENS_MEAS1_START_SAR_M);
118- SET_PERI_REG_BITS (SENS_SAR_MEAS1_CTRL2_REG, SENS_SAR1_EN_PAD, (1 << channel), SENS_SAR1_EN_PAD_S);
119- SET_PERI_REG_MASK (SENS_SAR_MEAS1_CTRL2_REG, SENS_MEAS1_START_SAR_M);
120- }
124+ // channels <= MAX_CHANNEL_NUM belong to ADC1
125+ // channels > MAX_CHANNEL_NUM belong to ADC2 (where the channel number is number-SOC_ADC_MAX_CHANNEL_NUM)
126+ uint8_t adc_num = (channel >= SOC_ADC_MAX_CHANNEL_NUM) ? 2 : 1 ;
127+ uint8_t adc_channel = (adc_num == 2 ) ? (channel - SOC_ADC_MAX_CHANNEL_NUM) : channel;
121128
129+ // variable to hold the ADC value
122130 uint16_t value = 0 ;
123-
124- if (channel > 9 ){
125- // wait for conversion
126- while (GET_PERI_REG_MASK (SENS_SAR_MEAS2_CTRL2_REG, SENS_MEAS2_DONE_SAR) == 0 );
127- // read the value
128- value = GET_PERI_REG_BITS2 (SENS_SAR_MEAS2_CTRL2_REG, SENS_MEAS2_DATA_SAR, SENS_MEAS2_DATA_SAR_S);
129- } else {
130- // wait for conversion
131- while (GET_PERI_REG_MASK (SENS_SAR_MEAS1_CTRL2_REG, SENS_MEAS1_DONE_SAR) == 0 );
132- // read teh value
133- value = GET_PERI_REG_BITS2 (SENS_SAR_MEAS1_CTRL2_REG, SENS_MEAS1_DATA_SAR, SENS_MEAS1_DATA_SAR_S);
131+ // do the ADC conversion
132+ switch (adc_num){
133+ case 1 :
134+ // start the ADC1 conversion
135+ CLEAR_PERI_REG_MASK (SENS_SAR_MEAS1_CTRL2_REG, SENS_MEAS1_START_SAR_M);
136+ SET_PERI_REG_BITS (SENS_SAR_MEAS1_CTRL2_REG, SENS_SAR1_EN_PAD, (1 << (adc_channel)), SENS_SAR1_EN_PAD_S);
137+ SET_PERI_REG_MASK (SENS_SAR_MEAS1_CTRL2_REG, SENS_MEAS1_START_SAR_M);
138+
139+ // wait for conversion
140+ while (GET_PERI_REG_MASK (SENS_SAR_MEAS1_CTRL2_REG, SENS_MEAS1_DONE_SAR) == 0 );
141+ // read the value
142+ value = GET_PERI_REG_BITS2 (SENS_SAR_MEAS1_CTRL2_REG, SENS_MEAS1_DATA_SAR, SENS_MEAS1_DATA_SAR_S);
143+ break ;
144+ case 2 :
145+ // start the ADC2 conversion
146+ CLEAR_PERI_REG_MASK (SENS_SAR_MEAS2_CTRL2_REG, SENS_MEAS2_START_SAR_M);
147+ SET_PERI_REG_BITS (SENS_SAR_MEAS2_CTRL2_REG, SENS_SAR2_EN_PAD, (1 << (adc_channel)), SENS_SAR2_EN_PAD_S);
148+ SET_PERI_REG_MASK (SENS_SAR_MEAS2_CTRL2_REG, SENS_MEAS2_START_SAR_M);
149+
150+ // wait for conversion
151+ while (GET_PERI_REG_MASK (SENS_SAR_MEAS2_CTRL2_REG, SENS_MEAS2_DONE_SAR) == 0 );
152+ // read the value
153+ value = GET_PERI_REG_BITS2 (SENS_SAR_MEAS2_CTRL2_REG, SENS_MEAS2_DATA_SAR, SENS_MEAS2_DATA_SAR_S);
154+ break ;
134155 }
135156
136157 return value;
@@ -157,6 +178,11 @@ bool IRAM_ATTR adcInit(uint8_t pin){
157178 return false ;// not adc pin
158179 }
159180
181+ uint8_t adc_num = (channel >= SOC_ADC_MAX_CHANNEL_NUM) ? 2 : 1 ;
182+ uint8_t adc_channel = (adc_num == 2 ) ? (channel - SOC_ADC_MAX_CHANNEL_NUM) : channel;
183+
184+ SIMPLEFOC_ESP32_CS_DEBUG (" Configuring ADC" +String (adc_num)+" channel " +String (adc_channel));
185+
160186 if (! initialized){
161187 analogSetAttenuation (SIMPLEFOC_ADC_ATTEN);
162188 analogReadResolution (SIMPLEFOC_ADC_RES);
0 commit comments