8#include "hardware/pio.h"
15#define quadrature_encoder_wrap_target 15
16#define quadrature_encoder_wrap 28
18static const uint16_t quadrature_encoder_program_instructions[] = {
53static const struct pio_program quadrature_encoder_program = {
54 .instructions = quadrature_encoder_program_instructions,
59static inline pio_sm_config quadrature_encoder_program_get_default_config(uint offset) {
60 pio_sm_config c = pio_get_default_sm_config();
65#include "hardware/clocks.h"
66#include "hardware/gpio.h"
71static inline void quadrature_encoder_program_init(PIO pio, uint sm, uint offset, uint pin,
int max_step_rate)
73 pio_sm_set_consecutive_pindirs(pio, sm, pin, 2,
false);
75 gpio_pull_up(pin + 1);
76 pio_sm_config c = quadrature_encoder_program_get_default_config(offset);
77 sm_config_set_in_pins(&c, pin);
78 sm_config_set_jmp_pin(&c, pin);
80 sm_config_set_in_shift(&c,
false,
false, 32);
82 sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_NONE);
84 if (max_step_rate == 0) {
85 sm_config_set_clkdiv(&c, 1.0);
88 float div = (float)clock_get_hz(clk_sys) / (14 * max_step_rate);
89 sm_config_set_clkdiv(&c, div);
91 pio_sm_init(pio, sm, offset, &c);
92 pio_sm_set_enabled(pio, sm,
true);
99static inline void quadrature_encoder_request_count(PIO pio, uint sm)
103static inline int32_t quadrature_encoder_fetch_count(PIO pio, uint sm)
105 while (pio_sm_is_rx_fifo_empty(pio, sm));
108static inline int32_t quadrature_encoder_get_count(PIO pio, uint sm)
110 quadrature_encoder_request_count(pio, sm);
111 return quadrature_encoder_fetch_count(pio, sm);
#define quadrature_encoder_wrap
Definition quadrature_encoder.pio.h:16
#define quadrature_encoder_wrap_target
Definition quadrature_encoder.pio.h:15