Revision 5d4d14a3

View differences:

include/MPU6050/alld_MPU6050.h
1
/*
2
AMiRo-LLD is a compilation of low-level hardware drivers for the Autonomous Mini Robot (AMiRo) platform.
3
Copyright (C) 2016..2019  Thomas Schöpping et al.
4

  
5
This program is free software: you can redistribute it and/or modify
6
it under the terms of the GNU Lesser General Public License as published by
7
the Free Software Foundation, either version 3 of the License, or
8
(at your option) any later version.
9

  
10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
GNU Lesser General Public License for more details.
14

  
15
You should have received a copy of the GNU Lesser General Public License
16
along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
*/
18

  
19
/**
20
 * @file    alld_MPU6050.h
21
 *
22
 * @addtogroup lld_mems
23
 * @{
24
 */
25

  
26
#ifndef AMIROLLD_MPU6050_H
27
#define AMIROLLD_MPU6050_H
28

  
29
#include <amiro-lld.h>
30

  
31
#if defined(AMIROLLD_CFG_MPU6050)
32

  
33
#if (AMIROLLD_CFG_MPU6050 == 1)
34
  #include "v1/alld_MPU6050_v1.h"
35
#else
36
  #error "invalid value assigned to AMIROLLD_CFG_MPU6050 in alldconf.h"
37
#endif
38

  
39
#endif /* defined(AMIROLLD_CFG_MPU6050) */
40

  
41
#endif /* AMIROLLD_MPU6050_H */
42

  
43
/** @} */
include/MPU6050/v1/alld_MPU6050_v1.h
1
/*
2
AMiRo-LLD is a compilation of low-level hardware drivers for the Autonomous Mini Robot (AMiRo) platform.
3
Copyright (C) 2016..2019  Thomas Schöpping et al.
4

  
5
This program is free software: you can redistribute it and/or modify
6
it under the terms of the GNU Lesser General Public License as published by
7
the Free Software Foundation, either version 3 of the License, or
8
(at your option) any later version.
9

  
10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
GNU Lesser General Public License for more details.
14

  
15
You should have received a copy of the GNU Lesser General Public License
16
along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
*/
18

  
19
/**
20
 * @file    alld_MPU6050_v1.h
21
 * @brief   Gyro & Accelerometer macros and structures.
22
 *
23
 * @addtogroup lld_mems
24
 * @{
25
 */
26

  
27
#ifndef AMIROLLD_MPU6050_V1_H
28
#define AMIROLLD_MPU6050_V1_H
29

  
30
#include <amiro-lld.h>
31

  
32
#if (defined(AMIROLLD_CFG_MPU6050) && (AMIROLLD_CFG_MPU6050 == 1)) || defined(__DOXYGEN__)
33

  
34
/******************************************************************************/
35
/* CONSTANTS                                                                  */
36
/******************************************************************************/
37

  
38
/**
39
 * @brief Maximum I2C frequency.
40
 */
41
#define MPU6050_LLD_I2C_MAXFREQUENCY    400000
42

  
43
#define SD_MPU6050_DataRate_8KHz        0   /**< Sample rate set to 8 kHz */
44
#define SD_MPU6050_DataRate_4KHz        1   /**< Sample rate set to 4 kHz */
45
#define SD_MPU6050_DataRate_2KHz        3   /**< Sample rate set to 2 kHz */
46
#define SD_MPU6050_DataRate_1KHz        7   /**< Sample rate set to 1 kHz */
47
#define SD_MPU6050_DataRate_500Hz       15  /**< Sample rate set to 500 Hz */
48
#define SD_MPU6050_DataRate_250Hz       31  /**< Sample rate set to 250 Hz */
49
#define SD_MPU6050_DataRate_125Hz       63  /**< Sample rate set to 125 Hz */
50
#define SD_MPU6050_DataRate_100Hz       79  /**< Sample rate set to 100 Hz */
51

  
52
/******************************************************************************/
53
/* SETTINGS                                                                   */
54
/******************************************************************************/
55

  
56
/******************************************************************************/
57
/* CHECKS                                                                     */
58
/******************************************************************************/
59

  
60
/******************************************************************************/
61
/* DATA STRUCTURES AND TYPES                                                  */
62
/******************************************************************************/
63

  
64
/**
65
 * @brief I2C address masks. TODO: Set to MPU6050 adresses!
66
 */
67
enum {
68
  MPU6050_LLD_I2C_ADDR_FIXED   = 0x0040u,
69
  MPU6050_LLD_I2C_ADDR_A0      = 0x0001u,
70
  MPU6050_LLD_I2C_ADDR_A1      = 0x0004u,
71
};
72

  
73
/**
74
 * @brief Registers. TODO: Adjust to MPU6050 registers
75
 */
76
typedef enum {
77
  MPU6050_LLD_REGISTER_CONFIGURATION = 0x00,
78
  MPU6050_LLD_REGISTER_SHUNT_VOLTAGE = 0x01,
79
  MPU6050_LLD_REGISTER_BUS_VOLTAGE   = 0x02,
80
  MPU6050_LLD_REGISTER_POWER         = 0x03,
81
  MPU6050_LLD_REGISTER_CURRENT       = 0x04,
82
  MPU6050_LLD_REGISTER_CALIBRATION   = 0x05,
83
} mpu6050_lld_register_t;
84

  
85
/**
86
 * @brief  MPU6050 can have 2 different slave addresses, depends on it's input AD0 pin
87
 *         This feature allows you to use 2 different sensors with this library at the same time
88
 */
89
typedef enum  {
90
	SD_MPU6050_Device_0 = 0x00, /*!< AD0 pin is set to low */
91
	SD_MPU6050_Device_1 = 0x02  /*!< AD0 pin is set to high */
92
} SD_MPU6050_Device;
93

  
94
/**
95
 * @brief  MPU6050 result enumeration
96
 */
97
typedef enum  {
98
	SD_MPU6050_Result_Ok = 0x00,          /*!< Everything OK */
99
	SD_MPU6050_Result_Error,              /*!< Unknown error */
100
	SD_MPU6050_Result_DeviceNotConnected, /*!< There is no device with valid slave address */
101
	SD_MPU6050_Result_DeviceInvalid       /*!< Connected device with address is not MPU6050 */
102
} SD_MPU6050_Result;
103

  
104
/**
105
 * @brief  Parameters for accelerometer range
106
 */
107
typedef enum  {
108
	SD_MPU6050_Accelerometer_2G = 0x00, /*!< Range is +- 2G */
109
	SD_MPU6050_Accelerometer_4G = 0x01, /*!< Range is +- 4G */
110
	SD_MPU6050_Accelerometer_8G = 0x02, /*!< Range is +- 8G */
111
	SD_MPU6050_Accelerometer_16G = 0x03 /*!< Range is +- 16G */
112
} SD_MPU6050_Accelerometer;
113

  
114
/**
115
 * @brief  Parameters for gyroscope range
116
 */
117
typedef enum {
118
	SD_MPU6050_Gyroscope_250s = 0x00,  /*!< Range is +- 250 degrees/s */
119
	SD_MPU6050_Gyroscope_500s = 0x01,  /*!< Range is +- 500 degrees/s */
120
	SD_MPU6050_Gyroscope_1000s = 0x02, /*!< Range is +- 1000 degrees/s */
121
	SD_MPU6050_Gyroscope_2000s = 0x03  /*!< Range is +- 2000 degrees/s */
122
} SD_MPU6050_Gyroscope;
123

  
124

  
125
/**
126
 * @brief  Interrupts union and structure
127
 */
128
typedef union {
129
	struct {
130
		uint8_t DataReady:1;       /*!< Data ready interrupt */
131
		uint8_t reserved2:2;       /*!< Reserved bits */
132
		uint8_t Master:1;          /*!< Master interrupt. Not enabled with library */
133
		uint8_t FifoOverflow:1;    /*!< FIFO overflow interrupt. Not enabled with library */
134
		uint8_t reserved1:1;       /*!< Reserved bit */
135
		uint8_t MotionDetection:1; /*!< Motion detected interrupt */
136
		uint8_t reserved0:1;       /*!< Reserved bit */
137
	} F;
138
	uint8_t Status;
139
} SD_MPU6050_Interrupt;
140

  
141
/**
142
 * @brief Config register.
143
 */
144
typedef union {
145
  uint16_t data;
146
  struct {
147
    /**
148
    ina219_lld_mode_t mode : 3;
149
    ina219_lld_adc_t sadc : 4;
150
    ina219_lld_adc_t badc : 4;
151
    ina219_lld_gain_t gain : 2;
152
    ina219_lld_brng_t brng : 1;
153
    */
154
    uint8_t zero : 1;
155
    uint8_t reset : 1;
156
  } options;
157
} mpu6050_lld_cfg_t;
158

  
159

  
160
/**
161
 * @brief The MPU6050 struct.
162
 */
163
typedef struct {
164
  apalI2CDriver_t* i2cd;
165
  apalI2Caddr_t addr;   /**<The address of the module for I2C communication */
166
  uint16_t current_lsb_uA;
167
  mpu6050_lld_cfg_t *config;
168
} MPU6050Driver;
169

  
170
/******************************************************************************/
171
/* MACROS                                                                     */
172
/******************************************************************************/
173

  
174
/******************************************************************************/
175
/* EXTERN DECLARATIONS                                                        */
176
/******************************************************************************/
177

  
178
#ifdef __cplusplus
179
extern "C" {
180
#endif
181
  apalExitStatus_t mpu6050_lld_read_register(const MPU6050Driver* const mpu6050, const mpu6050_lld_register_t addr, uint16_t* const data, const uint8_t num, const apalTime_t timeout);
182
  apalExitStatus_t mpu6050_lld_write_register(const MPU6050Driver* const mpu6050, const mpu6050_lld_register_t addr, const uint16_t* const data, const uint8_t num, const apalTime_t timeout);
183
#ifdef __cplusplus
184
}
185
#endif
186

  
187
/******************************************************************************/
188
/* INLINE FUNCTIONS                                                           */
189
/******************************************************************************/
190

  
191
#endif /* defined(AMIROLLD_CFG_MPU6050) && (AMIROLLD_CFG_MPU6050 == 1) */
192

  
193
#endif /* AMIROLLD_MPU6050_V1_H */
194

  
source/MPU6050/v1/alld_MPU6050_v1.c
1
/*
2
 * sd_hal_mpu6050.c
3
 *
4
 *  Created on: Feb 19, 2016
5
 *      Author: Sina Darvishi
6
 *  Edited on: Jan 15, 2019
7
 *      Editor: Simon Welzel
8
 */
9

  
10
/**
11
 * |----------------------------------------------------------------------
12
 * | Copyright (C) Sina Darvishi,2016
13
 * |
14
 * | This program is free software: you can redistribute it and/or modify
15
 * | it under the terms of the GNU General Public License as published by
16
 * | the Free Software Foundation, either version 3 of the License, or
17
 * | any later version.
18
 * |
19
 * | This program is distributed in the hope that it will be useful,
20
 * | but WITHOUT ANY WARRANTY; without even the implied warranty of
21
 * | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22
 * | GNU General Public License for more details.
23
 * |
24
 * | You should have received a copy of the GNU General Public License
25
 * | along with this program.  If not, see <http://www.gnu.org/licenses/>.
26
 * |----------------------------------------------------------------------
27
 */
28

  
29
#include <alld_MPU6050.h>
30

  
31
#if (defined(AMIROLLD_CFG_MPU6050) && (AMIROLLD_CFG_MPU6050 == 1)) || defined(__DOXYGEN__)
32

  
33
/******************************************************************************/
34
/* LOCAL DEFINITIONS                                                          */
35
/******************************************************************************/
36

  
37
/* Default I2C address */
38
#define MPU6050_I2C_ADDR   0xD0
39

  
40
/* Who I am register value */
41
#define MPU6050_I_AM    0x68
42

  
43
/* MPU6050 registers */
44
#define MPU6050_AUX_VDDIO   0x01
45
#define MPU6050_SMPLRT_DIV   0x19
46
#define MPU6050_CONFIG    0x1A
47
#define MPU6050_GYRO_CONFIG   0x1B
48
#define MPU6050_ACCEL_CONFIG  0x1C
49
#define MPU6050_MOTION_THRESH  0x1F
50
#define MPU6050_INT_PIN_CFG   0x37
51
#define MPU6050_INT_ENABLE   0x38
52
#define MPU6050_INT_STATUS   0x3A
53
#define MPU6050_ACCEL_XOUT_H  0x3B
54
#define MPU6050_ACCEL_XOUT_L  0x3C
55
#define MPU6050_ACCEL_YOUT_H  0x3D
56
#define MPU6050_ACCEL_YOUT_L  0x3E
57
#define MPU6050_ACCEL_ZOUT_H  0x3F
58
#define MPU6050_ACCEL_ZOUT_L  0x40
59
#define MPU6050_TEMP_OUT_H   0x41
60
#define MPU6050_TEMP_OUT_L   0x42
61
#define MPU6050_GYRO_XOUT_H   0x43
62
#define MPU6050_GYRO_XOUT_L   0x44
63
#define MPU6050_GYRO_YOUT_H   0x45
64
#define MPU6050_GYRO_YOUT_L   0x46
65
#define MPU6050_GYRO_ZOUT_H   0x47
66
#define MPU6050_GYRO_ZOUT_L   0x48
67
#define MPU6050_MOT_DETECT_STATUS 0x61
68
#define MPU6050_SIGNAL_PATH_RESET 0x68
69
#define MPU6050_MOT_DETECT_CTRL  0x69
70
#define MPU6050_USER_CTRL   0x6A
71
#define MPU6050_PWR_MGMT_1   0x6B
72
#define MPU6050_PWR_MGMT_2   0x6C
73
#define MPU6050_FIFO_COUNTH   0x72
74
#define MPU6050_FIFO_COUNTL   0x73
75
#define MPU6050_FIFO_R_W   0x74
76
#define MPU6050_WHO_AM_I   0x75
77

  
78
/* Gyro sensitivities in degrees/s */
79
#define MPU6050_GYRO_SENS_250  ((float) 131)
80
#define MPU6050_GYRO_SENS_500  ((float) 65.5)
81
#define MPU6050_GYRO_SENS_1000  ((float) 32.8)
82
#define MPU6050_GYRO_SENS_2000  ((float) 16.4)
83

  
84
/* Acce sensitivities in g/s */
85
#define MPU6050_ACCE_SENS_2   ((float) 16384)
86
#define MPU6050_ACCE_SENS_4   ((float) 8192)
87
#define MPU6050_ACCE_SENS_8   ((float) 4096)
88
#define MPU6050_ACCE_SENS_16  ((float) 2048)
89

  
90
/******************************************************************************/
91
/* EXPORTED VARIABLES                                                         */
92
/******************************************************************************/
93

  
94
/******************************************************************************/
95
/* LOCAL TYPES                                                                */
96
/******************************************************************************/
97

  
98
/******************************************************************************/
99
/* LOCAL VARIABLES                                                            */
100
/******************************************************************************/
101

  
102
/******************************************************************************/
103
/* LOCAL FUNCTIONS                                                            */
104
/******************************************************************************/
105

  
106
/******************************************************************************/
107
/* EXPORTED FUNCTIONS                                                         */
108
/******************************************************************************/
109

  
110
// from alld_ina219.c
111
/**
112
 * @brief Read the value of one or more of the registers.
113
 * @param[in]   i2cd        i2c driver
114
 * @param[in]   inad        ina219 driver
115
 * @param[in]   addr        register address
116
 * @param[out]  data        register content
117
 * @param[in]   num         number of subsequent registers to read
118
 * @param[in]   timeout     timeout
119
 * @return                  An indicator whether the call was successfull
120
 */
121
apalExitStatus_t mpu6050_lld_read_register(const MPU6050Driver* const mpu6050, const mpu6050_lld_register_t addr, uint16_t* const data, const uint8_t num, const apalTime_t timeout)
122
{
123
  apalDbgAssert(mpu6050 != 0);
124
  apalDbgAssert(mpu6050->i2cd != 0);
125
  apalDbgAssert(data != 0);
126

  
127
  uint8_t buffer[num*2];
128
  apalExitStatus_t status = apalI2CMasterTransmit(mpu6050->i2cd, (MPU6050_LLD_I2C_ADDR_FIXED | mpu6050->addr), (uint8_t*)&addr, 1, buffer, 2*num, timeout);
129
  for (uint8_t dataIdx = 0; dataIdx < num; dataIdx++) {
130
    data[dataIdx] = (buffer[2*dataIdx] << 8) | buffer[2*dataIdx+1];
131
  }
132
  return status;
133
}
134

  
135
/**
136
 * @brief Write the value of one or more of the registers.
137
 * @param[in]   i2cd        i2c driver
138
 * @param[in]   inad        ina219 driver
139
 * @param[in]   addr        register address
140
 * @param[in]   data        data to write
141
 * @param[in]   num         number of subsequent registers to read
142
 * @param[in]   timeout     timeout
143
 * @return                  An indicator whether the call was successfull
144
 */
145
apalExitStatus_t mpu6050_lld_write_register(const MPU6050Driver* const mpu6050, const mpu6050_lld_register_t addr, const uint16_t* const data, const uint8_t num, const apalTime_t timeout)
146
{
147
  apalDbgAssert(mpu6050 != 0);
148
  apalDbgAssert(mpu6050->i2cd != 0);
149
  apalDbgAssert(data != 0);
150

  
151
  uint8_t buffer[1+2*num];
152
  buffer[0] = addr;
153
  for (uint8_t dataIdx = 0; dataIdx < num; dataIdx++) {
154
    buffer[dataIdx*2+1] = data[dataIdx] >> 8;
155
    buffer[dataIdx*2+2] = data[dataIdx] & (0x00FFu);
156
  }
157
  return apalI2CMasterTransmit(mpu6050->i2cd, (MPU6050_LLD_I2C_ADDR_FIXED | mpu6050->addr), buffer, 1+2*num, NULL, 0, timeout);
158
}
159

  
160
#endif /* defined(AMIROLLD_CFG_MPU6050) && (AMIROLLD_CFG_MPU6050 == 1) */
161

  

Also available in: Unified diff