From 7f78eb75dc628c014fde9418bb6f6c117ff5fdce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraj=20Lieskovsk=C3=BD?= Date: Fri, 25 Apr 2025 14:14:38 +0200 Subject: [PATCH] drivers: sensor: st: qdec_stm32: addition of fractional part MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The fractional part of the qdec sensor readout is set to zero (val2 = 0). Changed the format of the run time data to Q26.6 and adjusted the assignment of val1 and val2 accordingly. Signed-off-by: Juraj Lieskovský --- drivers/sensor/st/qdec_stm32/qdec_stm32.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/sensor/st/qdec_stm32/qdec_stm32.c b/drivers/sensor/st/qdec_stm32/qdec_stm32.c index 5335e35a72b..f8c362d0c23 100644 --- a/drivers/sensor/st/qdec_stm32/qdec_stm32.c +++ b/drivers/sensor/st/qdec_stm32/qdec_stm32.c @@ -38,7 +38,7 @@ struct qdec_stm32_dev_cfg { /* Device run time data */ struct qdec_stm32_dev_data { - int32_t position; + uint32_t position; }; static int qdec_stm32_fetch(const struct device *dev, enum sensor_channel chan) @@ -56,7 +56,9 @@ static int qdec_stm32_fetch(const struct device *dev, enum sensor_channel chan) * can be ignored */ counter_value = LL_TIM_GetCounter(dev_cfg->timer_inst) % dev_cfg->counts_per_revolution; - dev_data->position = (counter_value * 360) / dev_cfg->counts_per_revolution; + + /* The angle calculated in the fixed-point format (Q26.6 format) */ + dev_data->position = (counter_value * 23040) / dev_cfg->counts_per_revolution; return 0; } @@ -67,8 +69,8 @@ static int qdec_stm32_get(const struct device *dev, enum sensor_channel chan, struct qdec_stm32_dev_data *const dev_data = dev->data; if (chan == SENSOR_CHAN_ROTATION) { - val->val1 = dev_data->position; - val->val2 = 0; + val->val1 = dev_data->position >> 6; + val->val2 = (dev_data->position & 0x3F) * 15625; } else { return -ENOTSUP; }