mpu6050六轴传感器msp430驱动程序

2020-07-29来源: 51hei关键字:mpu6050  六轴传感器  msp430驱动

#include

#include"mpu6050.h"

#include "USCI_A0.h"

#include "IMU.h "

/*

*  ======== BCSplus_graceInit ========

*  Initialize MSP430 Basic Clock System

*/

void BCSplus_graceInit(void)

{

    /* USER CODE START (section: BCSplus_graceInit_prologue) */

    /* User initialization code */

    /* USER CODE END (section: BCSplus_graceInit_prologue) */


    /*

     * Basic Clock System Control 2

     *

     * SELM_0 -- DCOCLK

     * DIVM_0 -- Divide by 1

     * ~SELS -- DCOCLK

     * DIVS_1 -- Divide by 2

     * ~DCOR -- DCO uses internal resistor

     *

     * Note: ~ indicates that has value zero

     */

    BCSCTL2 = SELM_0 | DIVM_0 | DIVS_1;


    if (CALBC1_16MHZ != 0xFF) {

        /* Adjust this accordingly to your VCC rise time */

        __delay_cycles(100000);


        /* Follow recommended flow. First, clear all DCOx and MODx bits. Then

         * apply new RSELx values. Finally, apply new DCOx and MODx bit values.

         */

        DCOCTL = 0x00;

        BCSCTL1 = CALBC1_16MHZ;     /* Set DCO to 16MHz */

        DCOCTL = CALDCO_16MHZ;

    }


    /*

     * Basic Clock System Control 1

     *

     * XT2OFF -- Disable XT2CLK

     * ~XTS -- Low Frequency

     * DIVA_0 -- Divide by 1

     *

     * Note: ~XTS indicates that XTS has value zero

     */

    BCSCTL1 |= XT2OFF | DIVA_0;


    /*

     * Basic Clock System Control 3

     *

     * XT2S_0 -- 0.4 - 1 MHz

     * LFXT1S_0 -- If XTS = 0, XT1 = 32768kHz Crystal ; If XTS = 1, XT1 = 0.4 - 1-MHz crystal or resonator

     * XCAP_1 -- ~6 pF

     */

    BCSCTL3 = XT2S_0 | LFXT1S_0 | XCAP_1;


    /* USER CODE START (section: BCSplus_graceInit_epilogue) */

    /* User code */

    /* USER CODE END (section: BCSplus_graceInit_epilogue) */

}/*

* main.c

*/

int main(void)

{

    WDTCTL = WDTPW | WDTHOLD;        // Stop watchdog timer

    BCSplus_graceInit();        //MCLK = 16M,SMCLK = 8M,ack =32.768k

    WDTCTL = WDTPW | WDTTMSEL | WDTIS0;

    IE1 |= WDTIE;

    USCI_A0_init();             //uart 38400bps  

    P1DIR |= BIT0;              //initialize led control PIN

    _EINT();

    MPU6050_Init();             //initialize mpu6050

   

    while(1)

    {

      /*

      Get_Attitude();

     //MPU6050_Dataanl();

     // ReadMPU6050All();

     //Prepare_Data();             //耗时6.15ms

     //Uart1_Send_AF();             //耗时8.42ms

     P1OUT ^= BIT0;

     Get_Attitude();

     //ReadMPU6050All();

     //MPU6050_Dataanl();         //未使用多字节读取,耗时6ms,使用多字节读取,耗时3.6ms

     //Prepare_Data();

    // Uart1_Send_AF();

     P1OUT ^= BIT0;

     */

    }

   

}


//watchdog interrupt server program per 1ms

#pragma vector=WDT_VECTOR

__interrupt void WDT_ISR_HOOK(void)

{

    /* USER CODE START (section: WDT_ISR_HOOK) */

    /* replace this comment with your code */

    static unsigned int count=0;

    static unsigned char ms2 = 0,ms5 = 0,ms10 = 0;

    count++;

    ms2++;

    ms5++;

    ms10++;

   

    if(ms2 == 2)

    {

     ms2 = 0;

     Prepare_Data();

     //MPU6050_Dataanl();

    }

    if(ms5 >= 4)

    {

      ms5 = 0;

      Get_Attitude();

   

    }

    if(ms10 >= 10)

    {

      ms10 = 0;

      Uart1_Send_AF();

    }

    if(count== 200)

    {

      count=0;

      P1OUT ^= BIT0;

    }


        /* USER CODE END (section: WDT_ISR_HOOK) */

}




/*

* This file contains some mpu6050 operation.

* By IC爬虫 (1394024051@qq.com)

* 2014-4-13 v1.0

*/

#include "mpu6050.h"


unsigned char   mpu6050_buffer[14];     //I2C读取后存放数据


int ACC_OFFSET_X,ACC_OFFSET_Y,ACC_OFFSET_Z;

int GYRO_OFFSET_X,GYRO_OFFSET_Y,GYRO_OFFSET_Z;


unsigned char        GYRO_OFFSET_OK = 1;

unsigned char        ACC_OFFSET_OK = 1;


int MPU6050_ACC_LAST_X,MPU6050_ACC_LAST_Y,MPU6050_ACC_LAST_Z;    //final accelerate speed

int MPU6050_GYRO_LAST_X,MPU6050_GYRO_LAST_Y,MPU6050_GYRO_LAST_Z; //final  gyro  speed


/**********************************************************/

//函数名称:void MPU6050_Dataanl

//入口参数:无

//出口参数:无

//函数功能:MPU6050数据读取并处理

/**********************************************************/

void MPU6050_Dataanl(void)

{

#ifndef READALL

  MPU6050_ACC_LAST_X = GetAccelX() - ACC_OFFSET_X;

  MPU6050_ACC_LAST_Y = GetAccelY() - ACC_OFFSET_Y;

  MPU6050_ACC_LAST_Z = GetAccelZ() - ACC_OFFSET_Z;

  

  MPU6050_GYRO_LAST_X = GetAnguX() - GYRO_OFFSET_X;

  MPU6050_GYRO_LAST_Y = GetAnguY() - GYRO_OFFSET_Y;

  MPU6050_GYRO_LAST_Z = GetAnguZ() - GYRO_OFFSET_Z;

  //------------------------------------------------------------------//

  //补偿偏移

  if(!GYRO_OFFSET_OK)

  {

    static long int tempgx=0,tempgy=0,tempgz=0;

    static unsigned char cnt_g=0;


    if(cnt_g==0)

    {

      GYRO_OFFSET_X=0;

      GYRO_OFFSET_Y=0;

      GYRO_OFFSET_Z=0;

      tempgx = 0;

      tempgy = 0;

      tempgz = 0;

      cnt_g = 1;

    }

    tempgx+= MPU6050_GYRO_LAST_X;

    tempgy+= MPU6050_GYRO_LAST_Y;

    tempgz+= MPU6050_GYRO_LAST_Z;

    if(cnt_g==200)

    {

      GYRO_OFFSET_X=tempgx/cnt_g;

      GYRO_OFFSET_Y=tempgy/cnt_g;

      GYRO_OFFSET_Z=tempgz/cnt_g;

      cnt_g = 0;

      GYRO_OFFSET_OK = 1;

      

    }

    cnt_g++;

  }

  if(!ACC_OFFSET_OK)

  {

    static long int tempax=0,tempay=0,tempaz=0;

    static unsigned char cnt_a=0;

   

    if(cnt_a==0)

    {

      ACC_OFFSET_X = 0;

      ACC_OFFSET_Y = 0;

      ACC_OFFSET_Z = 0;

      tempax = 0;

      tempay = 0;

      tempaz = 0;

      cnt_a = 1;

      

    }

    tempax += MPU6050_ACC_LAST_X;//累加

    tempay += MPU6050_ACC_LAST_Y;

    tempaz += MPU6050_ACC_LAST_Z;

    if(cnt_a==200)

    {

      ACC_OFFSET_X = tempax/cnt_a;

      ACC_OFFSET_Y = tempay/cnt_a;

      ACC_OFFSET_Z = tempaz/cnt_a;

      cnt_a = 0;

      ACC_OFFSET_OK = 1;

      

    }

    cnt_a++;

  }

  //--------------------------------------------//

#else

struct MPU6050Struct *MPU6050WORK;

  MPU6050WORK = ReadMPU6050All();

  MPU6050_ACC_LAST_X = (MPU6050WORK ->MPU6050_ACC_X) - ACC_OFFSET_X;

  MPU6050_ACC_LAST_Y = (MPU6050WORK ->MPU6050_ACC_Y) - ACC_OFFSET_Y;

  MPU6050_ACC_LAST_Z = (MPU6050WORK ->MPU6050_ACC_Z) - ACC_OFFSET_Z;

  

  MPU6050_GYRO_LAST_X = (MPU6050WORK ->MPU6050_GYRO_X) - GYRO_OFFSET_X;

  MPU6050_GYRO_LAST_Y = (MPU6050WORK ->MPU6050_GYRO_Y) - GYRO_OFFSET_Y;

  MPU6050_GYRO_LAST_Z = (MPU6050WORK ->MPU6050_GYRO_Z) - GYRO_OFFSET_Z;


  if(!GYRO_OFFSET_OK)

  {

    static long int tempgx=0,tempgy=0,tempgz=0;

    static unsigned char cnt_g=0;


    if(cnt_g==0)

    {

      GYRO_OFFSET_X=0;

      GYRO_OFFSET_Y=0;

      GYRO_OFFSET_Z=0;

      tempgx = 0;

      tempgy = 0;

      tempgz = 0;

      cnt_g = 1;

    }

    tempgx+= MPU6050_GYRO_LAST_X;

    tempgy+= MPU6050_GYRO_LAST_Y;

    tempgz+= MPU6050_GYRO_LAST_Z;

    if(cnt_g==200)

    {

      GYRO_OFFSET_X=tempgx/cnt_g;

      GYRO_OFFSET_Y=tempgy/cnt_g;

      GYRO_OFFSET_Z=tempgz/cnt_g;

      cnt_g = 0;

      GYRO_OFFSET_OK = 1;

      

    }

    cnt_g++;

  }

  if(!ACC_OFFSET_OK)

  {

    static long int tempax=0,tempay=0,tempaz=0;

    static unsigned char cnt_a=0;

   

    if(cnt_a==0)

    {

      ACC_OFFSET_X = 0;

      ACC_OFFSET_Y = 0;

      ACC_OFFSET_Z = 0;

      tempax = 0;

      tempay = 0;

      tempaz = 0;

      cnt_a = 1;

      

}

[1] [2] [3] [4] [5]
关键字:mpu6050  六轴传感器  msp430驱动 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic504672.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:关于低功耗msp430PID控制电机转速的C程序
下一篇:msp430F149测电压显示在12864上外接一个led

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32 实现 MPU6050 数据读取与倾角检测
前言MPU6050 是一个很好玩传感器,在四轴、体感、计步等应用领域都能看到这小芯片的影子,其内部的结构、功能十分丰富,可玩度非常高。同时,对传感器采集到的数据进行分析还能得到许多信息,但此时的一些「数学小技巧」或许会让你抓狂,所以你会在网上疯狂查找资料,最终发现了本文。然而很可惜,笔者也是一名数学渣渣(买东西找零都不会算的那种),所以这篇文章并不能教会你「卡尔曼滤波」、「协方差阵列」等连我自己都不懂的东西。事实上如果你只是想从传感器读出陀螺仪和加速度值,并简单计算一下坐标倾角(不涉及姿态解算、四元素等),其实没有想象中那么难。PS:MPU6050 的确涉及到许多令人敬畏的数学知识,但如果只是想得到「简陋」的坐标夹角,完全没必要
发表于 2020-02-10
STM32 实现 <font color='red'>MPU6050</font> 数据读取与倾角检测
51单片机+MPU6050驱动程序,1602显示
想做滚球控制系统,先写了个MPU6050驱动看看单片机源程序如下:#include <REG52.H>#include <math.h>    //Keil library#include <stdio.h>   //Keil library#include <INTRINS.H>typedef unsigned char  uchar;typedef unsigned short ushort;typedef unsigned int   uint
发表于 2019-12-10
51单片机+<font color='red'>MPU6050</font>驱动程序,1602显示
基于ARM7 ADUC7020+MPU6050的计步算法
单片机源程序如下:/*********************************************************************Author        : J ScarlettDate          : Nov 2006Files          : main.c, display.c, ped.cHardware      : ADuC7020Description   : Implements a si
发表于 2019-10-15
第44章 MPU6050传感器—姿态检测—零死角玩转STM32-F429系列
本章参考数据:《STM32F4xx参考手册》、《STM32F4xx规格书》、库说明文档《stm32f4xx_dsp_stdperiph_lib_um.chm》。关于MPU6050的参考资料:《MPU-60X0寄存器》、《MPU6050数据手册》以及官方驱动《motion_driver_6.12》。本章讲解的内容跨领域的知识较多,若您感兴趣,请自行查阅各方面的资料,对比学习。44.1 姿态检测1.    基本认识在飞行器中,飞行姿态是非常重要的参数,见图 441,以飞机自身的中心建立坐标系,当飞机绕坐标轴旋转的时候,会分别影响偏航角、横滚角及俯仰角。图 441 表示飞机姿态的偏航角、横滚角及俯仰角假如我们知道飞机
发表于 2019-09-19
第44章 <font color='red'>MPU6050</font>传感器—姿态检测—零死角玩转STM32-F429系列
mpu6050 +STM32 休眠唤醒问题+低功耗
这几天在调STM32+MPU6050实现   低功耗唤醒功功能描述: 1.  平时没有数据的时候,mcu处于 stop模式下,2.  利用RTC实现定时唤醒,3.以上功能中已经实现 mcu低功耗唤醒      及RTC定时唤醒。下一步要尝试   mpu6050 有数据时唤醒单片机,平时单片机处于低功耗状态如果有朋友也在做  mpu6050低功耗唤醒单片机的功能希望能够一起交流。这里附上qq :1812669090  如果 要低功耗  和定时唤醒的代码欢迎和我联系首先说一下STM32低功耗模式这张表意
发表于 2019-09-10
<font color='red'>mpu6050</font> +STM32 休眠唤醒问题+低功耗
村田“智”造:建设高效、安全的智慧出行场景
(以下简称“村田”)以“村田‘智’造,互联万物”为主题,盛装亮相本届展会,带来村田在智慧出行、5G 通信、智慧工厂等多个领域的创新成果,吸引了众多观众及媒体的注意。 2020 慕尼黑上海电子展村田展台智慧出行场景新趋势在智慧出行部分,村田在现场展示了 MEMS 传感器、硅电容、电容电感、陶瓷 / 晶体谐振器、车载通信模块等十余款创新产品,驱动汽车的智能化、网联化、电动化发展,并提高汽车安全水平。 其中,村田 6 轴惯性传感器 -SCHA600 和第 3 代组合传感器 -SCC3000 两款新产品吸引了不少观众驻足。 SCHA600 系列 6 轴惯性传感器据现场工程师介绍,村田 SCHA600 系列
发表于 2020-07-12
村田“智”造:建设高效、安全的智慧出行场景
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved