历史上的今天
返回首页

历史上的今天

今天是:2025年07月29日(星期二)

正在发生

2020年07月29日 | mpu6050六轴传感器msp430驱动程序

2020-07-29 来源:51hei

#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;

      

    }

    tempax += MPU6050_ACC_LAST_X;//累加

    tempay += MPU6050_ACC_LAST_Y;

    tempaz += MPU6050_ACC_LAST_Z;

    if(cnt_a==200)

推荐阅读

史海拾趣

Hong Kong X'Tals Ltd公司的发展小趣事
确保电源电压在LM122的允许范围内(4.5~40V),以避免损坏芯片。
Grande Electronics Ltd公司的发展小趣事
用另一个已知正常的遥控器去控制同一台设备,如果控制有效,则说明原遥控器可能存在故障。
Atlantic Microwave Ltd公司的发展小趣事

近年来,电子行业面临着技术更新迅速、市场竞争日益激烈等挑战。Atlantic Microwave Ltd公司敏锐地察觉到行业变革的趋势,及时调整了公司的战略方向。公司加大了对新兴技术的研发投入,积极拥抱数字化转型,优化生产流程和管理模式,提高了公司的运营效率和市场竞争力。

DUBILIER公司的发展小趣事

在电子行业的早期,DUBILIER公司以其卓越的技术创新能力脱颖而出。当时,市场上对高可靠性电子元件的需求日益增长,而DUBILIER公司凭借其独特的生产工艺和材料科学,成功研发出了一系列高性能的电阻器和电容器。这些产品不仅满足了市场的需求,还为公司赢得了良好的声誉。通过不断的技术创新,DUBILIER公司逐渐在电子行业中确立了其领导地位。

联智(Celfras)公司的发展小趣事

联智的半导体集成电路芯片研发及产业化项目是其发展历程中的又一重要里程碑。该项目总投资高达20亿元,分两期建设。一期项目将建设半导体集成电路模拟芯片封测生产线,预计年产量可达1.5亿颗。二期项目将研发更高功率有线无线融合一体化电源管理芯片和新一代A4WP远距离无线充电芯,同时布局物联网IoT芯片市场。这一项目的实施将进一步提升联智的技术实力和市场竞争力。

Dynastream公司的发展小趣事

随着技术的不断进步,Dynastream公司意识到要想在竞争激烈的市场中立足,必须不断创新。因此,公司加大了研发投入,致力于提高产品的性能和稳定性。经过数年的努力,Dynastream成功推出了一款具有革命性意义的产品——一款高精度、低功耗的个人监视传感器。这一产品的推出,不仅让Dynastream在市场上树立了良好的口碑,也为公司未来的发展奠定了坚实的基础。

问答坊 | AI 解惑

UC/OS在 320 2812 上的移植和研究

https://bbs.eeworld.com.cn/thread-77147-1-1.html 这里有更加详细的论文!…

查看全部问答>

常用运算放大器型号简介

常用运算放大器型号简介 好辛苦才找到,大家就给点辛苦费吧....…

查看全部问答>

SDK的安装问题

我安装的SDK为什么有的可以在EVC里看得到有的看不到?…

查看全部问答>

请问关于 RHAPSODY.V6.2 的问题

请问一下,有哪位大侠用过 vxworks下的建模软件I-LOGIX.RHAPSODY.V6.2,我在网上下了个这个软件,但结果不能安装,请问上怎么回事呢,我还有个6.0版本的,能安装,但结果却没有帮助文件,就没法学习怎么使用,也很恼火,请高手指点一下,我想学习在vxworks下 ...…

查看全部问答>

重金酬谢!!!!! 求破解手机 代码

重金酬谢!!!!! 求破解手机   代码 现在有个机型是CDMA的 原来是日文和英文 现在想改为法文或其他文字!~!!!!!!!! 芯片\"三洋高通\" 重金酬谢!!!!! 联系13681843776…

查看全部问答>

哪位配置过8962的CAN可以接收任意ID数据

想用CAN接收任意ID的数据,不知道哪位配置过,谢谢…

查看全部问答>

MDK编译提示错误

LedINT.c(36): warning:  #1-D: last line of file ends without a newline     每一个工程都有,为什么?…

查看全部问答>

USBASP制作不成功,希望高手帮忙!!!

半年内做了好几个手工板,一直没有成功,电路是按上面压缩包里做的,固件也是按照里边做的,下载的时候用的也是USBASP下载线下载的,但是插上电脑以后显示 [img]file:///C:/Users/Administrator.PC-20120816MPVV/AppData/Roaming/Tencent/Users/ ...…

查看全部问答>

SM5812-001传感器用51如何才能获得数据

请大家帮个忙看看这个传感器如何写驱动!我自己写了一下但是没有获得数据!我估计是我通信没做好!…

查看全部问答>