Paparazzi UAS  v5.2.2_stable-0-gd6b9f29
Paparazzi is a free software Unmanned Aircraft System.
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
baro_MS5534A.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2007 ENAC
3  *
4  * This file is part of paparazzi.
5  *
6  * paparazzi is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2, or (at your option)
9  * any later version.
10  *
11  * paparazzi is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with paparazzi; see the file COPYING. If not, write to
18  * the Free Software Foundation, 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  *
21  */
22 
31 #include "mcu_periph/spi.h"
32 #include "mcu_periph/uart.h"
33 #ifndef BARO_NO_DOWNLINK
35 #endif
36 #include "subsystems/abi.h"
38 #include "state.h"
39 
40 
50 
51 
52 #define STATUS_INIT1 0
53 #define STATUS_INIT2 1
54 #define STATUS_INIT3 2
55 #define STATUS_INIT4 3
56 #define STATUS_MEASURE_PRESSURE 4
57 #define STATUS_MEASURE_TEMPERATURE 5
58 #define STATUS_RESET 6
59 
60 static uint8_t status;
61 static bool_t status_read_data;
62 static uint16_t words[4];
63 
64 #define InitStatus() (status <= STATUS_INIT4)
65 
66 #define NextStatus() { \
67  if (status_read_data) { \
68  status++; if (status > STATUS_MEASURE_TEMPERATURE) status = STATUS_MEASURE_PRESSURE; \
69  }; \
70  status_read_data = !status_read_data; \
71 }
72 
73 #define CMD_INIT 0x1D
74 #define CMD_MEASUREMENT 0x0F
75 
76 #define CMD_W1 0x50
77 #define CMD_W2 0x60
78 #define CMD_W3 0x90
79 #define CMD_W4 0xA0
80 #define CMD_PRESSURE 0x40
81 #define CMD_TEMPERATURE 0x20
83 static uint8_t reset[3] = {0x15, 0x55, 0x40};
84 
85 
86 
87 static uint8_t buf_input[3];
88 static uint8_t buf_output[3];
89 
90 #define Uint16(buf_input) (buf_input[0] << 8 | buf_input[1])
91 
92 /* PWM prescaler, set PWM input clock to 15MHz, PWM_CLK = PCLK / PWM_PRESCALER */
93 
94 #if (PCLK == 15000000)
95 #define PWM_PRESCALER 1
96 #else
97 
98 #if (PCLK == 30000000)
99 #define PWM_PRESCALER 2
100 #else
101 
102 #if (PCLK == 60000000)
103 #define PWM_PRESCALER 4
104 #else
105 
106 #error unknown PCLK frequency
107 #endif
108 #endif
109 #endif
110 
111 #define MS5534A_MCLK 32768
112 #define PWM_PERIOD ((PCLK / PWM_PRESCALER) / MS5534A_MCLK)
113 #define PWM_DUTY (PWM_PERIOD / 2)
114 
115 
116 static void calibration( void );
117 
118 void baro_MS5534A_init( void ) {
119  /* 32768Hz on PWM2 */
120  /* Configure P0.7 pin as PWM */
121  PINSEL0 &= ~(_BV(14));
122  PINSEL0 |= _BV(15);
123 
124  /* No prescaler */
125  PWMPR = PWM_PRESCALER-1;
126 
127  /* To get 32768Hz from a base frequency of 15MHz */
128  PWMMR0 = PWM_PERIOD;
129  PWMMR2 = PWM_DUTY;
130 
134 
135 #ifdef BARO_MS5534A_W1
136  words[0] = BARO_MS5534A_W1;
137  words[1] = BARO_MS5534A_W2;
138  words[2] = BARO_MS5534A_W3;
139  words[3] = BARO_MS5534A_W4;
140 
143 
144  calibration();
145 #else
148 #endif
149 
150 
151 
154 
156  baro_MS5534A_r = 20.;
159 }
160 
161 void baro_MS5534A_reset( void ) {
164 }
165 
166 /* To be called not faster than 30Hz */
167 void baro_MS5534A_send(void) {
168  if (!SpiCheckAvailable()) {
169  SpiOverRun();
170  return;
171  }
172 
173  if (status == STATUS_RESET) {
174  uint8_t i;
175  for(i = 0; i < 3; i++)
176  buf_output[i] = reset[i];
177  spi_buffer_length = 3;
178  } else {
179  if (status_read_data) {
180  buf_output[0] = buf_output[1] = 0;
181  } else {
183  buf_output[1] = cmds[status];
184  }
185  spi_buffer_length = 2;
186  }
187 
188  spi_buffer_input = (uint8_t*)&buf_input;
189  spi_buffer_output = (uint8_t*)&buf_output;
190  if (status_read_data)
191  SpiSetCPHA();
192  else
193  SpiClrCPHA();
194  SpiStart();
195 }
196 
197 static uint16_t d1, d2;
198 static uint16_t c1, c2, c3, c4, ut1, c6;
199 
200 
201 static void calibration( void ) {
202  /* End of init, configuration (page 11) */
203  c1 = words[0] >> 1;
204  c2 = ((words[2] & 0x3f) << 6) | (words[3] & 0x3f);
205  c3 = words[3] >> 6;
206  c4 = words[2] >> 6;
207  uint16_t c5 = ((words[0] & 0x1) << 10) | (words[1] >> 6);
208  c6 = words[1] & 0x3f;
209 
210  ut1 = (c5 << 3) + 20224;
211 
212 #ifndef BARO_NO_DOWNLINK
213  DOWNLINK_SEND_BARO_WORDS(DefaultChannel, DefaultDevice, &words[0], &words[1], &words[2], &words[3]);
214 #endif
215 }
216 
217 
218 
219 /* Handle the SPI message, i.e. store the received values in variables */
221  if (status_read_data) {
222  switch (status) {
224  d1 = Uint16(buf_input);
225  break;
227  d2 = Uint16(buf_input);
228  /* Compute pressure and temp (page 10) */
229  int16_t dT = d2 - ut1;
230  baro_MS5534A_temp = 200 + (dT*(c6+50)) / (1 << 10);
231  int16_t off = c2*4 + ((c4-512)*dT)/(1 << 12);
232  uint32_t sens = c1 + (c3*dT)/(1<<10) + 24576;
233  uint16_t x = (sens*(d1-7168))/(1<<14) - off;
234  // baro_MS5534A = ((x*10)>>5) + 250*10;
235  baro_MS5534A_pressure = ((x*100)>>5) + 250*100;
237 
238  break;
239  case STATUS_RESET:
240  break;
241  default: /* Init status */
243  if (status == STATUS_INIT4) {
244  calibration();
245  }
246  }
247  } /* else nothing to read */
248 
249  NextStatus();
250  if (!status_read_data) {
251  /* Ask next conversion now */
253  }
254 }
255 
256 void baro_MS5534A_event( void ) {
257  if (spi_message_received) {
258  /* Got a message on SPI. */
259  spi_message_received = FALSE;
264 #if SENSO_SYNC_SEND
266 #endif
267  float pressure = (float)baro_MS5534A_pressure;
268  AbiSendMsgBARO_ABS(BARO_MS5534A_SENDER_ID, &pressure);
269  }
270  }
271 }
Handling of the MS5534a pressure sensor.
unsigned short uint16_t
Definition: types.h:16
static uint16_t d2
Definition: baro_MS5534A.c:197
#define PWM_DUTY
Definition: baro_MS5534A.c:113
status
Definition: anemotaxis.c:10
arch independent UART (Universal Asynchronous Receiver/Transmitter) API
static uint8_t buf_output[3]
Definition: baro_MS5534A.c:88
float ground_alt
size == nb_waypoint, waypoint 0 is a dummy waypoint
Definition: common_nav.c:40
#define CMD_W3
Definition: baro_MS5534A.c:78
static void SpiStart(struct spi_periph *p, struct spi_transaction *t)
Definition: spi_arch.c:233
#define PWMMR0
Definition: LPC21xx.h:100
float baro_MS5534A_r
Definition: baro_MS5534A.c:47
static void SpiSetCPHA(struct spi_periph *p)
Definition: spi_arch.c:103
Main include for ABI (AirBorneInterface).
bool_t baro_MS5534A_do_reset
Definition: baro_MS5534A.c:41
#define PWMTCR
Definition: LPC21xx.h:95
#define PWMPCR
Definition: LPC21xx.h:107
static uint16_t d1
Definition: baro_MS5534A.c:197
#define CMD_W2
Definition: baro_MS5534A.c:77
void baro_MS5534A_event(void)
Definition: baro_MS5534A.c:256
#define PWMMR2
Definition: LPC21xx.h:102
static uint16_t words[4]
Definition: baro_MS5534A.c:62
#define Uint16(buf_input)
Definition: baro_MS5534A.c:90
#define STATUS_MEASURE_TEMPERATURE
Definition: baro_MS5534A.c:57
static void calibration(void)
Definition: baro_MS5534A.c:201
#define FALSE
Definition: imu_chimu.h:141
#define PWMTCR_COUNTER_ENABLE
Definition: lpcTMR.h:83
#define STATUS_INIT4
Definition: baro_MS5534A.c:55
Architecture independent SPI (Serial Peripheral Interface) API.
static uint8_t reset[3]
Definition: baro_MS5534A.c:83
static bool_t status_read_data
Definition: baro_MS5534A.c:61
#define PWMPCR_ENA2
Definition: lpcTMR.h:117
static uint8_t cmds[6]
Definition: baro_MS5534A.c:82
#define InitStatus()
Definition: baro_MS5534A.c:64
bool_t alt_baro_enabled
Definition: baro_MS5534A.c:45
static uint8_t buf_input[3]
Definition: baro_MS5534A.c:87
static uint16_t c4
Definition: baro_MS5534A.c:198
#define CMD_INIT
Definition: baro_MS5534A.c:73
#define PWMLER
Definition: LPC21xx.h:108
void baro_MS5534A_send(void)
Definition: baro_MS5534A.c:167
uint32_t pressure
pressure in 1/4 Pascal
Definition: mpl3115.h:80
unsigned long uint32_t
Definition: types.h:18
bool_t baro_MS5534A_available
Definition: baro_MS5534A.c:44
#define PWM_PERIOD
Definition: baro_MS5534A.c:112
signed short int16_t
Definition: types.h:17
#define PWMLER_LATCH2
Definition: lpcTMR.h:126
static uint16_t c1
Definition: baro_MS5534A.c:198
#define STATUS_MEASURE_PRESSURE
Definition: baro_MS5534A.c:56
#define BARO_MS5534A_SENDER_ID
#define CMD_W1
Definition: baro_MS5534A.c:76
#define CMD_W4
Definition: baro_MS5534A.c:79
static uint16_t c6
Definition: baro_MS5534A.c:198
float baro_MS5534A_sigma2
Definition: baro_MS5534A.c:48
static uint16_t c3
Definition: baro_MS5534A.c:198
uint32_t baro_MS5534A_ground_pressure
Definition: baro_MS5534A.c:46
#define TRUE
Definition: imu_chimu.h:144
#define PWMPR
Definition: LPC21xx.h:97
#define PINSEL0
Definition: LPC21xx.h:347
#define PWMTCR_PWM_ENABLE
Definition: lpcTMR.h:85
unsigned char uint8_t
Definition: types.h:14
API to get/set the generic vehicle states.
#define PWMLER_LATCH0
Definition: lpcTMR.h:124
#define CMD_MEASUREMENT
Definition: baro_MS5534A.c:74
static uint16_t ut1
Definition: baro_MS5534A.c:198
void baro_MS5534A_event_task(void)
Definition: baro_MS5534A.c:220
static uint16_t c2
Definition: baro_MS5534A.c:198
#define NextStatus()
Definition: baro_MS5534A.c:66
static uint8_t status
Definition: baro_MS5534A.c:60
#define CMD_PRESSURE
Definition: baro_MS5534A.c:80
void baro_MS5534A_reset(void)
Definition: baro_MS5534A.c:161
#define STATUS_INIT1
Definition: baro_MS5534A.c:52
#define STATUS_RESET
Definition: baro_MS5534A.c:58
float baro_MS5534A_z
Definition: baro_MS5534A.c:49
uint16_t baro_MS5534A_temp
Definition: baro_MS5534A.c:43
#define CMD_TEMPERATURE
Definition: baro_MS5534A.c:81
void baro_MS5534A_init(void)
Definition: baro_MS5534A.c:118
uint32_t baro_MS5534A_pressure
Definition: baro_MS5534A.c:42