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

这篇具有很好参考价值的文章主要介绍了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数据上报    文章来源地址https://www.toymoban.com/news/detail-796777.html

到了这里,关于STM32F103C8驱动MPU6050姿态与tofsense报警 (六)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32F103C8T6(HAL库)驱动舵机

    常见的舵机分为360°和180°两种,本次对180°舵机进行驱动,舵机驱动需要通过PWM信号进行驱动。本文通过定时器中的PWM信号设定使得SG90舵机进行不同角度的转动。 对于舵机的驱动,需要20ms的脉冲,高电平时间在0.5ms-2.5ms区间即可控制舵机在0-180°角度进行转动。常见角度对应

    2024年02月05日
    浏览(45)
  • STM32F103C8T6继电器驱动篇

    由于设计的东西是一个电机,但是stm32端口输出电流太小,所以采用继电器控制,通过实际接线测试发现,单片机的IO口驱动不了继电器,当继电器接到IO口上时,端口电压会将至2.2V左右,更加驱动不了继电器了。 所以,为了可以驱动继电器,重新设计了电路,通过三极管来

    2024年02月12日
    浏览(51)
  • STM32F103C8T6驱动LCD1602液晶篇

    1 电路连接 LCD1602有5V供电和3.3V供电,此次采用3.3V供电。 LCD1602共有16个引脚,不做一一介绍,其中主要的是第3引脚,3.3V背光电源供电时,接100-1K电阻,5V供电时,接2k-4.7k电阻。其余正常连接就行。 2 遇到的问题 2.1 液晶不显示 仿真验证时可以显示的,但是实物连接后还是不

    2024年02月07日
    浏览(44)
  • STM32驱动串口屏,STM32F103C8T6串口发送指令控制HMI串口屏

    串口屏是一个集成了单片机的屏幕模块,采用的是TTL串口协议,可以直接通过对应指令控制屏幕, 本文采用的串口屏是陶晶驰T0系列的基本型,目的是通过单片机的串口来控制串口屏 上面仅是一部分常用的基础指令,更多更仔细的指令或者函数可以访问陶晶驰资料官网。 硬

    2024年02月13日
    浏览(49)
  • Qt实现安卓手机蓝牙通信并控制stm32f103c8t6驱动VFD屏

    Qt具有跨平台的特性所以非常适合写通信的demo,但是在这个例程中Qt蓝牙部分不支持Windows平台,安卓平台使用没问题。 Qt蓝牙主要涉及到三个类的使用: QBluetoothDeviceDiscoveryAgent //扫描周围蓝牙设备 QBluetoothLocalDevice //扫描本地蓝牙 QBluetoothSocket //建立蓝牙的socket读写 安卓不支

    2024年02月08日
    浏览(55)
  • 直流减速编码电机的使用(STM32f103c8t6)L298N电机驱动模块

    直接减速电机就是在直流电机上加上霍尔编码器,霍尔编码器可用于电机转动的测速,A、B相会产生相位相差90°的方波信号。stm32可以使用硬件资源或者软件模拟来捕获编码器信号。这里我介绍的是stm32自带的编码器模式来使用直流减速电机。 以下是直流减速电机的商品图 ​

    2024年02月13日
    浏览(61)
  • STM32F103C8T6—库函数应用I2C/SPI驱动OLED显示中文、字符串

    I2C(Inter-Integrated Circuit) SPI(Serial Peripheral Interface) 传输方式 半双工 全双工 传输速度 低速,100Kbps----4Mbps 高速,30Mbps以上 几线制 4线制:VCC,GND,SCL,SDA 6/7线制:VCC,GND,SCLK(D0),MOSI(D1/SDA),DC,CS/SS 主从模式 多主机总线,通过SDA上的地址信息锁定从机 只有一个主机,主

    2024年02月02日
    浏览(62)
  • stm32f103VET6和stm32f103c8t6有什么区别?

    我来终结下这个问题。 这两款单片机我都用过,其中无际单片机特训营其中一款wifi报警主机项目就是用了stm32f103c8t6。  stm32f103VET6和stm32f103c8t6都是STMicroelectronics公司推出基于ARM Cortex-M3内核的单片机。 它们在硬件规格和性能上存在一些差异,下面我详细讲解下它们的差异之处

    2024年02月15日
    浏览(66)
  • STM32F103C8T6板子介绍

    STM32简介 STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器 STM32常应用在嵌入式领域,如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品等 STM32功能强大、性能优异、片上资源丰富、功耗低,是一款经典的嵌入式微控制器。  STM32F103C8T6 F1XX片上资源

    2024年02月11日
    浏览(57)
  • 功耗测评 | STM32F103C8T6

    STM32F103C8T6 MCU越来越广泛的应用在生产生活的各个领域,外接丰富的传感器、功能模块、通信模块、显示存储等可以形成各种可样的产品项目应用。对于功耗要求比较高的产品,一般会选择STM32L系列的MCU,但是从功耗的评测角度,逻辑上是基本相似的。 在很多应用场合中都对

    2024年02月07日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包