123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- #include "bexus_mpu.h"
- int32_t *rawTemp;
- double accelScale = 16384;
- double gyroScale = 131.072;
- double *tempMpu;
- struct vector_Uint *rawAccel, *rawGyro;
- struct vector *hMeas;
- struct vector *gSens;
- void Mpu_Init() {
- if(HAL_I2C_IsDeviceReady(&hi2c2,MPU_ADDR,3,20)==HAL_OK){
- //HAL_GPIO_WritePin(GPIOB,GPIO_PIN_7,1);
- }
- //Sleepmode Beenden
- ConfigMpu(0x6B, 0x01);
-
- //Konfigurieren
- // ConfigMpu(0x1A, 0x05);//Low-Pass-Filter Config
- // ConfigMpu(0x1B, 0x00<<3);//Gyros Config
- // ConfigMpu(0x1C, 0x00<<3);//Achsel Config
-
- ConfigMpu(0x1C, 0x00 << 3);//Achsel Config 2G
- ConfigMpu(0x1B, 0x00 << 3);//Gyros Config 250°/s
- ConfigMpu(0x1A, 0x04);//Low-Pass-Filter Config 20Hz LowPass
-
-
- }
- int Bexus_Mpu_Read() {
- rawAccel = &Dataset_Master[buff_sensor_data_index].accel_raw;
- rawGyro = &Dataset_Master[buff_sensor_data_index].gyro_raw;
- rawTemp = &Dataset_Master[buff_sensor_data_index].temperature_mpu_raw;
-
-
- hMeas = &Dataset_Master[buff_sensor_data_index].accel;
- gSens = &Dataset_Master[buff_sensor_data_index].gyro;
- tempMpu = &Dataset_Master[buff_sensor_data_index].temperature_mpu;
-
- //Auslesen
- //Beschleunigungssensor
- rawAccel->x = recvIntFromMpu(MPU_ADDR_ACCEL);
- rawAccel->y = recvIntFromMpu(MPU_ADDR_ACCEL+2);
- rawAccel->z = recvIntFromMpu(MPU_ADDR_ACCEL+4);
-
- //Gyrosensor
- rawGyro->x = recvIntFromMpu(MPU_ADDR_GYRO);
- rawGyro->y = recvIntFromMpu(MPU_ADDR_GYRO+2);
- rawGyro->z = recvIntFromMpu(MPU_ADDR_GYRO+4);
- //Temperatur
- *rawTemp=recvIntFromMpu(0x41);
-
- //*tempMpu = ((*rawTemp-0xFFFF0000)/340+36.53)/10;
- *tempMpu = (double)((*rawTemp*1.)/340+36.53);
-
- //berechnen
- /*
- accel->x = RAD_TO_DEG * atan(rawAccel->x / sqrt(pow(rawAccel->y, 2) + pow(rawAccel->z, 2)));
- accel->y = RAD_TO_DEG * atan(rawAccel->y / sqrt(pow(rawAccel->x, 2) + pow(rawAccel->z, 2)));
- accel->z = RAD_TO_DEG * atan(sqrt(pow(rawAccel->y,2) + pow(rawAccel->x,2)) / rawAccel->z);
- */
- #ifdef BOARD_HAS_ETHERNET //vertical
-
- hMeas->x = - rawAccel->x / accelScale + 0.0326;
- hMeas->y = - rawAccel->z / accelScale - 0.13;
- hMeas->z = - rawAccel->y / accelScale + 0.;
-
- gSens->x = - rawGyro->x/gyroScale - 3.0823; // °/s
- gSens->y = - rawGyro->z/gyroScale + 0.0824;
- gSens->z = - rawGyro->y/gyroScale + 0.336;
- #else //horizontal
- hMeas->x = - rawAccel->x / accelScale + 0.03;
- hMeas->y = - rawAccel->y / accelScale - 0.0;
- hMeas->z = + rawAccel->z / accelScale + 0.126;
-
- gSens->x = - rawGyro->x/gyroScale - 3.014; // °/s
- gSens->y = - rawGyro->y/gyroScale + 0.633;
- gSens->z = + rawGyro->z/gyroScale - 0.496;
- #endif
- return HAL_OK;
- }
- int sendByteToMpu(uint8_t* data, uint8_t len) {
- if(HAL_OK != HAL_I2C_Master_Transmit(&hi2c2,MPU_ADDR,data,len,25)) return HAL_ERROR;
- return HAL_OK;
- }
- void ConfigMpu(uint8_t reg, uint8_t data) {
- uint8_t butt_temp[2]={reg,data};
- sendByteToMpu(butt_temp, 2);
- //sendByteToMpu(&data, 1);
- }
- uint8_t recvByteFromMpu(uint8_t reg) {
- uint8_t buf[1];
- if (HAL_OK ==sendByteToMpu(®, 1))
- HAL_I2C_Master_Receive(&hi2c2,MPU_ADDR,buf,1,20);
-
- return buf[0];
- }
- int16_t recvIntFromMpu(uint8_t reg) {
- uint8_t buf[2];
- if (HAL_OK ==sendByteToMpu(®, 1))
- HAL_I2C_Master_Receive(&hi2c2,MPU_ADDR,&buf[0],1,25);
-
- reg++;
- if (HAL_OK ==sendByteToMpu(®, 1))
- HAL_I2C_Master_Receive(&hi2c2,MPU_ADDR,&buf[1],1,25);
-
- return (int16_t)(buf[1] | (buf[0] << 8));
- }
|