Skip to content

Commit 7748a9d

Browse files
committed
refactor esp32 cs dirver to remove magic numbers #296 #465
1 parent 3f6a73e commit 7748a9d

File tree

1 file changed

+72
-46
lines changed

1 file changed

+72
-46
lines changed

src/current_sense/hardware_specific/esp32/esp32_adc_driver.cpp

Lines changed: 72 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,13 @@
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
1720
void __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

Comments
 (0)