MPU9250を使えるようにするための関数群
注1)mpu9150とmpu9250では地磁気センサの出力分解能が異なる
本プログラムはmpu9250用だがVER_1_0_COMPATIBLE_MPU9150_MAG
をdefineするかどうかで出力の形式を選択可能
注2)mpu9150とmpu9250では温度センサの出力を変換する際の式が微妙に異なる
本プログラムはmpu9250用だがVER_1_0_COMPATIBLE_MPU9250_TEMP
をdefineするかどうかで出力の形式をmpu9150を用いた際と互換することが可能
[詳解]
#include "type.h"
#include "mpu9250.h"
#include "i2c.h"
#include "uart.h"
#include "SystemTickTimer.h"
#include "MainFunction.h"
#include "TinyMathFunction.h"
#include "debug.h"
#include "EEPROM_24LC16BT_I.h"
[ソースコード]
|
|
#define | MPU9250_W 0xd0 |
| |
|
#define | MPU9250_R 0xd1 |
| |
|
#define | AK8963_W 0x18 |
| |
|
#define | AK8963_R 0x19 |
| |
|
#define | NUM_REF_OMEGA (400) |
| |
|
#define | NUM_REF_ACCXY (400) |
| |
|
#define | NUM_REF_ACC (400) |
| |
|
#define | NUM_REF_MAG (300) |
| |
|
|
volatile uint8_t | I2CMasterBuffer [BUFSIZE] |
| |
|
volatile uint8_t | I2CSlaveBuffer [BUFSIZE] |
| |
|
volatile uint32_t | I2CReadLength |
| |
|
volatile uint32_t | I2CWriteLength |
| |
MPU9250を使えるようにするための関数群
注1)mpu9150とmpu9250では地磁気センサの出力分解能が異なる
本プログラムはmpu9250用だがVER_1_0_COMPATIBLE_MPU9150_MAG
をdefineするかどうかで出力の形式を選択可能
注2)mpu9150とmpu9250では温度センサの出力を変換する際の式が微妙に異なる
本プログラムはmpu9250用だがVER_1_0_COMPATIBLE_MPU9250_TEMP
をdefineするかどうかで出力の形式をmpu9150を用いた際と互換することが可能
- 著者
- RTCorp. Ryota Takahashi
mpu9250.c に定義があります。
| void calibAccXYOffset |
( |
| ) |
|
加速度センサのXY方向ロオフセット設定用関数
センサを水平にした状態でNUM_REF回のサンプルを取り, そのデータの上位25と下位25の値を クイックソートによって取り除く残りの50で平均値を求めオフセットとする. (メディアンフィルタと平均の組み合わせ)
- 引数
-
- 戻り値
- void
mpu9250.c の 813 行目に定義があります。
加速度センサのZ方向ロオフセット設定用関数
センサを垂直にした状態でNUM_REF_ACCZ回のサンプルを取り, そのデータの上位25と下位25の値を クイックソートによって取り除く残りの50で平均値を求めオフセットとする. (メディアンフィルタと平均の組み合わせ)
- 引数
-
- 戻り値
- void
mpu9250.c の 857 行目に定義があります。
地磁気センサのオフセット設定用関数
センサをしばらくの時間色々な方向に動かした後にすべての各軸の(最大値+最小値)/2を オフセット値とする. 地磁気の影響が少ない環境でオフセット調整をすること.
- 引数
-
- 戻り値
- void
mpu9250.c の 894 行目に定義があります。
| void calibOmegaOffset |
( |
int16_t * |
offset_vec | ) |
|
ジャイロオフセット設定用関数
静止状態でNUM_REF回のサンプルを取り, そのデータの上位25と下位25の値を クイックソートによって取り除く残りの50で平均値を求めオフセットとする.(メディアンフィルタと平均の組み合わせ)
- 引数
-
| *offset_vec | セットしたoffset値のベクトルを返す |
- 戻り値
- void
mpu9250.c の 760 行目に定義があります。
| int16_t concatenate2Byte_int |
( |
uint8_t |
H_byte, |
|
|
uint8_t |
L_byte |
|
) |
| |
16bit整数の上位byteと下位byteを結合する
- 引数
-
| H_byte | 上位byte |
| L_byte | 下位byte |
- 戻り値
- void
mpu9250.c の 1054 行目に定義があります。
| void debugMPU9250 |
( |
void |
| ) |
|
| void getAcc |
( |
float * |
vec | ) |
|
| void getACCInt |
( |
int16_t * |
vec | ) |
|
| void getAccOffset |
( |
int16_t * |
offset_vec | ) |
|
| void getAsa |
( |
int16_t * |
vec | ) |
|
| void getDataFromAK8963 |
( |
uint8_t * |
dest_array | ) |
|
AK8963(MPU9250の地磁気センサ)のデータ(MagXYZ)
をdest_arrayに次のように格納
byte
0 MagX 下位
1 MagX 上位
2 MagY 下位
3 MagY 上位
4 MagZ 下位
5 MagZ 上位
- 引数
-
mpu9250.c の 393 行目に定義があります。
| void getDataFromMPU9250 |
( |
uint8_t * |
dest_array | ) |
|
MPU9250のデータ (AccXYZ , GyroXYZ , temperature)
dest_arrayに次のように格納
byte
0 accX 下位
1 accX 上位
2 accY 下位
3 accY 上位
4 accZ 下位
5 accZ 上位
6 temp 下位
7 temp 上位
8 gyroX 下位
9 gyroX 上位
10 gyroY 下位
11 gyroY 上位
12 gyroZ 下位
13 gyroZ 上位
- 引数
-
mpu9250.c の 370 行目に定義があります。
| void getMag |
( |
float * |
vec | ) |
|
| void getMagInt |
( |
int16_t * |
vec | ) |
|
| void getMagOffset |
( |
int16_t * |
offset_vec | ) |
|
| void getOmega |
( |
float * |
vec | ) |
|
| void getOmegaInt |
( |
int16_t * |
vec | ) |
|
| void getOmegaOffset |
( |
int16_t * |
offset_vec | ) |
|
| void getRawAccInt |
( |
int16_t * |
vec | ) |
|
| void getRawMagInt |
( |
int16_t * |
vec | ) |
|
| void getRawOmegaInt |
( |
int16_t * |
vec | ) |
|
| void getRawTempInt |
( |
int16_t * |
temp | ) |
|
| void getTemp |
( |
float * |
temp | ) |
|
| void getTempInt |
( |
int16_t * |
temp | ) |
|
| void initMPU9250 |
( |
void |
| ) |
|
MPU9250の初期化(MPU9250のジャイロ,加速度センサ)
- 引数
-
- 戻り値
- void
mpu9250.c の 72 行目に定義があります。
| void initOffsetByEEPROM |
( |
| ) |
|
EEPROMから角速度, 加速度, 地磁気のオフセット値を読み取り オフセット格納用の配列にセットする.
- 引数
-
- 戻り値
- void
mpu9250.c の 1040 行目に定義があります。
| void readEEPROMOffsetAccInt |
( |
int16_t * |
vec | ) |
|
| void readEEPROMOffsetMagInt |
( |
int16_t * |
vec | ) |
|
| void readEEPROMOffsetOmegaInt |
( |
int16_t * |
vec | ) |
|
| void setAccOffset |
( |
int16_t * |
offset_vec | ) |
|
| void setAccOffset_x |
( |
int16_t |
offset_x | ) |
|
| void setAccOffset_y |
( |
int16_t |
offset_y | ) |
|
| void setAccOffset_z |
( |
int16_t |
offset_z | ) |
|
| void setMagOffset |
( |
int16_t * |
offset_vec | ) |
|
| void setMagOffset_x |
( |
int16_t |
offset_x | ) |
|
| void setMagOffset_y |
( |
int16_t |
offset_y | ) |
|
| void setMagOffset_z |
( |
int16_t |
offset_z | ) |
|
| void setOmegaOffset |
( |
int16_t * |
offset_vec | ) |
|
| void setOmegaOffset_x |
( |
int16_t |
offset_x | ) |
|
| void setOmegaOffset_y |
( |
int16_t |
offset_y | ) |
|
| void setOmegaOffset_z |
( |
int16_t |
offset_z | ) |
|
| void updateAK8963Data |
( |
| ) |
|
MPU9250からデータを読み出し各種変数を更新する
更新する対象は以下
- mag_vec[3]
- mag_vec_raw_int[3]
- mag_vec_int[3]
- ak8963ArrayData[6]
mpu9250.c の 285 行目に定義があります。
| void updateMPU9250Data |
( |
void |
| ) |
|
MPU9250からデータを読み出し各種変数を更新する
更新する対象は以下
- omega_vec[3]
- acc_vec[3]
- temperatur
- omega_vec_int[3]
- acc_vec_int[3]
- temperature_int
- omega_vec_raw_int[3]
- acc_vec_raw_int[3]
- temperature_raw_int
- mpu9250ArrayData[14]
mpu9250.c の 195 行目に定義があります。
MPU9250とAK8963(MPU9250の地磁気センサ)のwho am iを読む
1秒ごとにwho am iを呼びだし続ける無限ループが記述されている
- 引数
-
- 戻り値
- void
mpu9250.c の 409 行目に定義があります。
| void writeEEPROMOffsetAccInt |
( |
int16_t * |
vec | ) |
|
加速度のオフセット値をEEPROMへ書き込む
加速度のオフセット値はEEPROMの0ブロック目,0x0番地から6byte分 にX,Y,Zの順で書き込まれる
- 引数
-
mpu9250.c の 977 行目に定義があります。
| void writeEEPROMOffsetMagInt |
( |
int16_t * |
vec | ) |
|
地磁気のオフセット値をEEPROMへ書き込む
地磁気のオフセット値はEEPROMの0ブロック目,0x0C番地から6byte分 にX,Y,Zの順で書き込まれる
- 引数
-
mpu9250.c の 1001 行目に定義があります。
| void writeEEPROMOffsetOmegaInt |
( |
int16_t * |
vec | ) |
|
角速度のオフセット値をEEPROMへ書き込む
角速度のオフセット値はEEPROMの0ブロック目,0x6番地から6byte分 にX,Y,Zの順で書き込まれる
- 引数
-
mpu9250.c の 989 行目に定義があります。