This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 19ac909eeae202a1f45c15245165b7571916d78e
Author: Takumi Ando <[email protected]>
AuthorDate: Wed Dec 20 11:11:55 2023 +0900

    sensors: mx56xx: Fix calculation of second order compensation
    
    The temperature won't be compensated correctly without this patch.
    
    Signed-off-by: Takumi Ando <[email protected]>
---
 drivers/sensors/ms56xx_uorb.c | 27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/drivers/sensors/ms56xx_uorb.c b/drivers/sensors/ms56xx_uorb.c
index 1d6499dd56..6463147742 100644
--- a/drivers/sensors/ms56xx_uorb.c
+++ b/drivers/sensors/ms56xx_uorb.c
@@ -117,7 +117,7 @@ static int32_t ms56xx_compensate_temp(FAR struct 
ms56xx_dev_s *priv,
                                       uint32_t temp, int32_t *deltat);
 static uint32_t ms56xx_compensate_press(FAR struct ms56xx_dev_s *priv,
                                         uint32_t press, uint32_t dt,
-                                        int32_t temp);
+                                        int32_t *temp);
 
 static unsigned long ms56xx_curtime(void);
 
@@ -351,7 +351,7 @@ static inline void baro_measure_read(FAR struct 
ms56xx_dev_s *priv,
   /* Compensate the temp/press with calibration data */
 
   temp = ms56xx_compensate_temp(priv, temp, &deltat);
-  press = ms56xx_compensate_press(priv, press, deltat, temp);
+  press = ms56xx_compensate_press(priv, press, deltat, &temp);
 
   baro->timestamp = ms56xx_curtime();
   baro->pressure = press / 100.0f;
@@ -527,7 +527,7 @@ static int32_t ms56xx_compensate_temp(FAR struct 
ms56xx_dev_s *priv,
 
 static uint32_t ms56xx_compensate_press(FAR struct ms56xx_dev_s *priv,
                                         uint32_t press, uint32_t dt,
-                                        int32_t temp)
+                                        int32_t *temp)
 {
   struct ms56xx_calib_s *c = &priv->calib;
   int64_t off = 0;
@@ -535,6 +535,7 @@ static uint32_t ms56xx_compensate_press(FAR struct 
ms56xx_dev_s *priv,
 #if defined(CONFIG_MS56XX_SECOND_ORDER_COMPENSATE)
   int64_t off2 = 0;
   int64_t sens2 = 0;
+  int64_t t2 = 0;
   uint64_t delta;
 #endif
 
@@ -544,20 +545,21 @@ static uint32_t ms56xx_compensate_press(FAR struct 
ms56xx_dev_s *priv,
         off = ((int64_t) c->c2 << 17) + ((int64_t) (c->c4 * dt) >> 6);
         sens = ((int64_t) c->c1 << 16) + ((int64_t) (c->c3 * dt) >> 7);
 #if defined(CONFIG_MS56XX_SECOND_ORDER_COMPENSATE)
-        if (temp < 2000)
+        if (*temp < 2000)
           {
             /* Low temperature */
 
-            delta = temp - 2000;
+            t2 = ((dt * dt) >> 31);
+            delta = *temp - 2000;
             delta *= delta;
             off2 = (61 * delta) >> 4;
             sens2 = 2 * delta;
 
-            if (temp < -1500)
+            if (*temp < -1500)
               {
                 /* Very low temperature */
 
-                delta = temp + 1500;
+                delta = *temp + 1500;
                 delta *= delta;
                 off2 += 15 * delta;
                 sens2 += 8 * delta;
@@ -570,20 +572,21 @@ static uint32_t ms56xx_compensate_press(FAR struct 
ms56xx_dev_s *priv,
         off = ((int64_t) c->c2 << 16) + ((int64_t) (c->c4 * dt) >> 7);
         sens = ((int64_t) c->c1 << 15) + ((int64_t) (c->c3 * dt) >> 8);
 #if defined(CONFIG_MS56XX_SECOND_ORDER_COMPENSATE)
-        if (temp < 2000)
+        if (*temp < 2000)
           {
             /* Low temperature */
 
-            delta = temp - 2000;
+            t2 = ((dt * dt) >> 31);
+            delta = *temp - 2000;
             delta *= delta;
             off2 = (5 * delta) >> 1;
             sens2 = (5 * delta) >> 2;
 
-            if (temp < -1500)
+            if (*temp < -1500)
               {
                 /* Very low temperature */
 
-                delta = temp + 1500;
+                delta = *temp + 1500;
                 delta *= delta;
                 off2 += 7 * delta;
                 sens2 += (11 * delta) >> 1;
@@ -594,7 +597,7 @@ static uint32_t ms56xx_compensate_press(FAR struct 
ms56xx_dev_s *priv,
     }
 
 #if defined(CONFIG_MS56XX_SECOND_ORDER_COMPENSATE)
-  temp -= ((dt * dt) >> 31);
+  *temp -= t2;
   off -= off2;
   sens -= sens2;
 #endif

Reply via email to