aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHolger Steinhaus L <hsteinhaus@gmx.de>2013-11-11 12:14:03 +0100
committerLorenz Meier <lm@inf.ethz.ch>2013-12-13 17:30:14 +0100
commit3a40ea8338206b247aadb40e3709a22e0699135b (patch)
tree63740e1b646135e007a31f775b0830d7ce443595 /src
parent0b9b68f0d96f59c9cd406547ee52fb52617a298f (diff)
downloadpx4-firmware-3a40ea8338206b247aadb40e3709a22e0699135b.tar.gz
px4-firmware-3a40ea8338206b247aadb40e3709a22e0699135b.tar.bz2
px4-firmware-3a40ea8338206b247aadb40e3709a22e0699135b.zip
more precise range conversion for SBus input signals
Diffstat (limited to 'src')
-rw-r--r--src/modules/px4iofirmware/sbus.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/modules/px4iofirmware/sbus.c b/src/modules/px4iofirmware/sbus.c
index c523df6ca..8034e7077 100644
--- a/src/modules/px4iofirmware/sbus.c
+++ b/src/modules/px4iofirmware/sbus.c
@@ -55,6 +55,24 @@
#define SBUS_FRAME_SIZE 25
#define SBUS_INPUT_CHANNELS 16
+/*
+ Measured values with Futaba FX-30/R6108SB:
+ -+100% on TX: PCM 1.100/1.520/1.950ms -> SBus raw values: 350/1024/1700 (100% ATV)
+ -+140% on TX: PCM 0.930/1.520/2.112ms -> SBus raw values: 78/1024/1964 (140% ATV)
+ -+152% on TX: PCM 0.884/1.520/2.160ms -> SBus raw values: 1/1024/2047 (140% ATV plus dirty tricks)
+*/
+
+/* define range mapping here, -+100% -> 1000..2000 */
+#define SBUS_RANGE_MIN 350.0f
+#define SBUS_RANGE_MAX 1700.0f
+
+#define SBUS_TARGET_MIN 1000.0f
+#define SBUS_TARGET_MAX 2000.0f
+
+/* pre-calculate the floating point stuff as far as possible at compile time */
+#define SBUS_SCALE_FACTOR ((SBUS_TARGET_MAX - SBUS_TARGET_MIN) / (SBUS_RANGE_MAX - SBUS_RANGE_MIN))
+#define SBUS_SCALE_OFFSET (int)(SBUS_TARGET_MIN - (SBUS_SCALE_FACTOR * SBUS_RANGE_MIN + 0.5f))
+
static int sbus_fd = -1;
static hrt_abstime last_rx_time;
@@ -234,8 +252,9 @@ sbus_decode(hrt_abstime frame_time, uint16_t *values, uint16_t *num_values, uint
}
}
- /* convert 0-2048 values to 1000-2000 ppm encoding in a very sloppy fashion */
- values[channel] = (value / 2) + 998;
+
+ /* convert 0-2048 values to 1000-2000 ppm encoding in a not too sloppy fashion */
+ values[channel] = (uint16_t)(value * SBUS_SCALE_FACTOR +.5f) + SBUS_SCALE_OFFSET;
}
/* decode switch channels if data fields are wide enough */