5
Dependencies: mbed LCD_DISCO_F746NG MPU6050 BSP_DISCO_F746NG
main.cpp
- Committer:
- troshha
- Date:
- 2019-11-13
- Revision:
- 0:a3739a2e895d
File content as of revision 0:a3739a2e895d:
#include "mbed.h" #include "MPU6050.h" #include "LCD_DISCO_F746NG.h" #include "stm32746g_discovery_lcd.h" LCD_DISCO_F746NG lcd; DigitalOut myled(LED1); MPU6050 mpu(D14, D15); int main() { float GyroBuffer[3]; float zero_level[3] = {0, 0, 0}; uint8_t buffer[100]; lcd.Init(); lcd.DisplayStringAt(10, 10, (uint8_t*)"Gyros_star", CENTER_MODE); uint8_t tmpreg = 0; read(MPU6050_GYRO_CONFIG_REG,&tmpreg,1); switch(tmpreg & MPU6050_GYRO_XOUT_H_REG) { case MPU6050_GYRO_RANGE_250: lcd.DisplayStringAt(20, 20, (uint8_t*)"250", CENTER_MODE); break; case MPU6050_GYRO_RANGE_500: lcd.DisplayStringAt(20, 20, (uint8_t*)"500", CENTER_MODE); break; case MPU6050_GYRO_RANGE_2000: lcd.DisplayStringAt(20, 20, (uint8_t*)"2000", CENTER_MODE); break; } read(MPU6050_GYRO_YOUT_H_REG ,&tmpreg , 1); switch(tmpreg >> 6) { case 0: lcd.DisplayStringAt(20, 40, (uint8_t*)"", CENTER_MODE); break; case 1: lcd.DisplayStringAt(20, 40, (uint8_t*)"190", CENTER_MODE); break; case 2: lcd.DisplayStringAt(20, 40, (uint8_t*)"380", CENTER_MODE); break; case 3: lcd.DisplayStringAt(20, 40, (uint8_t*)"760", CENTER_MODE); break; } for (int i = 0; i < 50; i++) { mpu.getGyro(GyroBuffer); zero_level[0] += GyroBuffer[0] / 131; zero_level[1] += GyroBuffer[1] / 131; zero_level[2] += GyroBuffer[2] / 131; wait_ms(10); } for (int i = 0; i < 3; i++) zero_level[i] /= 50; float noise_level = 0.0; for (int i = 0; i < 50; i++) { mpu.getGyroRaw(GyroBuffer[0]); if ((GyroBuffer[0] / 131 - zero_level[0]) > noise_level) { noise_level = (GyroBuffer[0] / 131 - zero_level[0]); } else if ((GyroBuffer[0] / 131 - zero_level[0]) < -noise_level) { noise_level = -(GyroBuffer[0] / 131 - zero_level[0]); } wait_ms(10); } sprintf((char*)buffer, "Noise = %.2f\n", noise_level); lcd.DisplayStringAt(20, 70, buffer, CENTER_MODE); sprintf((char*)buffer, "Zero = %.2f\n", zero_level[0]); lcd.DisplayStringAt(20, 170, buffer, CENTER_MODE); float angle = 0.0, prev_value = 0.0; bool status1 = false, status2 = false; while(1) { // Read Gyroscope values wait(0.02); mpu.getGyroRaw(GyroBuffer); float value = GyroBuffer[0] / 131 - zero_level[0]; if (value >= noise_level || value <= -noise_level) { angle += (value + prev_value) / 2 * 0.02f ; } if (angle > 45.0){ status1 = true; }else if (angle < -45.0){ status2 = true; } else if (status1 == true && status2 == true){ sprintf((char*)buffer, "Angle = %.3f\n", angle); lcd.DisplayStringAt(20, 100, buffer, CENTER_MODE); lcd.DisplayStringAt(20, 120, (uint8_t*)"All Right", CENTER_MODE); } prev_value = value; sprintf((char*)buffer, "Angle = %.3f\n", angle); lcd.DisplayStringAt(20, 100, buffer, CENTER_MODE); } }