Skip to content

Commit

Permalink
docs\machine: Add Counter and Encoder classes.
Browse files Browse the repository at this point in the history
Signed-off-by: IhorNehrutsa <[email protected]>
  • Loading branch information
IhorNehrutsa committed Nov 2, 2024
1 parent 0e490b7 commit 5bfa656
Show file tree
Hide file tree
Showing 3 changed files with 130 additions and 0 deletions.
68 changes: 68 additions & 0 deletions docs/library/machine.Counter.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
.. currentmodule:: machine
.. _machine.Counter:

class Counter-- Pulse Counter
=============================

This class provides access to hardware-supported pulse counting.

It is currently provided for ports:

* :ref:`ESP32 <esp32_machine.Counter>`
* :ref:`MIMXRT <mimxrt_machine.Counter>`

Minimal example usage::

from machine import Pin, Counter

counter = Counter(0, src=Pin(0, mode=Pin.IN)) # create Counter object and start to count input pulses
counter.init(filter_ns=1000) # switch source filtering on
value = counter.value(0) # get current Counter value, set counter to 0
counter.deinit() # turn off the Counter

print(counter) # show the Counter object properties

Constructor
-----------

.. class:: Counter(id, src=None, \*, direction=Counter.UP, filter_ns=0)

- *id*. Values of *id* depend on a particular port and its hardware.
Values 0, 1, etc. are commonly used to select hardware block #0, #1, etc.

- *src*. The Counter pulses input pin, which is usually a
:ref:`machine.Pin <machine.Pin>` object, but a port may allow other values,
like integers or strings, which designate a Pin in the *machine.Pin* class.
It may be omitted on ports that have a predefined pin for *id*-specified hardware block.

- *direction* specifies the direction to count. Values for this include the constants
``Counter.UP`` (default value) and ``Counter.DOWN``. Ports may support additional values or
objects, such as a :ref:`machine.Pin <machine.Pin>` object to control the direction externally.

- *filter_ns* specifies a minimum period of time in nanoseconds that the source signal needs to
be stable for a pulse to be counted. Implementations should use the longest filter supported
by the hardware that is less than or equal to this value. The default is 0 – no filter.

Methods
-------

.. method:: Counter.init(*, src, ...)

Modify the settings of the Counter object. See the **Constructor** for details about the parameters.

.. method:: Counter.deinit()

Stops the Counter, disables interrupts and releases hardware resources used by the counter.
A Soft Reset involve deinitializing all Encoder objects.

.. method:: Counter.value([value])

Get, and optionally set, the counter value as a signed integer. Implementations should aim to do the get and set atomically.

Constants
---------

.. data:: Counter.UP
Counter.DOWN

Select the counter direction.
60 changes: 60 additions & 0 deletions docs/library/machine.Encoder.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
.. currentmodule:: machine
.. _machine.Encoder:

class Encoder -- Quadrature Incremental Encoder
===============================================

This class provides a hardware-supported Quadrature Incremental Encoder service.

If your port does not support hardware encoder use `Quadrature incremental encoder based on machine.Pin interrupts <https://github.com/IhorNehrutsa/MicroPython-quadrature-incremental-encoder>`_.
See also Pin-interrupt-based encoders (and problems) from Peter Hinch `Incremental encoders <https://github.com/peterhinch/micropython-samples/blob/master/encoders/ENCODERS.md>`_.
There is also `Dave Hylands an STM specific hardware-Timer-based solution <https://github.com/dhylands/upy-examples/blob/master/encoder.py>`_.

It is currently provided for ports:

* :ref:`ESP32 <esp32_machine.Encoder>`
* :ref:`MIMXRT <mimxrt_machine.Encoder>`

Minimal example usage::

from machine import Pin, Encoder

enc = Encoder(id, phase_a=Pin(0), phase_b=Pin(1)) # create Quadrature Encoder object and start to encode input pulses
enc.init(filter_ns=1000) # switch source filtering on
value = enc.value(0) # get current Encoder value, set Encoder to 0
enc.deinit() # turn off the Encoder

print(enc) # show the Encoder object properties

Constructor
-----------

.. class:: Encoder(id, phase_a=None, phase_b=None, \*, filter_ns=0)

- *id*. Values of *id* depend on a particular port and its hardware.
Values 0, 1, etc. are commonly used to select hardware block #0, #1, etc.

- *phase_a* and *phase_b* are the Quadrature encoder inputs, which are usually
:ref:`machine.Pin <machine.Pin>` objects, but a port may allow other values,
like integers or strings, which designate a Pin in the *machine.Pin* class.
They may be omitted on ports that have predefined pins for *id*-specified hardware block.

- *filter_ns* specifies a minimum period of time in nanoseconds that the source signal needs to
be stable for a pulse to be counted. Implementations should use the longest filter supported
by the hardware that is less than or equal to this value. The default is 0 – no filter.

Methods
-------

.. method:: Encoder.init(*, phase_a, ...)

Modify the settings of the Encoder object. See the **Constructor** for details about the parameters.

.. method:: Encoder.deinit()

Stops the Encoder, disables interrupts and releases hardware resources used by the encoder.
A Soft Reset involve deinitializing all Encoder objects.

.. method:: Encoder.value([value])

Get, and optionally set, the counter value as a signed integer. Implementations should aim to do the get and set atomically.
2 changes: 2 additions & 0 deletions docs/library/machine.rst
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,8 @@ Classes
machine.I2S.rst
machine.RTC.rst
machine.Timer.rst
machine.Counter.rst
machine.Encoder.rst
machine.WDT.rst
machine.SD.rst
machine.SDCard.rst
Expand Down

0 comments on commit 5bfa656

Please sign in to comment.