RT-USB-9AXIS-00
mpu9250.c ファイル

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)
 

関数

int16_t concatenate2Byte_int (uint8_t H_byte, uint8_t L_byte)
 
void initMPU9250 (void)
 
void initAK8963 (void)
 
void updateMPU9250Data (void)
 
void updateAK8963Data ()
 
void getDataFromMPU9250 (uint8_t *dest_array)
 
void getDataFromAK8963 (uint8_t *dest_array)
 
void whoAmI (void)
 
void getOmega (float *vec)
 
void getMag (float *vec)
 
void getAcc (float *vec)
 
void getTemp (float *temp)
 
void getOmegaOffset (int16_t *offset_vec)
 
void getAccOffset (int16_t *offset_vec)
 
void getMagOffset (int16_t *offset_vec)
 
void setOmegaOffset (int16_t *offset_vec)
 
void setAccOffset (int16_t *offset_vec)
 
void setMagOffset (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 setAccOffset_x (int16_t offset_x)
 
void setAccOffset_y (int16_t offset_y)
 
void setAccOffset_z (int16_t offset_z)
 
void setMagOffset_x (int16_t offset_x)
 
void setMagOffset_y (int16_t offset_y)
 
void setMagOffset_z (int16_t offset_z)
 
void getAsa (int16_t *vec)
 
void getOmegaInt (int16_t *vec)
 
void getACCInt (int16_t *vec)
 
void getMagInt (int16_t *vec)
 
void getTempInt (int16_t *temp)
 
void getRawOmegaInt (int16_t *vec)
 
void getRawAccInt (int16_t *vec)
 
void getRawMagInt (int16_t *vec)
 
void getRawTempInt (int16_t *temp)
 
void calibOmegaOffset (int16_t *offset_vec)
 
void calibAccXYOffset ()
 
void calibAccZOffset ()
 
void calibMagOffset ()
 
void debugMPU9250 (void)
 
void writeEEPROMOffsetAccInt (int16_t *vec)
 
void writeEEPROMOffsetOmegaInt (int16_t *vec)
 
void writeEEPROMOffsetMagInt (int16_t *vec)
 
void readEEPROMOffsetAccInt (int16_t *vec)
 
void readEEPROMOffsetOmegaInt (int16_t *vec)
 
void readEEPROMOffsetMagInt (int16_t *vec)
 
void initOffsetByEEPROM ()
 

変数

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
戻り値
void

mpu9250.c813 行目に定義があります。

void calibAccZOffset ( )

加速度センサのZ方向ロオフセット設定用関数
センサを垂直にした状態でNUM_REF_ACCZ回のサンプルを取り, そのデータの上位25と下位25の値を クイックソートによって取り除く残りの50で平均値を求めオフセットとする. (メディアンフィルタと平均の組み合わせ)

引数
void
戻り値
void

mpu9250.c857 行目に定義があります。

void calibMagOffset ( )

地磁気センサのオフセット設定用関数
センサをしばらくの時間色々な方向に動かした後にすべての各軸の(最大値+最小値)/2を オフセット値とする. 地磁気の影響が少ない環境でオフセット調整をすること.

引数
void
戻り値
void

mpu9250.c894 行目に定義があります。

void calibOmegaOffset ( int16_t *  offset_vec)

ジャイロオフセット設定用関数
静止状態でNUM_REF回のサンプルを取り, そのデータの上位25と下位25の値を クイックソートによって取り除く残りの50で平均値を求めオフセットとする.(メディアンフィルタと平均の組み合わせ)

引数
*offset_vecセットしたoffset値のベクトルを返す
戻り値
void

mpu9250.c760 行目に定義があります。

int16_t concatenate2Byte_int ( uint8_t  H_byte,
uint8_t  L_byte 
)

16bit整数の上位byteと下位byteを結合する

引数
H_byte上位byte
L_byte下位byte
戻り値
void

mpu9250.c1054 行目に定義があります。

void debugMPU9250 ( void  )

デバッグ用関数

引数
void
戻り値
void

mpu9250.c938 行目に定義があります。

void getAcc ( float *  vec)

加速度ベクトルを返す. 単位は[1G]

引数
*vec格納先
戻り値
void

mpu9250.c481 行目に定義があります。

void getACCInt ( int16_t *  vec)

 加速度を整数値で返す

引数
*vec

mpu9250.c681 行目に定義があります。

void getAccOffset ( int16_t *  offset_vec)

現在の加速度のオフセット値を返す

引数
*offset_vec

mpu9250.c514 行目に定義があります。

void getAsa ( int16_t *  vec)

地磁気センサのAsa値を返す

引数
*vec

mpu9250.c659 行目に定義があります。

void getDataFromAK8963 ( uint8_t *  dest_array)

AK8963(MPU9250の地磁気センサ)のデータ(MagXYZ)
をdest_arrayに次のように格納
byte
0 MagX 下位
1 MagX 上位
2 MagY 下位
3 MagY 上位
4 MagZ 下位
5 MagZ 上位

引数
*dest_arrayデータの格納先

mpu9250.c393 行目に定義があります。

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 上位

引数
  *dest_array データの格納先

mpu9250.c370 行目に定義があります。

void getMag ( float *  vec)

地磁気ベクトルを返す. 単位は [uT]

引数
*vec 格納先
戻り値
void

mpu9250.c469 行目に定義があります。

void getMagInt ( int16_t *  vec)

地磁気を整数値で返す

引数
*vec

mpu9250.c692 行目に定義があります。

void getMagOffset ( int16_t *  offset_vec)

現在の地磁気のオフセット値を返す

引数
*offset_vec

mpu9250.c525 行目に定義があります。

void getOmega ( float *  vec)

角速度ベクトルを返す. 単位は[rad/s]

引数
*vec

mpu9250.c457 行目に定義があります。

void getOmegaInt ( int16_t *  vec)

角速度を整数値で返す

引数
*vec

mpu9250.c670 行目に定義があります。

void getOmegaOffset ( int16_t *  offset_vec)

現在のジャイロセンサのオフセット値を返す

引数
*offset_vec

mpu9250.c503 行目に定義があります。

void getRawAccInt ( int16_t *  vec)

加速度の生データを整数値で返す

引数
*vec

mpu9250.c724 行目に定義があります。

void getRawMagInt ( int16_t *  vec)

地磁気の生データを整数値で返す

引数
*vec

mpu9250.c735 行目に定義があります。

void getRawOmegaInt ( int16_t *  vec)

角速度の生データを整数値で返す

引数
*vec

mpu9250.c713 行目に定義があります。

void getRawTempInt ( int16_t *  temp)

温度の生データを整数値で返す

引数
*temp

mpu9250.c746 行目に定義があります。

void getTemp ( float *  temp)

温度を返す. 単位は[℃]

引数
*vec格納先
戻り値
void

mpu9250.c493 行目に定義があります。

void getTempInt ( int16_t *  temp)

温度を整数値で返す

引数
*vec

mpu9250.c703 行目に定義があります。

void initAK8963 ( void  )

Asa[]に感度調整値を格納.

引数
void
戻り値
void

mpu9250.c136 行目に定義があります。

void initMPU9250 ( void  )

MPU9250の初期化(MPU9250のジャイロ,加速度センサ)

引数
void
戻り値
void

mpu9250.c72 行目に定義があります。

void initOffsetByEEPROM ( )

EEPROMから角速度, 加速度, 地磁気のオフセット値を読み取り オフセット格納用の配列にセットする.

引数
void
戻り値
void

mpu9250.c1040 行目に定義があります。

void readEEPROMOffsetAccInt ( int16_t *  vec)

EEPROMから読み出した加速度のオフセット値を配列に読み込む

引数
*vec加速度のオフセット値を格納する先の配列

mpu9250.c1010 行目に定義があります。

void readEEPROMOffsetMagInt ( int16_t *  vec)

EEPROMから読み出した地磁気のオフセット値を配列に読み込む

引数
*vec地磁気のオフセット値を格納する先の配列

mpu9250.c1028 行目に定義があります。

void readEEPROMOffsetOmegaInt ( int16_t *  vec)

EEPROMから読み出した角速度のオフセット値を配列に読み込む

引数
*vec角速度のオフセット値を格納する先の配列

mpu9250.c1019 行目に定義があります。

void setAccOffset ( int16_t *  offset_vec)

加速度のオフセット値をセットする

引数
*offset_vec

mpu9250.c547 行目に定義があります。

void setAccOffset_x ( int16_t  offset_x)

加速度のx方向のオフセットをセットする

引数
offset_x

mpu9250.c599 行目に定義があります。

void setAccOffset_y ( int16_t  offset_y)

加速度のy方向のオフセットをセットする

引数
offset_y

mpu9250.c609 行目に定義があります。

void setAccOffset_z ( int16_t  offset_z)

加速度のz方向のオフセットをセットする

引数
offset_x

mpu9250.c619 行目に定義があります。

void setMagOffset ( int16_t *  offset_vec)

地磁気のオフセット値をセットする

引数
*offset_vec

mpu9250.c558 行目に定義があります。

void setMagOffset_x ( int16_t  offset_x)

地磁気のx方向のオフセットをセットする

引数
offset_x

mpu9250.c629 行目に定義があります。

void setMagOffset_y ( int16_t  offset_y)

地磁気のy方向のオフセットをセットする

引数
offset_y

mpu9250.c639 行目に定義があります。

void setMagOffset_z ( int16_t  offset_z)

地磁気のz方向のオフセットをセットする

引数
offset_z

mpu9250.c649 行目に定義があります。

void setOmegaOffset ( int16_t *  offset_vec)

角速度のオフセット値をセットする

引数
*offset_vec

mpu9250.c536 行目に定義があります。

void setOmegaOffset_x ( int16_t  offset_x)

角速度のx方向のオフセットをセットする

引数
offset_x

mpu9250.c569 行目に定義があります。

void setOmegaOffset_y ( int16_t  offset_y)

角速度のy方向のオフセットをセットする

引数
offset_y

mpu9250.c579 行目に定義があります。

void setOmegaOffset_z ( int16_t  offset_z)

角速度のz方向のオフセットをセットする

引数
offset_z

mpu9250.c589 行目に定義があります。

void updateAK8963Data ( )

MPU9250からデータを読み出し各種変数を更新する
更新する対象は以下

  • mag_vec[3]
  • mag_vec_raw_int[3]
  • mag_vec_int[3]
  • ak8963ArrayData[6]

mpu9250.c285 行目に定義があります。

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.c195 行目に定義があります。

void whoAmI ( void  )

MPU9250とAK8963(MPU9250の地磁気センサ)のwho am iを読む
1秒ごとにwho am iを呼びだし続ける無限ループが記述されている

引数
void
戻り値
void

mpu9250.c409 行目に定義があります。

void writeEEPROMOffsetAccInt ( int16_t *  vec)

加速度のオフセット値をEEPROMへ書き込む
加速度のオフセット値はEEPROMの0ブロック目,0x0番地から6byte分 にX,Y,Zの順で書き込まれる

引数
*vec加速度のオフセット値が格納されている配列

mpu9250.c977 行目に定義があります。

void writeEEPROMOffsetMagInt ( int16_t *  vec)

地磁気のオフセット値をEEPROMへ書き込む
地磁気のオフセット値はEEPROMの0ブロック目,0x0C番地から6byte分 にX,Y,Zの順で書き込まれる

引数
*vec地磁気のオフセット値が格納されている配列

mpu9250.c1001 行目に定義があります。

void writeEEPROMOffsetOmegaInt ( int16_t *  vec)

角速度のオフセット値をEEPROMへ書き込む
角速度のオフセット値はEEPROMの0ブロック目,0x6番地から6byte分 にX,Y,Zの順で書き込まれる

引数
*vec角速度のオフセット値が格納されている配列

mpu9250.c989 行目に定義があります。