project:weathersonde:telemetry_decoding
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
project:weathersonde:telemetry_decoding [2014/02/20 13:26] – [Measurement subframe payload (0x69)] pinky | project:weathersonde:telemetry_decoding [2017/02/18 21:55] – add equations for pressure and temperature pinky | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ======= Telemetry decoding ====== | ||
+ | Describes how to decode data from [[telemetry_receiving|recieved telemetry]]. This includes evaluation of temperature, | ||
+ | ===== FRAME_PAYLOAD_DATA structure ===== | ||
+ | |||
+ | Each frame contains payload consisting of subframes with varying length. | ||
+ | |||
+ | ===== SUBFRAME structure ===== | ||
+ | |||
+ | ^ offset (B) ^ lenght (B) ^ name ^ content ^ | ||
+ | | 0 | 1 | SUBFRAME_TYPE | Type of subframe ? | | ||
+ | | 1 | 1 | SUBFRAME_LEN | Length of subframe payload | | ||
+ | | 2 | 2*SUBFRAME_LEN | SUBFRAME_PAYLOAD | subframe payload | | ||
+ | | 2*SUBFRAME_LEN+2 | 2 | SUBFRAME_CRC | CRC 16 of subframe payload, polynom = 0x11021 | | ||
+ | |||
+ | ==== Known subframe types ==== | ||
+ | |||
+ | ^ SUBFRAME_TYPE ^ description ^ | ||
+ | | 0x65 | Calibration and Configuration fragment | | ||
+ | | 0x69 | Measurement data | | ||
+ | | 0x67 | GPS data | | ||
+ | | 0x68 | typ of content not indentified | | ||
+ | | 0xff | padding ? | | ||
+ | |||
+ | ===== Calibration subframe payload (0x65) ===== | ||
+ | |||
+ | expected payload length: 32 | ||
+ | |||
+ | ^ offset (B) ^ lenght (B) ^ name ^ content ^ description ^ | ||
+ | | 0 | 2 | CALIB_FR_NUM | uint16 | frame number, (starts from 1) | | ||
+ | | 2 | 10 | CALIB_ID | string | 0x20 0x20 + sonde ID (same as on cover) | | ||
+ | | 12 | 1 | CALIB_STATE_0 | uint8 | 0 - OK; 0x08/0x0A - battery low / battery low, powe off countdown running? | | ||
+ | | 13 | 1 | CALIB_STATE_1 | uint8 | see table bellow | | ||
+ | | 14 | 1 | CALIB_UNKNOWN_0 | 0x00 | ??? | | ||
+ | | 15 | 1 | CALIB_FRAG_NUM | unit8 | callibration and configuration fragment number | | ||
+ | | 16 | 16 | CALIB_FRAG_DATA | bytes | calibration and configuration data fragment | | ||
+ | |||
+ | |||
+ | ==== STATE_1 ==== | ||
+ | |||
+ | TODO: verification needed, possible documentation bug | ||
+ | |||
+ | ^ bit offset ^ description ^ | ||
+ | | (LSB) 0 | start detected (set at the same time as bit 5) | | ||
+ | | 1 | ??? | | ||
+ | | 2 | humidity sensor heating: 0 = off, 1 = on | | ||
+ | | 3 | humidity sensor for measurement: | ||
+ | | 4 | set to 1 when current drown from battery is increased by 50mA | | ||
+ | | 5 | start detected (set at the same time as bit 1) | | ||
+ | | 6 | ??? | | ||
+ | | (MSB) 7 | ??? | | ||
+ | |||
+ | ===== Measurement subframe payload (0x69) ===== | ||
+ | |||
+ | expected payload length: 24 | ||
+ | |||
+ | ^ offset (B) ^ lenght (B) ^ content ^ name ^ description ^ | ||
+ | | 0 | 3 | int24 | MEAS_T | Temperature sensor (wire at end of stick) | | ||
+ | | 3 | 3 | int24 | MEAS_U1 | Humidity (remoter to sonde) | | ||
+ | | 6 | 3 | int24 | MEAS_U2 | Humidity (closer to sonde) | | ||
+ | | 9 | 3 | int24 | MEAS_REF1 | reference upper bound, increase with temperature (or vice versa, TODO) | | ||
+ | | 12 | 3 | int24 | MEAS_REF2 | reference upper bound, decrease with temperature (or vice versa, TODO) | | ||
+ | | 15 | 3 | int24 | MEAS_P | Pressure | | ||
+ | | 18 | 3 | int24 | MEAS_REF3 | reference lower bound | | ||
+ | | 21 | 3 | int24 | MEAS_REF4 | reference lower bound | | ||
+ | |||
+ | < | ||
+ | ref = (MEAS_REF3 + MEAS_REF4) / 2; | ||
+ | p_rel = 1.0 / ((MEAS_P - ref) / (MEAS_REF1 - ref) - 0.0655) * 0.9053 + 0.08778; | ||
+ | # pressure in hPa | ||
+ | P = p_rel * ((((CALIB_COEFF[15] * p_rel + CALIB_COEFF[14]) * p_rel + CALIB_COEFF[13]) * p_rel + CALIB_COEFF[12]) * p_rel + CALIB_COEFF[11]) + CALIB_COEFF[10]; | ||
+ | |||
+ | ref4 = MEAS_REF2 - ref; | ||
+ | |||
+ | u1_rel = 1.0 / ((MEAS_U1 - ref) / ref4); | ||
+ | u2_rel = 1.0 / ((MEAS_U2 - ref) / ref4); | ||
+ | # humidity | ||
+ | U1 = ( | ||
+ | (u1_rel * CALIB_COEFF[43] + CALIB_COEFF[42]) * \ | ||
+ | u1_rel + CALIB_COEFF[41]) * u1_rel + ALIB_COEFF[40]; | ||
+ | U2 = ( | ||
+ | (u2_rel * CALIB_COEFF[53] + CALIB_COEFF[52]) * \ | ||
+ | u2_rel + CALIB_COEFF[51]) * u2_rel + CALIB_COEFF[50]; | ||
+ | U = max(U1, U2) | ||
+ | |||
+ | rt = (1.0 / (CALIB_COEFF[37] - 1.0) + 17.99418) * \ | ||
+ | 0.079298 / (((MEAS_T - ref) / ref4) - 0.15791); | ||
+ | # temperature °C | ||
+ | T = (((( | ||
+ | rt * CALIB_COEFF[35] + \ | ||
+ | CALIB_COEFF[34]) * rt + \ | ||
+ | CALIB_COEFF[33]) * rt + \ | ||
+ | CALIB_COEFF[32]) * rt + \ | ||
+ | CALIB_COEFF[31]) * rt + \ | ||
+ | CALIB_COEFF[30]; | ||
+ | </ | ||
+ | |||
+ | ===== GPS subframe payload (0x67) ===== | ||
+ | |||
+ | expected payload length: 122 | ||
+ | |||
+ | ^ offset (B) ^ lenght (B) ^ content ^ description ^ | ||
+ | | 0 | 4 | GPS_TIME (int32) | GPS time - ms from week start | | ||
+ | | 4 | 2 | GPS_BLOB_0 | ???, 4*4 bits | | ||
+ | | 6 | 8 | GPS_PRN | PRN for each tracked satelite | | ||
+ | | 14 | 12 | GPS_STAT_1 | signal strength, fix status ... | | ||
+ | | 26 | 96 | GPS_DATA_1 | doppler, pseudorange, | ||
+ | |||
+ | === GPS_PRN === | ||
+ | |||
+ | List of pseudorange sequence number for each recieving satelite, 0 == no satelite. | ||
+ | |||
+ | 12*5 bit - PRN number (x - unused ?) | ||
+ | |||
+ | 11100000 x2222211 44433333 x5555544 77766666 x8888877 AAA99999 xBBBBBAA | ||
+ | |||
+ | === GPS_STAT_1 === | ||
+ | |||
+ | GPS satelite channel state. | ||
+ | |||
+ | ^ offset (b) ^ length (b) ^ description ^ | ||
+ | | 0 | 4 (int4) | signal strength or fix quallity, 0xf == NaN / no signal | | ||
+ | | 4 | 1 | time fix - set to 1 when time is succesfully obtained from subframe | | ||
+ | | 5 | 1 | pseudorange fix ??? - pseudorange fix is correlated to time ? | | ||
+ | | 6 | 1 | pseudorange fix ??? (not corelated to time ?) | | ||
+ | | 7 | 1 | signal tracking - some signal found at certain frequency | | ||
+ | |||
+ | |||
+ | === GPS_DATA_1 === | ||
+ | |||
+ | ^ offset (B) ^ length (B) ^ type ^ description ^ | ||
+ | | 0 | 4 | int32/ | ||
+ | | 4 | 3 | int24/ | ||
+ | | 7 | 1 | ??? | number, min/max: < -38, 39 > usually -5..10 | | ||
+ | |||
+ | ===== Unknown subframe payload (0x68) ===== | ||
+ | |||
+ | expected payload length: 10 | ||
+ | |||
+ | No clue what this means. | ||
+ | |||
+ | ^ offset (B) ^ length (B) ^ description ^ | ||
+ | | 0 | 10 | ??? | | ||
+ | |||
+ | ussual content: | ||
+ | |||
+ | 0x03 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 | ||
+ | |||
+ | ===== Padding subframe (0xff) ===== | ||
+ | |||
+ | expected payload length: 4 | ||
+ | |||
+ | This type of frame probably identifies only padding | ||
+ | * no CRC? | ||
+ | * constant pattern of repeating (0x02 0x00) ? | ||
+ | |||
+ | ===== Configuration and calibration ===== | ||
+ | |||
+ | Calibration data are composed from fragments send in first subframe. | ||
+ | Calibration data block is 512B long. Content is identical with data from EEPROM. | ||
+ | |||
+ | - there should be somewhere date/time (GPS send only seconds offset from start of week) | ||
+ | |||
+ | ^ offset (B) ^ lenght (B) ^ content ^ description ^ | ||
+ | | 0 | 2 | ??? | ??? (checksum?) | | ||
+ | | 2 | 2 | unit16 | downlik frequency: f = (400E6 + 10E3*value) Hz\\ upper limit is around 423MHz (value = 0x08FC) | | ||
+ | | 4 | 2 | uint16 | always 0xffff - kill timmer ? | | ||
+ | | 6 | 2 | int16 | always 0x0100 - set transmit power to full ? | | ||
+ | | ??? | | ||
+ | | 22 | 10 | string | probe ID (same as printed on conver, starts with 0x20 0x20) | | ||
+ | | ??? | | ||
+ | | 64 | 5*x | CALIB_COEFF | calibration coefficients table | | ||
+ | |||
+ | ==== CALIB_COEFF ==== | ||
+ | |||
+ | Consist of sequence of repeated fields with following structure: | ||
+ | |||
+ | ^ offset (B) ^ lenght (B) ^ context ^ description ^ | ||
+ | | 0 | 1 | uint8 | calibration constant index | | ||
+ | | 4 | 4 | float32 | calibration constant value | | ||
+ | |||
+ | Example of calibration data | ||
+ | |||
+ | ^ coefficient index row/col (x) ^ 0 ^ 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6 ^ 7 ^ | ||
+ | ^ 1x | -366.026 | -43.9063 | 393.234 | -131.314 | 25.6268 | -2.02341 | | 0.96 | | ||
+ | ^ 2x | -803.34 | 363.815 | 317.784 | 127.429 | | | | 0.96 | | ||
+ | ^ 3x | -187.802 | 89.6416 | -26.9122 | 9.15022 | -1.45707 | 0.0868068 | | 0.849488 | | ||
+ | ^ 4x (humidity 1) | -1223.17 | 3548.18 | -2646.42 | 588.217 | | | | 0.96 | | ||
+ | ^ 5x (humidity 2) | -1198.04 | 3497.31 | -2611.15 | 580.153 | | | | 0.96 | | ||
+ | ^ 6x | 0.0318379 | 0.0374458 | -0.0433925 | ||
+ | ^ 7x | -0.000132316 | 0.000414854 | -0.000402439 6.31402e-05 | | ||
+ | ^ 8x | -2.04505e-06 | 1.5662e-067.05777e-07 | | ||
+ | ^ 11x | 0.5227 | -0.0284 | 0.000286 | 8.97e-07 | -1.26e-09 | | ||
+ | ^ 12x | 1.07573 | -0.204 | 0.009009 | -5.83e-05 | -1.04e-06 | | ||
+ | ^ 13x | 0.5227 | -0.0284 | 0.000286 | 8.97e-07 | -1.26e-09 | | ||
+ | ^ 14x | 1.07573 | -0.204 | 0.009009 | -5.83e-05 | -1.04e-06 | | ||
+ | ^ 15x | | 4.75029e-06-5.47494e-08 | ||
+ | ^ 16x | | | | | | | | 0.7 | | ||
+ | |||
+ | * Coefficients at rows 1Nx are never chenge. | ||
+ | ==== related links ==== | ||
+ | |||
+ | * [[http:// |
project/weathersonde/telemetry_decoding.txt · Last modified: 2017/02/19 16:58 by pinky