Skip to content

Commit 638c7f7

Browse files
authored
Merge pull request #3514 from hierophect/esp32-analogout
ESP32-S2: AnalogOut
2 parents 0a60a42 + b435ef0 commit 638c7f7

File tree

3 files changed

+23
-5
lines changed

3 files changed

+23
-5
lines changed

ports/esp32s2/common-hal/analogio/AnalogOut.c

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,25 +35,39 @@
3535
#include "shared-bindings/microcontroller/Pin.h"
3636
#include "supervisor/shared/translate.h"
3737

38+
#include "components/driver/include/driver/dac_common.h"
39+
3840
#include "common-hal/microcontroller/Pin.h"
3941

4042
void common_hal_analogio_analogout_construct(analogio_analogout_obj_t* self,
4143
const mcu_pin_obj_t *pin) {
42-
mp_raise_NotImplementedError(translate("No DAC on chip"));
44+
if (pin == &pin_GPIO17) {
45+
self->channel = DAC_CHANNEL_1;
46+
} else if (pin == &pin_GPIO18) {
47+
self->channel = DAC_CHANNEL_2;
48+
} else {
49+
mp_raise_ValueError(translate("Invalid DAC pin supplied"));
50+
}
51+
dac_output_enable(self->channel);
4352
}
4453

4554
bool common_hal_analogio_analogout_deinited(analogio_analogout_obj_t *self) {
46-
return true;
55+
return (self->channel == DAC_CHANNEL_MAX);
4756
}
4857

4958
void common_hal_analogio_analogout_deinit(analogio_analogout_obj_t *self) {
50-
59+
dac_output_disable(self->channel);
60+
self->channel = DAC_CHANNEL_MAX;
5161
}
5262

5363
void common_hal_analogio_analogout_set_value(analogio_analogout_obj_t *self,
5464
uint16_t value) {
65+
uint8_t dac_value = (value * 255) / 65535;
66+
dac_output_enable(self->channel);
67+
dac_output_voltage(self->channel, dac_value);
5568
}
5669

5770
void analogout_reset(void) {
58-
71+
dac_output_disable(DAC_CHANNEL_1);
72+
dac_output_disable(DAC_CHANNEL_2);
5973
}

ports/esp32s2/common-hal/analogio/AnalogOut.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ typedef struct {
3636
mp_obj_base_t base;
3737
const mcu_pin_obj_t * pin;
3838
uint8_t channel;
39-
uint8_t dac_index:1;
4039
} analogio_analogout_obj_t;
4140

4241
void analogout_reset(void);

ports/esp32s2/supervisor/port.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include "freertos/task.h"
3636

3737
#include "common-hal/microcontroller/Pin.h"
38+
#include "common-hal/analogio/AnalogOut.h"
3839
#include "common-hal/busio/I2C.h"
3940
#include "common-hal/busio/SPI.h"
4041
#include "common-hal/busio/UART.h"
@@ -95,6 +96,10 @@ void reset_port(void) {
9596
// A larger delay so the idle task can run and do any IDF cleanup needed.
9697
vTaskDelay(4);
9798

99+
#if CIRCUITPY_ANALOGIO
100+
analogout_reset();
101+
#endif
102+
98103
#if CIRCUITPY_PULSEIO
99104
esp32s2_peripherals_rmt_reset();
100105
pulsein_reset();

0 commit comments

Comments
 (0)