From 52e7be2e9765b28e63a434bb9e76456ade2516dd Mon Sep 17 00:00:00 2001 From: Valentin Ochs Date: Wed, 18 Jan 2023 01:42:36 +0100 Subject: [PATCH] Documentation for `sigma_delta_output` component (#2500) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: H. Árkosi Róbert Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- .../output/images/sigma-delta-example.png | Bin 0 -> 15418 bytes components/output/sigma_delta.rst | 81 ++++++++++++++++++ components/output/slow_pwm.rst | 9 ++ images/sigma-delta.svg | 50 +++++++++++ index.rst | 1 + 5 files changed, 141 insertions(+) create mode 100644 components/output/images/sigma-delta-example.png create mode 100644 components/output/sigma_delta.rst create mode 100644 images/sigma-delta.svg diff --git a/components/output/images/sigma-delta-example.png b/components/output/images/sigma-delta-example.png new file mode 100644 index 0000000000000000000000000000000000000000..c4cebdc2808834f6179ac3523e797cdc89aa9831 GIT binary patch literal 15418 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 i9;Xm>E5H8|Ye&4by=yNS!`__ +to output a floating-point value on a binary output. Unlike with :doc:`/components/output/slow_pwm`, +it is possible to update the output value with each update cycle, not just at the end of a longer period. + +.. figure:: images/sigma-delta-example.png + :align: center + :width: 65.0% + + Comparison between a *Slow PWM* with a period of 100s and a *sigma-delta output* with an update interval of 1s + +For example, if you choose to toggle the output at most once every 1 second and decide on a +PWM period of 10 seconds, for reasonably frequent updates, with :doc:`/components/output/slow_pwm` +there are only 10 possible levels, and for higher precision a longer update interval is needed, +restricting the update rate. + +A *sigma-delta* output is updated during each cycle, thus a higher precision can be achieved, without +being constrained by a calculation timeframe (=period). + +So instead of having to define a ``period`` where the width of the pulse determines the output level, here you +choose an ``update_interval`` which acts like a clock signal from where the pulse density determines the output level. + +This component can be used as a drop-in replacement for :doc:`/components/output/slow_pwm` by changing the ``platform`` to +``sigma_delta_output`` and changing ``period`` to ``update_interval`` (you usually want to set the *sigma-delta*'s +``update_interval`` as a fraction of *Slow PWM*'s ``period`` for similar results) + +.. code-block:: yaml + + # Example configuration entry + output: + - platform: sigma_delta_output + update_interval: 10s + id: sd_heater_output + + # Output to a pin + pin: 15 + + # Use the same output, but through automations + turn_on_action: + then: + - output.turn_on: heater_relay + turn_off_action: + then: + - output.turn_off: heater_relay + + - platform: gpio + pin: 15 + id: heater_relay + +Configuration variables: + +- **update_interval** (**Required**, :ref:`Time `): The cycle interval at which the output is recalculated. +- **pin** (*Optional*, :ref:`Pin Schema `): The pin to pulse. +- **state_change_action** (*Optional*, :ref:`Automation `): An automation to perform when the load is switched. If a lambda is used the boolean ``state`` parameter holds the new status. +- **turn_on_action** (*Optional*, :ref:`Automation `): An automation to perform when the load is turned on. Can be used to control for example a switch or output component. +- **turn_off_action** (*Optional*, :ref:`Automation `): An automation to perform when the load is turned off. ``turn_on_action`` and ``turn_off_action`` must be configured together. +- All options from :ref:`Output `. + +.. note:: + + - If ``pin`` is defined, the GPIO pin state is writen before any action is executed. + - ``state_change_action`` and ``turn_on_action``/``turn_off_action`` can be used togther. ``state_change_action`` is called before ``turn_on_action``/``turn_off_action``. It's recommended to use either ``state_change_action`` or ``turn_on_action``/``turn_off_action`` to change the state of an output. Using both automations together is only recommended for monitoring. + + +.. note:: + + If the output must not be active for more than some fixed time before it has + to be off for a while to e.g. cool down, :doc:`/components/output/slow_pwm` + should be used with a ``max_power`` setting to better control the duty + cycle. + +See Also +-------- + +- :doc:`/components/output/index` +- `Sigma-Delta `__ +- :doc:`/components/output/slow_pwm` +- :apiref:`sigma_delta_output/sigma_delta_output.h` +- :ghedit:`Edit` diff --git a/components/output/slow_pwm.rst b/components/output/slow_pwm.rst index 6f3ec6f83..9c129f4d9 100644 --- a/components/output/slow_pwm.rst +++ b/components/output/slow_pwm.rst @@ -67,12 +67,21 @@ Example: - output.turn_off: output1 +.. note:: + + If the duty cycle is not constrained to a maximum value, the + :doc:`/components/output/sigma_delta` component offers faster updates and + greater control over the switching frequency. This is better for loads that + need some time to fully change between on and off, like eletric thermal + actuator heads or fans. + See Also -------- - :doc:`/components/output/index` - :doc:`/components/output/esp8266_pwm` - :doc:`/components/output/ledc` +- :doc:`/components/output/sigma_delta` - :doc:`/components/light/monochromatic` - :doc:`/components/fan/speed` - :doc:`/components/power_supply` diff --git a/images/sigma-delta.svg b/images/sigma-delta.svg new file mode 100644 index 000000000..56a417c2f --- /dev/null +++ b/images/sigma-delta.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + diff --git a/index.rst b/index.rst index a12ee82e0..a8a2ecf8d 100644 --- a/index.rst +++ b/index.rst @@ -447,6 +447,7 @@ Output Components BLE Binary Output, components/output/ble_client, bluetooth.svg Modbus Output, components/output/modbus_controller, modbus.png Custom Output, components/output/custom, language-cpp.svg + Sigma-Delta Output, components/output/sigma_delta, sigma-delta.svg Template Output, components/output/template, description.svg BP1658CJ, components/output/bp1658cj, bp1658cj.svg BP5758D, components/output/bp5758d, bp5758d.svg