RT-AICHIPV3-sample
マクロ定義 | 関数 | 変数
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"
mpu9250.c の依存先関係図:

マクロ定義

#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 ()
 
void getOmegaStrLPF (float *vec)
 

変数

volatile uint8_t I2CMasterBuffer [BUFSIZE]
 
volatile uint8_t I2CSlaveBuffer [BUFSIZE]
 
volatile uint32_t I2CReadLength
 
volatile uint32_t I2CWriteLength
 
volatile float gain_LPF = 0.8
 
volatile float gain_str_LPF = 0.1
 

詳解

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

マクロ定義詳解

◆ AK8963_R

#define AK8963_R   0x19

◆ AK8963_W

#define AK8963_W   0x18

◆ MPU9250_R

#define MPU9250_R   0xd1

◆ MPU9250_W

#define MPU9250_W   0xd0

◆ NUM_REF_ACC

#define NUM_REF_ACC   (400)

◆ NUM_REF_ACCXY

#define NUM_REF_ACCXY   (400)

◆ NUM_REF_MAG

#define NUM_REF_MAG   (300)

◆ NUM_REF_OMEGA

#define NUM_REF_OMEGA   (400)

関数詳解

◆ calibAccXYOffset()

void calibAccXYOffset ( )

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

引数
void
戻り値
void

◆ calibAccZOffset()

void calibAccZOffset ( )

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

引数
void
戻り値
void

◆ calibMagOffset()

void calibMagOffset ( )

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

引数
void
戻り値
void

◆ calibOmegaOffset()

void calibOmegaOffset ( int16_t offset_vec)

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

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

◆ concatenate2Byte_int()

int16_t concatenate2Byte_int ( uint8_t  H_byte,
uint8_t  L_byte 
)

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

引数
H_byte上位byte
L_byte下位byte
戻り値
void
被呼び出し関係図:

◆ debugMPU9250()

void debugMPU9250 ( void  )

デバッグ用関数

引数
void
戻り値
void
呼び出し関係図:
被呼び出し関係図:

◆ getAcc()

void getAcc ( float *  vec)

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

引数
*vec格納先
戻り値
void

◆ getACCInt()

void getACCInt ( int16_t vec)

 加速度を整数値で返す

引数
*vec

◆ getAccOffset()

void getAccOffset ( int16_t offset_vec)

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

引数
*offset_vec

◆ getAsa()

void getAsa ( int16_t vec)

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

引数
*vec

◆ getDataFromAK8963()

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データの格納先

◆ getDataFromMPU9250()

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 データの格納先

◆ getMag()

void getMag ( float *  vec)

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

引数
*vec 格納先
戻り値
void

◆ getMagInt()

void getMagInt ( int16_t vec)

地磁気を整数値で返す

引数
*vec

◆ getMagOffset()

void getMagOffset ( int16_t offset_vec)

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

引数
*offset_vec

◆ getOmega()

void getOmega ( float *  vec)

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

引数
*vec

◆ getOmegaInt()

void getOmegaInt ( int16_t vec)

角速度を整数値で返す

引数
*vec

◆ getOmegaOffset()

void getOmegaOffset ( int16_t offset_vec)

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

引数
*offset_vec

◆ getOmegaStrLPF()

void getOmegaStrLPF ( float *  vec)

ジャイロセンサ値に強めのローパスフィルタをかけた値を*vecに格納

引数
*vec
戻り値
void

◆ getRawAccInt()

void getRawAccInt ( int16_t vec)

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

引数
*vec

◆ getRawMagInt()

void getRawMagInt ( int16_t vec)

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

引数
*vec

◆ getRawOmegaInt()

void getRawOmegaInt ( int16_t vec)

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

引数
*vec

◆ getRawTempInt()

void getRawTempInt ( int16_t temp)

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

引数
*temp

◆ getTemp()

void getTemp ( float *  temp)

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

引数
*vec格納先
戻り値
void

◆ getTempInt()

void getTempInt ( int16_t temp)

温度を整数値で返す

引数
*vec

◆ initAK8963()

void initAK8963 ( void  )

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

引数
void
戻り値
void
呼び出し関係図:
被呼び出し関係図:

◆ initMPU9250()

void initMPU9250 ( void  )

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

引数
void
戻り値
void
呼び出し関係図:
被呼び出し関係図:

◆ initOffsetByEEPROM()

void initOffsetByEEPROM ( )

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

引数
void
戻り値
void
呼び出し関係図:
被呼び出し関係図:

◆ readEEPROMOffsetAccInt()

void readEEPROMOffsetAccInt ( int16_t vec)

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

引数
*vec加速度のオフセット値を格納する先の配列
呼び出し関係図:
被呼び出し関係図:

◆ readEEPROMOffsetMagInt()

void readEEPROMOffsetMagInt ( int16_t vec)

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

引数
*vec地磁気のオフセット値を格納する先の配列
呼び出し関係図:

◆ readEEPROMOffsetOmegaInt()

void readEEPROMOffsetOmegaInt ( int16_t vec)

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

引数
*vec角速度のオフセット値を格納する先の配列
呼び出し関係図:

◆ setAccOffset()

void setAccOffset ( int16_t offset_vec)

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

引数
*offset_vec

◆ setAccOffset_x()

void setAccOffset_x ( int16_t  offset_x)

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

引数
offset_x

◆ setAccOffset_y()

void setAccOffset_y ( int16_t  offset_y)

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

引数
offset_y

◆ setAccOffset_z()

void setAccOffset_z ( int16_t  offset_z)

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

引数
offset_x

◆ setMagOffset()

void setMagOffset ( int16_t offset_vec)

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

引数
*offset_vec

◆ setMagOffset_x()

void setMagOffset_x ( int16_t  offset_x)

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

引数
offset_x

◆ setMagOffset_y()

void setMagOffset_y ( int16_t  offset_y)

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

引数
offset_y

◆ setMagOffset_z()

void setMagOffset_z ( int16_t  offset_z)

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

引数
offset_z

◆ setOmegaOffset()

void setOmegaOffset ( int16_t offset_vec)

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

引数
*offset_vec

◆ setOmegaOffset_x()

void setOmegaOffset_x ( int16_t  offset_x)

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

引数
offset_x

◆ setOmegaOffset_y()

void setOmegaOffset_y ( int16_t  offset_y)

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

引数
offset_y

◆ setOmegaOffset_z()

void setOmegaOffset_z ( int16_t  offset_z)

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

引数
offset_z

◆ updateAK8963Data()

void updateAK8963Data ( )

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

  • mag_vec[3]
  • mag_vec_raw_int[3]
  • mag_vec_int[3]
  • ak8963ArrayData[6]
呼び出し関係図:

◆ updateMPU9250Data()

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]
呼び出し関係図:

◆ whoAmI()

void whoAmI ( void  )

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

引数
void
戻り値
void
呼び出し関係図:

◆ writeEEPROMOffsetAccInt()

void writeEEPROMOffsetAccInt ( int16_t vec)

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

引数
*vec加速度のオフセット値が格納されている配列
呼び出し関係図:

◆ writeEEPROMOffsetMagInt()

void writeEEPROMOffsetMagInt ( int16_t vec)

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

引数
*vec地磁気のオフセット値が格納されている配列
呼び出し関係図:

◆ writeEEPROMOffsetOmegaInt()

void writeEEPROMOffsetOmegaInt ( int16_t vec)

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

引数
*vec角速度のオフセット値が格納されている配列
呼び出し関係図:

変数詳解

◆ gain_LPF

volatile float gain_LPF = 0.8

◆ gain_str_LPF

volatile float gain_str_LPF = 0.1

◆ I2CMasterBuffer

volatile uint8_t I2CMasterBuffer[BUFSIZE]

◆ I2CReadLength

volatile uint32_t I2CReadLength

◆ I2CSlaveBuffer

volatile uint8_t I2CSlaveBuffer[BUFSIZE]

◆ I2CWriteLength

volatile uint32_t I2CWriteLength