Merge pull request #1569 from kevindehecker/PX4_IMU

Pixhawk board IMU driver

- SPI driver for the lsm303dlhc and refactor I2C driver.
-  Created a PX4 imu, which consists lsm303dlhc (acc) + l3g (gyro) IMU, both on spi and the lsm303dlhc mag
- Changed the ms5611 baro to spi
- configurable signs for hmc58xx (to rotate sensor output in 90deg units)
This commit is contained in:
Felix Ruess
2016-03-31 21:10:00 +02:00
19 changed files with 887 additions and 197 deletions
+35 -17
View File
@@ -3,8 +3,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- this is a quadrotor frame equiped with
* Autopilot: 3dr Pixhawk 2.4
* IMU: MPU6000 + L3GD20 + LSM303D
* Actuators: PWM motor controllers?
* IMU: L3GD20 + LSM303D + MPU6000 + external HMC58XX
* Actuators: PWM motor controllers
* GPS: Ublox http://wiki.paparazziuav.org/wiki/Subsystem/gps
* RC: PPM
-->
@@ -21,14 +21,17 @@
<subsystem name="udp" />
</target>
<subsystem name="telemetry" type="transparent" />
<!-- <subsystem name="imu" type="px4fmu_v2.4">-->
<subsystem name="imu" type="mpu6000">
<configure name="IMU_MPU_SPI_DEV" value="spi1" />
<configure name="IMU_MPU_SPI_SLAVE_IDX" value="SPI_SLAVE2" />
</subsystem>
<subsystem name="imu" type="px4fmu_v2.4"/>
<subsystem name="gps" type="ublox" />
<subsystem name="stabilization" type="indi" />
<subsystem name="ahrs" type="int_cmpl_quat" />
<subsystem name="ahrs" type="int_cmpl_quat" >
<define name="AHRS_ICQ_IMU_ID" value="IMU_PX4_ID" /> <!-- Meaning the lsm303 and l3g -->
<define name="AHRS_ICQ_MAG_ID" value="MAG_HMC58XX_SENDER_ID" /> <!-- Meaning the external hmc-->
<configure name="USE_MAGNETOMETER" value="TRUE"/>
<define name="AHRS_USE_GPS_HEADING" value="FALSE"/>
</subsystem>
<subsystem name="ins" type="extended" />
<subsystem name="current_sensor">
<configure name="ADC_CURRENT_SENSOR" value="ADC_3" />
@@ -81,23 +84,38 @@
<load name="air_data.xml" />
<load name="send_imu_mag_current.xml" />
<load name="gps_ubx_ucenter.xml" />
<load name="mag_hmc58xx.xml">
<configure name="MAG_HMC58XX_I2C_DEV" value="i2c1"/>
<define name="MODULE_HMC58XX_UPDATE_AHRS" value="TRUE"/>
<define name="HMC58XX_CHAN_X" value="1"/>
<define name="HMC58XX_CHAN_Y" value="0"/>
<define name="HMC58XX_CHAN_Z" value="2"/>
<define name="HMC58XX_CHAN_X_SIGN" value="-"/>
<define name="HMC58XX_CHAN_Y_SIGN" value="+"/>
<define name="HMC58XX_CHAN_Z_SIGN" value="+"/>
</load>
<!-- <load name="spektrum_soft_bind.xml"/>-->
</modules>
<section name="MISC">
<define name="MilliAmpereOfAdc(adc)" value="((float)adc) * (3.3f / 4096.0f) * (90.0f / 5.0f)" />
<!-- 100Amp = 2Volt -> 2482,42 tick/100Amp"(0.0402832*adc)" -->
</section>
<section name="IMU" prefix="IMU_">
<!-- replace this with your own calibration -->
<define name="MAG_X_NEUTRAL" value="14" />
<define name="MAG_Y_NEUTRAL" value="116" />
<define name="MAG_Z_NEUTRAL" value="119" />
<define name="MAG_X_SENS" value="5.09245681612" integer="16" />
<define name="MAG_Y_SENS" value="5.29702744632" integer="16" />
<define name="MAG_Z_SENS" value="5.65287938992" integer="16" />
<define name="BODY_TO_IMU_PHI" value="180." unit="deg" />
<define name="BODY_TO_IMU_THETA" value="180." unit="deg" />
<define name="BODY_TO_IMU_PSI" value="90." unit="deg" />
<define name="ACCEL_X_NEUTRAL" value="248"/>
<define name="ACCEL_Y_NEUTRAL" value="-21"/>
<define name="ACCEL_Z_NEUTRAL" value="1123"/>
<define name="ACCEL_X_SENS" value="0.62584356013" integer="16"/>
<define name="ACCEL_Y_SENS" value="0.609921478775" integer="16"/>
<define name="ACCEL_Z_SENS" value="0.619923942578" integer="16"/>
<define name="MAG_X_NEUTRAL" value="92"/>
<define name="MAG_Y_NEUTRAL" value="35"/>
<define name="MAG_Z_NEUTRAL" value="-15"/>
<define name="MAG_X_SENS" value="5.52543569751" integer="16"/>
<define name="MAG_Y_SENS" value="4.91233764159" integer="16"/>
<define name="MAG_Z_SENS" value="4.99453775296" integer="16"/>
</section>
<commands>
<axis name="PITCH" failsafe_value="0" />
@@ -168,11 +168,14 @@ else ifeq ($(BOARD), krooz)
# PX4FMU
else ifeq ($(BOARD),$(filter $(BOARD),px4fmu))
BARO_BOARD_CFLAGS += -DUSE_I2C2
BARO_BOARD_CFLAGS += -DBB_MS5611_I2C_DEV=i2c2
BARO_BOARD_CFLAGS += -DUSE_SPI1 -DUSE_SPI_SLAVE3
BARO_BOARD_CFLAGS += -DBB_MS5611_SPI_DEV=spi1
BARO_BOARD_CFLAGS += -DBB_MS5611_SLAVE_IDX=SPI_SLAVE3
BARO_BOARD_SRCS += peripherals/ms5611.c
BARO_BOARD_SRCS += peripherals/ms5611_i2c.c
BARO_BOARD_SRCS += boards/baro_board_ms5611_i2c.c
BARO_BOARD_SRCS += peripherals/ms5611_spi.c
BARO_BOARD_SRCS += boards/baro_board_ms5611_spi.c
# apogee baro
else ifeq ($(BOARD), apogee)
@@ -0,0 +1,51 @@
# Hey Emacs, this is a -*- makefile -*-
#
# PX4 Pixhawk IMUconsists of two (internal) IMU's and one internal magneto. Also an optional external magneto
#
# L3GD20 + LSM303D
include $(CFG_SHARED)/spi_master.makefile
IMU_PX4FMU_CFLAGS += -DIMU_TYPE_H=\"imu/imu_px4fmu_v2.4.h\"
IMU_PX4FMU_SRCS = $(SRC_SUBSYSTEMS)/imu.c
IMU_PX4FMU_SRCS += $(SRC_SUBSYSTEMS)/imu/imu_px4fmu_v2.4.c
#L3GD20 gyro
IMU_PX4FMU_SRCS += peripherals/l3gd20_spi.c
#LSM303D accelero + magneto
IMU_PX4FMU_SRCS += peripherals/lsm303dlhc_spi.c
# for fixedwing firmware and ap only
ifeq ($(TARGET), ap)
IMU_PX4FMU_CFLAGS += -DUSE_IMU
endif
# set default SPI device
IMU_PX4FMU_SPI_DEV ?= spi1
# convert spix to upper/lower case
IMU_PX4FMU_SPI_DEV_UPPER=$(shell echo $(IMU_PX4FMU_SPI_DEV) | tr a-z A-Z)
IMU_PX4FMU_SPI_DEV_LOWER=$(shell echo $(IMU_PX4FMU_SPI_DEV) | tr A-Z a-z)
IMU_PX4FMU_CFLAGS += -DIMU_PX4FMU_SPI_DEV=$(IMU_PX4FMU_SPI_DEV_LOWER)
IMU_PX4FMU_CFLAGS += -DUSE_$(IMU_PX4FMU_SPI_DEV_UPPER)
#********** L3GD20 ***********
IMU_L3G_SPI_SLAVE_IDX ?= SPI_SLAVE0
IMU_PX4FMU_CFLAGS += -DIMU_L3G_SPI_SLAVE_IDX=$(IMU_L3G_SPI_SLAVE_IDX)
IMU_PX4FMU_CFLAGS += -DUSE_$(IMU_L3G_SPI_SLAVE_IDX)
#********** LSM303dlhc ***********
IMU_LSM_SPI_SLAVE_IDX ?= SPI_SLAVE1
IMU_PX4FMU_CFLAGS += -DIMU_LSM_SPI_SLAVE_IDX=$(IMU_LSM_SPI_SLAVE_IDX)
IMU_PX4FMU_CFLAGS += -DUSE_$(IMU_LSM_SPI_SLAVE_IDX)
# add it for all targets except sim, fbw and nps
ifeq (,$(findstring $(TARGET),sim fbw nps))
$(TARGET).CFLAGS += $(IMU_PX4FMU_CFLAGS)
$(TARGET).srcs += $(IMU_PX4FMU_SRCS)
endif
#
# NPS simulator
#
include $(CFG_SHARED)/imu_nps.makefile
+6
View File
@@ -9,6 +9,12 @@
<configure name="MAG_HMC58XX_I2C_DEV" value="i2c1" description="I2C device to use (e.g. i2c1)"/>
<define name="MODULE_HMC58XX_SYNC_SEND" value="TRUE|FALSE" description="Send IMU_RAW message with each new measurement (default: FALSE)"/>
<define name="MODULE_HMC58XX_UPDATE_AHRS" value="TRUE|FALSE" description="Copy measurements to imu and send as ABI message (default: FALSE)"/>
<define name="HMC58XX_CHAN_X_SIGN" value="+|-" description="Reverse polarity of x axis (default: +)"/>
<define name="HMC58XX_CHAN_Y_SIGN" value="+|-" description="Reverse polarity of y axis (default: +)"/>
<define name="HMC58XX_CHAN_Z_SIGN" value="+|-" description="Reverse polarity of z axis (default: +)"/>
<define name="HMC58XX_CHAN_X" value="0|1|2" description="Channel id of x axis (default: 0)"/>
<define name="HMC58XX_CHAN_Y" value="0|1|2" description="Channel id of y axis (default: 1)"/>
<define name="HMC58XX_CHAN_Z" value="0|1|2" description="Channel id of z axis (default: 2)"/>
</doc>
<header>
<file name="mag_hmc58xx.h"/>