diff --git a/docs/esp32/quickref.rst b/docs/esp32/quickref.rst old mode 100644 new mode 100755 index e03a5ffbc9d2..08df25b0554d --- a/docs/esp32/quickref.rst +++ b/docs/esp32/quickref.rst @@ -141,7 +141,7 @@ These are working configurations for LAN interfaces of popular boards:: # Olimex ESP32-GATEWAY: power controlled by Pin(5) # Olimex ESP32 PoE and ESP32-PoE ISO: power controlled by Pin(12) - lan = network.LAN(mdc=machine.Pin(23), mdio=machine.Pin(18), power=machine.Pin(5), + lan = network.LAN(mdc=machine.Pin(23), mdio=machine.Pin(18), power=machine.Pin(5), phy_type=network.PHY_LAN8720, phy_addr=0, ref_clk=machine.Pin(17), ref_clk_mode=machine.Pin.OUT) @@ -330,6 +330,19 @@ possible at the same frequency. See more examples in the :ref:`esp32_pwm` tutorial. +DAC (digital to analog conversion) +---------------------------------- + +On the ESP32, DAC functionality is available on pins 25, 26. +On the ESP32S2, DAC functionality is available on pins 17, 18. + +Use the DAC:: + + from machine import DAC, Pin + + dac = DAC(Pin(25)) # create an DAC object acting on a pin + dac.write(128) # set a raw analog value in the range 0-255, 50% now + ADC (analog to digital conversion) ---------------------------------- diff --git a/ports/esp32/machine_dac.c b/ports/esp32/machine_dac.c old mode 100644 new mode 100755 index 0e85dc9c9bfb..48478438b367 --- a/ports/esp32/machine_dac.c +++ b/ports/esp32/machine_dac.c @@ -87,7 +87,7 @@ STATIC mp_obj_t mdac_write(mp_obj_t self_in, mp_obj_t value_in) { mdac_obj_t *self = self_in; int value = mp_obj_get_int(value_in); if (value < 0 || value > 255) { - mp_raise_ValueError(MP_ERROR_TEXT("value out of range")); + mp_raise_ValueError(MP_ERROR_TEXT("value out of range [0..255]")); } esp_err_t err = dac_output_voltage(self->dac_id, value); @@ -98,8 +98,24 @@ STATIC mp_obj_t mdac_write(mp_obj_t self_in, mp_obj_t value_in) { } MP_DEFINE_CONST_FUN_OBJ_2(mdac_write_obj, mdac_write); +STATIC mp_obj_t mdac_deinit(mp_obj_t self_in) { + mdac_obj_t *self = self_in; + check_esp_err(dac_output_disable(self->dac_id)); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(mdac_deinit_obj, mdac_deinit); + +// This called from Ctrl-D soft reboot +void machine_dac_deinit_all(void) { + for (int i = 0; i < MP_ARRAY_SIZE(mdac_obj); i++) { + mdac_deinit((mdac_obj_t *)&mdac_obj[i]); + } +} + STATIC const mp_rom_map_elem_t mdac_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_write), MP_ROM_PTR(&mdac_write_obj) }, + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&mdac_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&mdac_deinit_obj) }, }; STATIC MP_DEFINE_CONST_DICT(mdac_locals_dict, mdac_locals_dict_table); diff --git a/ports/esp32/main.c b/ports/esp32/main.c old mode 100644 new mode 100755 index 044b43655c66..c9f6e5347201 --- a/ports/esp32/main.c +++ b/ports/esp32/main.c @@ -182,6 +182,9 @@ void mp_task(void *pvParameter) { // deinitialise peripherals machine_pwm_deinit_all(); + #if MICROPY_PY_MACHINE_DAC + machine_dac_deinit_all(); + #endif // TODO: machine_rmt_deinit_all(); machine_pins_deinit(); machine_deinit(); diff --git a/ports/esp32/modmachine.h b/ports/esp32/modmachine.h old mode 100644 new mode 100755 index 06a1d7b0e2b6..40b0d8c18e60 --- a/ports/esp32/modmachine.h +++ b/ports/esp32/modmachine.h @@ -18,6 +18,9 @@ void machine_deinit(void); void machine_pins_init(void); void machine_pins_deinit(void); void machine_pwm_deinit_all(void); +#if MICROPY_PY_MACHINE_DAC +void machine_dac_deinit_all(void); +#endif // TODO: void machine_rmt_deinit_all(void); void machine_timer_deinit_all(void); void machine_i2s_init0();