mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-06-08 02:15:53 +08:00
lisa_l and booz now have different baros implementations
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
/* $Id$
|
||||
*
|
||||
* Copyright (C) 2010 The Paparazzi Team
|
||||
*
|
||||
* This file is part of paparazzi.
|
||||
*
|
||||
* paparazzi is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* paparazzi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with paparazzi; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
|
||||
#include "rotorcraft/baro.h"
|
||||
|
||||
#include "airframe.h"
|
||||
#include "led.h"
|
||||
|
||||
/* threshold >0 && <1023 */
|
||||
#ifndef BOOZ_ANALOG_BARO_THRESHOLD
|
||||
#define BOOZ_ANALOG_BARO_THRESHOLD 850
|
||||
#endif
|
||||
|
||||
// pressure on AD0.1 on P0.28
|
||||
// offset on DAC on P0.25
|
||||
|
||||
struct Baro baro;
|
||||
struct BaroBoard baro_board;
|
||||
|
||||
void baro_init( void ) {
|
||||
|
||||
baro.status = BS_UNINITIALIZED;
|
||||
baro.absolute = 0;
|
||||
baro.differential = 0; /* not handled on this board */
|
||||
|
||||
baro_board.offset = 1023;
|
||||
Booz2AnalogSetDAC(baro_board.offset);
|
||||
|
||||
baro_board.value_filtered = 0;
|
||||
baro_board.data_available = FALSE;
|
||||
#ifdef ROTORCRAFT_BARO_LED
|
||||
LED_OFF(ROTORCRAFT_BARO_LED);
|
||||
#endif
|
||||
}
|
||||
|
||||
void baro_periodic(void) {}
|
||||
|
||||
/* decrement offset until adc reading is over a threshold */
|
||||
void baro_board_calibrate(void) {
|
||||
if (baro_board.value_filtered < BOOZ_ANALOG_BARO_THRESHOLD && baro_board.offset >= 1) {
|
||||
if (baro_board.value_filtered == 0 && baro_board.offset > 15)
|
||||
baro_board.offset -= 15;
|
||||
else
|
||||
baro_board.offset--;
|
||||
Booz2AnalogSetDAC(baro_board.offset);
|
||||
#ifdef ROTORCRAFT_BARO_LED
|
||||
LED_TOGGLE(ROTORCRAFT_BARO_LED);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
baro.status = BS_RUNNING;
|
||||
#ifdef ROTORCRAFT_BARO_LED
|
||||
LED_ON(ROTORCRAFT_BARO_LED);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
#ifndef BOARDS_BOOZ_BARO_H
|
||||
#define BOARDS_BOOZ_BARO_H
|
||||
|
||||
#include "std.h"
|
||||
|
||||
#include "rotorcraft/baro.h"
|
||||
#include "booz/booz2_analog.h"
|
||||
|
||||
/* we don't need that on this board */
|
||||
|
||||
struct BaroBoard {
|
||||
uint16_t offset;
|
||||
uint16_t value_filtered;
|
||||
bool_t data_available;
|
||||
};
|
||||
|
||||
extern struct BaroBoard baro_board;
|
||||
|
||||
extern void baro_board_calibrate(void);
|
||||
|
||||
#define BaroEvent(_b_abs_handler, _b_diff_handler) { \
|
||||
if (baro_board.data_available) { \
|
||||
_b_abs_handler(); \
|
||||
baro_board.data_available = FALSE; \
|
||||
} \
|
||||
}
|
||||
|
||||
static inline void baro_board_SetOffset(uint16_t _o) {
|
||||
baro_board.offset = _o;
|
||||
Booz2AnalogSetDAC(_o);
|
||||
}
|
||||
|
||||
static inline void BoozBaroISRHandler(uint16_t _val) {
|
||||
baro.absolute = _val;
|
||||
baro_board.value_filtered = (3*baro_board.value_filtered + baro.absolute)/4;
|
||||
if (baro.status == BS_UNINITIALIZED) {
|
||||
RunOnceEvery(10, { baro_board_calibrate();});
|
||||
}
|
||||
/* else */
|
||||
baro_board.data_available = TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* BOARDS_BOOZ_BARO_H */
|
||||
@@ -0,0 +1,89 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2009 Antoine Drouin <poinix@gmail.com>
|
||||
*
|
||||
* This file is part of paparazzi.
|
||||
*
|
||||
* paparazzi is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* paparazzi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with paparazzi; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* test baro using interrupts
|
||||
*
|
||||
*/
|
||||
|
||||
#include BOARD_CONFIG
|
||||
|
||||
#include "init_hw.h"
|
||||
#include "sys_time.h"
|
||||
|
||||
#include "downlink.h"
|
||||
|
||||
#include "rotorcraft/baro.h"
|
||||
//#include "my_debug_servo.h"
|
||||
|
||||
static inline void main_init( void );
|
||||
static inline void main_periodic_task( void );
|
||||
static inline void main_event_task( void );
|
||||
|
||||
static inline void main_on_baro_diff(void);
|
||||
static inline void main_on_baro_abs(void);
|
||||
|
||||
|
||||
int main(void) {
|
||||
main_init();
|
||||
|
||||
while(1) {
|
||||
if (sys_time_periodic())
|
||||
main_periodic_task();
|
||||
main_event_task();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void main_init( void ) {
|
||||
hw_init();
|
||||
sys_time_init();
|
||||
baro_init();
|
||||
}
|
||||
|
||||
|
||||
|
||||
static inline void main_periodic_task( void ) {
|
||||
|
||||
RunOnceEvery(2, {baro_periodic();});
|
||||
LED_PERIODIC();
|
||||
RunOnceEvery(256, {DOWNLINK_SEND_ALIVE(DefaultChannel, 16, MD5SUM);});
|
||||
}
|
||||
|
||||
|
||||
|
||||
static inline void main_event_task( void ) {
|
||||
BaroEvent(main_on_baro_abs, main_on_baro_diff);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static inline void main_on_baro_diff(void) {
|
||||
|
||||
}
|
||||
|
||||
static inline void main_on_baro_abs(void) {
|
||||
RunOnceEvery(5,{DOWNLINK_SEND_BARO_RAW(DefaultChannel, &baro.absolute, &baro.differential);});
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
|
||||
#include "rotorcraft/baro.h"
|
||||
|
||||
struct Baro baro;
|
||||
struct BaroBoard baro_board;
|
||||
|
||||
static inline void baro_board_write_to_register(uint8_t baro_addr, uint8_t reg_addr, uint8_t val_msb, uint8_t val_lsb);
|
||||
static inline void baro_board_read_from_register(uint8_t baro_addr, uint8_t reg_addr);
|
||||
static inline void baro_board_set_current_register(uint8_t baro_addr, uint8_t reg_addr);
|
||||
static inline void baro_board_read_from_current_register(uint8_t baro_addr);
|
||||
|
||||
// absolute
|
||||
#define BARO_ABS_ADDR 0x90
|
||||
// differential
|
||||
#define BARO_DIFF_ADDR 0x92
|
||||
|
||||
void baro_init(void) {
|
||||
baro.status = BS_UNINITIALIZED;
|
||||
baro.absolute = 0;
|
||||
baro.differential = 0;
|
||||
baro_board.status = LBS_UNINITIALIZED;
|
||||
}
|
||||
|
||||
|
||||
void baro_periodic(void) {
|
||||
// check i2c_done
|
||||
switch (baro_board.status) {
|
||||
case LBS_UNINITIALIZED:
|
||||
baro_board_send_reset();
|
||||
baro_board.status = LBS_RESETED;
|
||||
break;
|
||||
case LBS_RESETED:
|
||||
baro_board_send_config_abs();
|
||||
baro_board.status = LBS_INITIALIZING_ABS;
|
||||
break;
|
||||
case LBS_INITIALIZING_ABS:
|
||||
baro_board_set_current_register(BARO_ABS_ADDR, 0x00);
|
||||
baro_board.status = LBS_INITIALIZING_ABS_1;
|
||||
break;
|
||||
case LBS_INITIALIZING_ABS_1:
|
||||
baro_board_send_config_diff();
|
||||
baro_board.status = LBS_INITIALIZING_DIFF;
|
||||
break;
|
||||
case LBS_INITIALIZING_DIFF:
|
||||
baro_board_set_current_register(BARO_DIFF_ADDR, 0x00);
|
||||
baro_board.status = LBS_INITIALIZING_DIFF_1;
|
||||
// baro_board.status = LBS_UNINITIALIZED;
|
||||
break;
|
||||
case LBS_INITIALIZING_DIFF_1:
|
||||
case LBS_READ_DIFF:
|
||||
baro_board_read_from_current_register(BARO_ABS_ADDR);
|
||||
baro_board.status = LBS_READING_ABS;
|
||||
break;
|
||||
case LBS_READ_ABS:
|
||||
baro_board_read_from_current_register(BARO_DIFF_ADDR);
|
||||
baro_board.status = LBS_READING_DIFF;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void baro_board_send_reset(void) {
|
||||
i2c2.buf[0] = 0x06;
|
||||
i2c2_transmit(0x00, 1, &baro_board.i2c_done);
|
||||
}
|
||||
|
||||
void baro_board_send_config_abs(void) {
|
||||
baro_board_write_to_register(BARO_ABS_ADDR, 0x01, 0x86, 0x83);
|
||||
}
|
||||
|
||||
void baro_board_send_config_diff(void) {
|
||||
baro_board_write_to_register(BARO_DIFF_ADDR, 0x01, 0x84, 0x83);
|
||||
}
|
||||
|
||||
static inline void baro_board_write_to_register(uint8_t baro_addr, uint8_t reg_addr, uint8_t val_msb, uint8_t val_lsb) {
|
||||
i2c2.buf[0] = reg_addr;
|
||||
i2c2.buf[1] = val_msb;
|
||||
i2c2.buf[2] = val_lsb;
|
||||
i2c2_transmit(baro_addr, 3, &baro_board.i2c_done);
|
||||
}
|
||||
|
||||
static inline void baro_board_read_from_register(uint8_t baro_addr, uint8_t reg_addr) {
|
||||
i2c2.buf[0] = reg_addr;
|
||||
i2c2_transceive(baro_addr, 1, 2, &baro_board.i2c_done);
|
||||
}
|
||||
|
||||
static inline void baro_board_set_current_register(uint8_t baro_addr, uint8_t reg_addr) {
|
||||
i2c2.buf[0] = reg_addr;
|
||||
i2c2_transmit(baro_addr, 1, &baro_board.i2c_done);
|
||||
}
|
||||
|
||||
static inline void baro_board_read_from_current_register(uint8_t baro_addr) {
|
||||
i2c2_receive(baro_addr, 2, &baro_board.i2c_done);
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
#ifndef BOARDS_LISA_L_BARO_H
|
||||
#define BOARDS_LISA_L_BARO_H
|
||||
|
||||
#include "std.h"
|
||||
#include "i2c.h"
|
||||
|
||||
enum LisaBaroStatus {
|
||||
LBS_UNINITIALIZED,
|
||||
LBS_RESETED,
|
||||
LBS_INITIALIZING_ABS,
|
||||
LBS_INITIALIZING_ABS_1,
|
||||
LBS_INITIALIZING_DIFF,
|
||||
LBS_INITIALIZING_DIFF_1,
|
||||
LBS_IDLE,
|
||||
LBS_READING_ABS,
|
||||
LBS_READ_ABS,
|
||||
LBS_READING_DIFF,
|
||||
LBS_READ_DIFF
|
||||
};
|
||||
|
||||
struct BaroBoard {
|
||||
enum LisaBaroStatus status;
|
||||
bool_t i2c_done;
|
||||
};
|
||||
|
||||
extern struct BaroBoard baro_board;
|
||||
|
||||
extern void baro_board_send_reset(void);
|
||||
extern void baro_board_send_config_abs(void);
|
||||
extern void baro_board_send_config_diff(void);
|
||||
|
||||
#define BaroEvent(_b_abs_handler, _b_diff_handler) { \
|
||||
if (baro_board.status == LBS_READING_ABS && baro_board.i2c_done) { \
|
||||
int16_t tmp = i2c2.buf[0]<<8 | i2c2.buf[1]; \
|
||||
baro.absolute = tmp; \
|
||||
baro_board.status = LBS_READ_ABS; \
|
||||
_b_abs_handler(); \
|
||||
} \
|
||||
else if (baro_board.status == LBS_READING_DIFF && baro_board.i2c_done) { \
|
||||
int16_t tmp = i2c2.buf[0]<<8 | i2c2.buf[1]; \
|
||||
baro.differential = tmp; \
|
||||
baro_board.status = LBS_READ_DIFF; \
|
||||
_b_diff_handler(); \
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /* BOARDS_LISA_L_BARO_H */
|
||||
@@ -0,0 +1,4 @@
|
||||
|
||||
#include "rotorcraft/baro.h"
|
||||
|
||||
|
||||
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2009 Antoine Drouin <poinix@gmail.com>
|
||||
*
|
||||
* This file is part of paparazzi.
|
||||
*
|
||||
* paparazzi is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* paparazzi is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with paparazzi; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* test baro using interrupts
|
||||
*
|
||||
*/
|
||||
|
||||
#include BOARD_CONFIG
|
||||
|
||||
#include "init_hw.h"
|
||||
#include "sys_time.h"
|
||||
|
||||
#include "downlink.h"
|
||||
|
||||
#include "rotorcraft/baro.h"
|
||||
//#include "my_debug_servo.h"
|
||||
|
||||
static inline void main_init( void );
|
||||
static inline void main_periodic_task( void );
|
||||
static inline void main_event_task( void );
|
||||
|
||||
static inline void main_on_baro_diff(void);
|
||||
static inline void main_on_baro_abs(void);
|
||||
|
||||
|
||||
int main(void) {
|
||||
main_init();
|
||||
|
||||
while(1) {
|
||||
if (sys_time_periodic())
|
||||
main_periodic_task();
|
||||
main_event_task();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void main_init( void ) {
|
||||
hw_init();
|
||||
sys_time_init();
|
||||
baro_init();
|
||||
|
||||
// DEBUG_SERVO1_INIT();
|
||||
// DEBUG_SERVO2_INIT();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
static inline void main_periodic_task( void ) {
|
||||
|
||||
RunOnceEvery(2, {baro_periodic();});
|
||||
LED_PERIODIC();
|
||||
RunOnceEvery(256, {DOWNLINK_SEND_ALIVE(DefaultChannel, 16, MD5SUM);});
|
||||
RunOnceEvery(256,
|
||||
{
|
||||
DOWNLINK_SEND_I2C_ERRORS(DefaultChannel,
|
||||
&i2c2_errors.ack_fail_cnt,
|
||||
&i2c2_errors.miss_start_stop_cnt,
|
||||
&i2c2_errors.arb_lost_cnt,
|
||||
&i2c2_errors.over_under_cnt,
|
||||
&i2c2_errors.pec_recep_cnt,
|
||||
&i2c2_errors.timeout_tlow_cnt,
|
||||
&i2c2_errors.smbus_alert_cnt,
|
||||
&i2c2_errors.unexpected_event_cnt,
|
||||
&i2c2_errors.last_unexpected_event);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
static inline void main_event_task( void ) {
|
||||
BaroEvent(main_on_baro_abs, main_on_baro_diff);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static inline void main_on_baro_diff(void) {
|
||||
|
||||
}
|
||||
|
||||
static inline void main_on_baro_abs(void) {
|
||||
RunOnceEvery(5,{DOWNLINK_SEND_BARO_RAW(DefaultChannel, &baro.absolute, &baro.differential);});
|
||||
}
|
||||
Reference in New Issue
Block a user