@@ -303,6 +303,98 @@ ESP32 specific ADC class method reference:
303
303
- ``ADC.WIDTH_11BIT ``: 11 bit data
304
304
- ``ADC.WIDTH_12BIT ``: 12 bit data - this is the default configuration
305
305
306
+ Counter (pin pulse/edge counting)
307
+ ---------------------------------
308
+
309
+ The ESP32 provides up to 8 pulse counter peripherals depending on the hardware,
310
+ with id 0..7. These can be configured to count rising and/or falling edges on
311
+ any input pin.
312
+
313
+ Use the :ref: `machine.Counter <machine.Counter >` class::
314
+
315
+ from machine import Pin, Counter
316
+
317
+ counter = Counter(0, pin=Pin(2), rising=Counter.INCREMENT) # create counter
318
+ counter.start() # start counter
319
+ count = counter.value() # read count, -32768..32767
320
+ counter.value(0) # reset counter
321
+ count = counter.value(0) # read and reset
322
+
323
+ ESP32 specific Counter reference:
324
+
325
+ .. class :: Counter(id, *, pin, rising, falling, ...)
326
+
327
+ The constructor and ``init `` method support an additional set of
328
+ keyword arguments over-and-above the basic
329
+ :ref: `machine.Counter <machine.Counter >` API:
330
+
331
+ - ``mode_pin ``: ESP32 pulse counters support monitoring a second pin and
332
+ altering the behaviour of the counter based on its level - set this
333
+ keyword to any input Pin
334
+ - ``mode_low ``: set to either ``Counter.HOLD `` or ``Counter.REVERSE `` to
335
+ either suspend counting or reverse the direction of the counter (i.e.,
336
+ ``Counter.INCREMENT `` behaves as ``Counter.DECREMENT `` and vice versa)
337
+ when ``mode_pin `` is low
338
+ - ``mode_high ``: as ``mode_low `` but for the behaviour when ``mode_pin ``
339
+ is high
340
+ - ``filter ``: set to a value 1..1023, in ticks of the 80MHz clock, to
341
+ enable the pulse width filter
342
+ - ``minimum ``: set to the minimum level of the counter value when
343
+ decrementing (-32768..0)
344
+ - ``maximum ``: set to the maximum level of the counter value when
345
+ decrementing (0..32767)
346
+ - ``threshold0 ``: sets the counter value for the
347
+ ``Counter.IRQ_THRESHOLD0 `` event (see ``irq `` method)
348
+ - ``threshold1 ``: sets the counter value for the
349
+ ``Counter.IRQ_THRESHOLD1 `` event (see ``irq `` method)
350
+ - ``channel ``: see description below
351
+
352
+ Each pulse counter unit supports two channels, 0 and 1. By default, the
353
+ constructor and ``init() `` method configure the 0 channel. Call the
354
+ ``init() `` method with ``channel=1 `` to configure the other channel. Both
355
+ channels update the same counter value, but are able to monitor different
356
+ pins with different edge behaviour. The ``pin ``, ``rising ``, ``falling ``,
357
+ ``mode_pin ``, ``mode_low `` and ``mode_high `` keywords are per-channel, all
358
+ other keyword arguments are per-unit and specifying them will override any
359
+ previous configuration.
360
+
361
+ The second channel can be used to configure 4X quadrature decoding with a
362
+ single counter unit::
363
+
364
+ pin_a = Pin(2, Pin.INPUT, pull=Pin.PULL_UP)
365
+ pin_b = Pin(3, Pin.INPUT, pull=Pin.PULL_UP)
366
+ rotary = Counter(0, pin=pin_a, falling=Counter.INCREMENT, rising=Counter.DECREMENT, mode_pin=pin_b, mode_low=Counter.REVERSE)
367
+ rotary.init(channel=1, pin=pin_b, falling=Counter.DECREMENT, rising=Counter.INCREMENT, mode_pin=pin_a, mode_low=Counter.REVERSE)
368
+ rotary.start()
369
+
370
+ .. method :: Counter.value([value])
371
+
372
+ Call this method with no arguments to return the current counter value or
373
+ pass the value 0 to reset the counter and return the value before reset.
374
+ ESP32 pulse counters do not support being set to any value other than 0.
375
+ Reset and return is not atomic and so it is possible for a pulse to be
376
+ missed.
377
+
378
+ .. method :: Counter.irq(target=Counter.IRQ_ZERO, handler=None)
379
+
380
+ ESP32 pulse counters support interrupts on these counter events:
381
+
382
+ - ``Counter.IRQ_ZERO ``: the counter has reset to zero
383
+ - ``Counter.IRQ_MINIMUM ``: the counter has hit the ``minimum `` value
384
+ - ``Counter.IRQ_MAXIMUM ``: the counter has hit the ``maximum `` value
385
+ - ``Counter.IRQ_THRESHOLD0 ``: the counter has hit the ``threshold0 `` value
386
+ - ``Counter.IRQ_THRESHOLD1 ``: the counter has hit the ``threshold1 `` value
387
+
388
+ ``target `` should be the desired events or'ed together and ``handler ``
389
+ should be a callable taking a single argument, which will be the Counter
390
+ object. Only one handler can be in place per-unit. Set ``handler `` to
391
+ ``None `` to disable the event interrupt (or call ``irq `` with no arguments).
392
+
393
+ .. Note ::
394
+ ESP32 pulse counters reset to *zero * when reaching the minimum or maximum
395
+ value. Thus the ``IRQ_ZERO `` event will also trigger when either of these
396
+ events occurs.
397
+
306
398
Software SPI bus
307
399
----------------
308
400
0 commit comments