STM32F103C8驱动MPU6050姿态与tofsense报警 (六)

2024-01-17 06:28

本文主要是介绍STM32F103C8驱动MPU6050姿态与tofsense报警 (六),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

主函数



int main(void) 
{    
    //RCC_Configuration(); //时钟设置
    
    //BUZZER_BEEP1();//蜂鸣器音1
        //BUZZER_BEEP1();//蜂鸣器音1
    //delay_ms(50);
    SYS_Init();//系统初始化总函数
    while(1)   //主循环
    {
     // BUZZER_BEEP1();//蜂鸣器音1
        MPU_Read();    //MPU6050数据读取
        DATA_Report(); //MPU6050数据上报
    }
}
/**
  * @brief  系统初始化总函数
  * @param  无
  * @retval 无
  */
void SYS_Init(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组函数
    delay_init();                                     //延时函数初始化      
    uart_init(115200);                                  //串口初始化为115200
    LED_Init();                                            //初始化与LED连接的硬件接口
    BUZZER_Init();//蜂鸣器初始化
    
    MPU_Init();                                         //初始化MPU6050
    while(mpu_dmp_init())                            //初始化mpu_dmp库
     {
        LED1 = !LED1;delay_ms(50);LED1 = !LED1;     //LED闪烁指示
        printf("Initialization failed!\r\n");        //串口初始化失败上报
    }
    printf("Initialization succeed!\r\n");            //串口初始化成功上报
    delay_ms(999);                                    //延时初界面显示
    mpu6050.flag = 0;                               //采集成功标志位初始化
    mpu6050.speed = 0;                                //上报速度初始化
}
/**
  * @brief  MPU6050数据读取函数
  * @param  无
  * @retval 无
  */
void MPU_Read(void)
{
    
    if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)//dmp处理得到数据,对返回值进行判断
    { 
        temp=MPU_Get_Temperature();                    //得到温度值
        MPU_Get_Accelerometer(&aacx,&aacy,&aacz);    //得到加速度传感器数据
        MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);    //得到陀螺仪数据
        mpu6050.speed++;                            //上报速度自加
        if(mpu6050.speed == 4)                        //上报速度阈值设置
        {
            mpu6050.flag = 1;                        //采集成功标志位设置为有效
            mpu6050.speed = 0;                        //上报速度归零
        }    
    }
    else                                             //采集不成功                                        
    {
        mpu6050.flag = 0;                            //采集成功标志位设置为无效
    }    
}
/**
  * @brief  MPU6050数据上报
  * @param  无
  * @retval 无
  */
void DATA_Report(void)
{
    if(mpu6050.flag == 1)                        //采集成功时
    { 
        if(temp<0)                                //对数据正负判断,判断为负时
        {
            temp=-temp;                            //对负数据取反
        }
        else                                    //判断为正时
        {
        }
//        printf("temp:%d.%d,",temp/100,temp%10); //通过串口1输出温度
        
        temp=pitch*10;                             //赋temp为pitch
        if(temp<0)                                //对数据正负判断,判断为负时
        {
            temp=-temp;                            //对负数据取反        
        }
        else                                    //判断为正时 
        {
        }
            
        //printf("pitch:%d.%d,",temp/10,temp%10); //通过串口1输出pitch    
        printf("%d.%d,",temp/10,temp%10); //通过串口1输出pitch
        if (temp/10 >= 10 && temp/10 <= 30) 
        {  
            BUZZER_BEEP1();//蜂鸣器音1
        }
        temp=roll*10;                            //赋temp为roll
        if(temp<0)                                //对数据正负判断,判断为负时
        {
            temp=-temp;                            //对负数据取反    
        }
        else                                    //判断为正时
        {
        }
        if (temp/10 >= 5 && temp/10 <= 30) 
        {  
            BUZZER_BEEP1();//蜂鸣器音1
        }
        //printf("roll:%d.%d,",temp/10,temp%10);//通过串口1输出roll
        printf("%d.%d,",temp/10,temp%10);//通过串口1输出yaw    
        temp=yaw*10;                           //赋temp为yaw
        if(temp<0)                                //对数据正负判断,判断为负时
        {
            temp=-temp;                            //对负数据取反
        }
        else                                    //判断为正时
        {
        }
        //printf("yaw:%d.%d,",temp/10,temp%10);//通过串口1输出yaw    
        printf("%d.%d",temp/10,temp%10);//通过串口1输出roll
//        printf("gyrox:%d,gyroy:%d,gyroz:%d,aacx:%d,aacy:%d,aacz:%d\r\n",gyrox,gyroy,gyroz,aacx,aacy,aacz);//上报角速度数据,角加速度数据
            printf("\r\n");        
        LED1=!LED1;                                             //LED闪烁
        mpu6050.flag = 0;                                    //采集成功标志位设置为无效
    }
    else ;                                                        //防卡死
}

main.h

#include "stdio.h"//标准输入输出库
#include "string.h"//字符串库
#include "stdlib.h"//常用的系统函数库
#include "sys.h"//系统中断分组库
#include "delay.h"//延时函数库
#include "usart.h"//串口设置库
#include "led.h"//LED驱动库
#include "mpu6050.h"//MPU6050驱动库
#include "inv_mpu.h"//陀螺仪驱动库
#include "inv_mpu_dmp_motion_driver.h" //DMP姿态解读库
#include "buzzer.h"

char tmp_buf[33];            //字符串数组
float pitch,roll,yaw;         //欧拉角:俯仰角,偏航角,滚转角
short aacx,aacy,aacz;        //加速度传感器原始数据  angular acceleration
short gyrox,gyroy,gyroz;    //陀螺仪原始数据  gyroscope
short temp;                    //温度


struct MPU6050                //MPU6050结构体
{
    u8 flag;                //采集成功标志位
    u8 speed;                //上报速度
}mpu6050;                    //唯一结构体变量


int main(void);                //主函数
void SYS_Init(void);        //系统初始化总函数
void MPU_Read(void);        //MPU6050数据读取函数    
void DATA_Report(void);        //MPU6050数据上报    

这篇关于STM32F103C8驱动MPU6050姿态与tofsense报警 (六)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/615117

相关文章

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp

如何在Ubuntu上安装NVIDIA显卡驱动? Ubuntu安装英伟达显卡驱动教程

《如何在Ubuntu上安装NVIDIA显卡驱动?Ubuntu安装英伟达显卡驱动教程》Windows系统不同,Linux系统通常不会自动安装专有显卡驱动,今天我们就来看看Ubuntu系统安装英伟达显卡... 对于使用NVIDIA显卡的Ubuntu用户来说,正确安装显卡驱动是获得最佳图形性能的关键。与Windo

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

UMDF驱动安装

VS2013 + WDF8.1,UMDF驱动选择User Mode Driver,不要选User Mode Driver 2.0,否则Win7安装有问题,如图 另外,在驱动安装时不要忘记WUDFUpdate_<主版本号><次版本号>.dll文件,具体文件名在INF中查找。此文件可在WDF的安装目录中找到。注意:在WDF的安装目录中会有3个WUDFUpdate_xxx.dll文件,x86,x6