diff --git a/docs/esp32/quickref.rst b/docs/esp32/quickref.rst old mode 100644 new mode 100755 index e03a5ffbc9d24..08df25b0554d0 --- 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 0e85dc9c9bfb2..48478438b367d --- 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 044b43655c66b..c9f6e5347201f --- 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 06a1d7b0e2b61..40b0d8c18e60d --- 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();
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: