drivers: sensor: mcux qdec add filter parameters
Add optional filter value properties. The filter is disabled by default but can be enabled by setting the filter-sample-period > 0 in the dts file. A latency is introduced if the filter is enabled. The latency can be printed by setting sensor log level to debug. Signed-off-by: Jeppe Odgaard <jeppe.odgaard@prevas.dk>
This commit is contained in:
parent
8820f95199
commit
1ef0649825
2 changed files with 29 additions and 0 deletions
|
|
@ -166,11 +166,15 @@ static void init_inputs(const struct device *dev)
|
|||
BUILD_ASSERT(IN_RANGE(DT_INST_PROP(n, p), min, max), \
|
||||
STRINGIFY(p) " value is out of range")), ())
|
||||
|
||||
#define QDEC_SET_COND(n, v, p) \
|
||||
COND_CODE_1(DT_INST_NODE_HAS_PROP(n, p), (v = DT_INST_PROP(n, p)), ())
|
||||
|
||||
#define QDEC_MCUX_INIT(n) \
|
||||
\
|
||||
BUILD_ASSERT((DT_PROP_LEN(XBAR_PHANDLE(n), xbar_maps) % 2) == 0, \
|
||||
"xbar_maps length must be an even number"); \
|
||||
QDEC_CHECK_COND(n, counts_per_revolution, 1, UINT16_MAX); \
|
||||
QDEC_CHECK_COND(n, filter_sample_period, 0, UINT8_MAX); \
|
||||
\
|
||||
static struct qdec_mcux_data qdec_mcux_##n##_data = { \
|
||||
.counts_per_revolution = DT_INST_PROP(n, counts_per_revolution) \
|
||||
|
|
@ -198,6 +202,12 @@ static void init_inputs(const struct device *dev)
|
|||
ENC_GetDefaultConfig(&data->qdec_config); \
|
||||
data->qdec_config.decoderWorkMode = int_to_work_mode( \
|
||||
DT_INST_PROP(n, single_phase_mode)); \
|
||||
QDEC_SET_COND(n, data->qdec_config.filterCount, filter_count); \
|
||||
QDEC_SET_COND(n, data->qdec_config.filterSamplePeriod, \
|
||||
filter_sample_period); \
|
||||
LOG_DBG("Latency is %u filter clock cycles + 2 IPBus clock " \
|
||||
"periods", data->qdec_config.filterSamplePeriod * \
|
||||
(data->qdec_config.filterCount + 3)); \
|
||||
ENC_Init(config->base, &data->qdec_config); \
|
||||
\
|
||||
/* Update the position counter with initial value. */ \
|
||||
|
|
|
|||
|
|
@ -28,6 +28,25 @@ properties:
|
|||
generates a count signal. The PHASEB input and the REV bit control the
|
||||
counter direction.
|
||||
|
||||
filter-count:
|
||||
type: int
|
||||
enum: [0, 1, 2, 3, 4, 5, 6, 7]
|
||||
description: |
|
||||
The number of consecutive samples that must agree prior to the input
|
||||
filter accepting an input transition. A value of 0 represents 3
|
||||
samples. A value of 7 represents 10 samples.
|
||||
|
||||
filter-sample-period:
|
||||
type: int
|
||||
description: |
|
||||
The sampling period (in IPBus clock cycles) of the decoder input signals.
|
||||
Each input is sampled multiple times at the rate specified by the Filter
|
||||
Sample Period. If FILT_PER is 0 (default), then the input filter is
|
||||
bypassed. Bypassing the digital filter enables the position/position
|
||||
difference counters to operate with count rates up to the IPBus
|
||||
frequency. Turning on the input filter introduces a latency of:
|
||||
((FILT_CNT + 3) * FILT_PER) FILT clock cycles + 2 IPBus clock periods.
|
||||
|
||||
xbar:
|
||||
type: phandle
|
||||
required: true
|
||||
|
|
|
|||
Loading…
Reference in a new issue