国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

模塊學(xué)習(xí)(二)——MPU6050

這篇具有很好參考價(jià)值的文章主要介紹了模塊學(xué)習(xí)(二)——MPU6050。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

去年電賽備賽期間,學(xué)的STM32標(biāo)準(zhǔn)庫,那一整個(gè)繁瑣直接給我勸退了,當(dāng)時(shí)學(xué)習(xí)MPU6050時(shí)就非常痛苦,代碼也看不懂,無非抄來抄去,然后就是編譯,改錯(cuò),編譯無窮盡也。最近參考野火的MPU6050代碼,將其移植到了MSP430f5529之上,今天分享出來。

1.重要性

MPU6050模塊對(duì)于不論平衡車還是四旋翼無人機(jī)的開發(fā)都是非常重要的一個(gè)模塊,除此之外,對(duì)于四輪小車的轉(zhuǎn)彎閉環(huán)控制也是至關(guān)重要的,因此備戰(zhàn)電賽控制類這是一個(gè)不可避開的模塊。該模塊包含陀螺儀和加速度傳感器,可以解算出其x,y,z三個(gè)方向的角度和各個(gè)方向的角速度,使用十分方便,此次并未采用官方的DMP庫。

2.代碼

廢話不多說,直接上代碼,調(diào)用即可。

/*
 * MPU6050.c
 *
 *  Created on: 2022年7月17日
 *      Author: S10
 */
#include "driverlib.h"
#include "mpu6050.h"

void ByteWrite6050(unsigned char REG_Address,unsigned char REG_data);
unsigned char ByteRead6050(unsigned char REG_Address);
int Get6050Data(unsigned char REG_Address);
void InitMPU6050();
float Mpu6050AccelAngle(char dir);
float Mpu6050GyroAngle(char dir);

///開啟信號(hào)
void IIC_start()
{
    SDA_OUT;
    SCL_OUT;
    SCL_HIGH;
    SDA_HIGH;
    __delay_cycles(10);
    SDA_LOW;
    __delay_cycles(10);
    SCL_LOW;
}
///停止信號(hào)
void IIC_stop()
{
    SDA_OUT;
    SCL_OUT;
    SDA_LOW;
    SCL_HIGH;
    __delay_cycles(10);
    SDA_HIGH;
    __delay_cycles(10);
}


//發(fā)送應(yīng)答信號(hào)(MCU=>||)
void SendACK(unsigned char ack)
{
    SDA_OUT;
    SCL_OUT;
    if(ack==1)
    {
        SDA_HIGH;
    }
    else if(ack==0)
    {
        SDA_LOW;
    }
    else
        return;
    SCL_HIGH;
    __delay_cycles(10);
    SCL_LOW;
    __delay_cycles(10);
}
接收應(yīng)答信號(hào)(||=>MCU)
unsigned char IIC_testACK()
{
    unsigned char a;
    SCL_OUT;
    SDA_IN;
//GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P8, GPIO_PIN2);
    SCL_HIGH;
    __delay_cycles(10);
    if(GPIO_getInputPinValue (GPIO_PORT_P8, GPIO_PIN2)==1)
    {
        a=1;
    }
    else
    {
        a=0;
    }

    SCL_LOW;
    __delay_cycles(10);
    SDA_OUT;
    return a;
}

///向IIC總線發(fā)送數(shù)據(jù)(MCU=>||)
void IIC_writebyte(unsigned char IIC_byte)
{
    unsigned char i;
    SDA_OUT;
    SCL_OUT;
//    SCL_LOW;
        for (i=0; i<8; i++)         //8位計(jì)數(shù)器
            {
                if((IIC_byte<<i)&0x80)
                {
                    SDA_HIGH;
                }
                else
                {
                    SDA_LOW;
                }

        __delay_cycles(10);
        SCL_HIGH;
        __delay_cycles(10);
        SCL_LOW;
//        __delay_cycles(10);
//        IIC_byte<<=1;
    }

    IIC_testACK();
}


IIC接收一個(gè)字節(jié)(||——>MCU)
unsigned char IIC_readebyte(void)
{
    unsigned char i,k=0;
    SDA_IN;
    GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P8, GPIO_PIN2);
    SCL_OUT;
    SCL_LOW;
    __delay_cycles(100);
    for(i=0;i<8;i++)
    {
        SCL_HIGH;
        k=k<<1;
        if(SDA)
            k|=1;
        SCL_LOW;
        __delay_cycles(100);
    }
    SDA_OUT;
    __delay_cycles(100);
    return k;
}


//**************************************
//向I2C設(shè)備寫入一個(gè)字節(jié)數(shù)據(jù)
//**************************************
void ByteWrite6050(unsigned char REG_Address,unsigned char REG_data)
{
    IIC_start();                  //起始信號(hào)
    IIC_writebyte(SlaveAddress);   //發(fā)送設(shè)備地址+寫信號(hào)
    IIC_writebyte(REG_Address);    //內(nèi)部寄存器地址,
    IIC_writebyte(REG_data);        //內(nèi)部寄存器數(shù)據(jù),
    IIC_stop();                   //發(fā)送停止信號(hào)
}
//**************************************
//從I2C設(shè)備讀取一個(gè)字節(jié)數(shù)據(jù)
//**************************************
unsigned char ByteRead6050(unsigned char REG_Address)
{
    unsigned char REG_data;
    IIC_start();                   //起始信號(hào)
    IIC_writebyte(SlaveAddress);     //發(fā)送設(shè)備地址+寫信號(hào)
    IIC_writebyte(REG_Address);      //發(fā)送存儲(chǔ)單元地址,從0開始
    IIC_start();                   //起始信號(hào)
    IIC_writebyte(SlaveAddress+1);  //發(fā)送設(shè)備地址+讀信號(hào)
    REG_data=IIC_readebyte();       //讀出寄存器數(shù)據(jù)
    SendACK(1);                //接收應(yīng)答信號(hào)
    IIC_stop();                    //停止信號(hào)
    return REG_data;
}
//**************************************
//合成數(shù)據(jù)
//**************************************
int Get6050Data(unsigned char REG_Address)
{
    char H,L;
    H=ByteRead6050(REG_Address);
    L=ByteRead6050(REG_Address+1);
    return (H<<8)+L;   //合成數(shù)據(jù)
}
//**************************************
//初始化MPU6050
//**************************************
void InitMPU6050()
{
    ByteWrite6050(PWR_MGMT_1, 0x00);  // 解除休眠狀態(tài)
    ByteWrite6050(SMPLRT_DIV, 0x07);  // 陀螺儀采樣率設(shè)置(125HZ)
    ByteWrite6050(CONFIG, 0x06);      // 低通濾波器設(shè)置(5HZ頻率)
    ByteWrite6050(GYRO_CONFIG, 0x18); // 陀螺儀自檢及檢測(cè)范圍設(shè)置(不自檢,16.4LSB/DBS/S)
    ByteWrite6050(ACCEL_CONFIG, 0x01); // 不自檢,量程2g
}

/*
**********************************************
**函數(shù)名  :float Mpu6050AccelAngle(int8 dir)
**函數(shù)功能:輸出加速度傳感器測(cè)量的傾角值
**            范圍為2g時(shí),換算關(guān)系:16384 LSB/g
**            角度較小時(shí),x=sinx得到角度(弧度), deg = rad*180/3.14
**            因?yàn)閤>=sinx,故乘以1.2適當(dāng)放大
**返回參數(shù):測(cè)量的傾角值
**傳入?yún)?shù):dir - 需要測(cè)量的方向
**           ACCEL_XOUT - X方向
**           ACCEL_YOUT - Y方向
**           ACCEL_ZOUT - Z方向
**********************************************
*/
float Mpu6050AccelAngle(char dir)
{
    float accel_agle; // 測(cè)量的傾角值
    float result; // 測(cè)量值緩存變量
    result = (float)Get6050Data(dir); // 測(cè)量當(dāng)前方向的加速度值,轉(zhuǎn)換為浮點(diǎn)數(shù)
    accel_agle = (result + MPU6050_ZERO_ACCELL)/16384; // 去除零點(diǎn)偏移,計(jì)算得到角度(弧度)
    accel_agle = accel_agle*1.2*180/3.14;     //弧度轉(zhuǎn)換為度

    return accel_agle; // 返回測(cè)量值
}

/*
**********************************************
**函數(shù)名  :float Mpu6050GyroAngle(int8 dir)
**函數(shù)功能:輸出陀螺儀測(cè)量的傾角加速度
**            范圍為2000deg/s時(shí),換算關(guān)系:16.4 LSB/(deg/s)
**返回參數(shù):測(cè)量的傾角加速度值
**傳入?yún)?shù):dir - 需要測(cè)量的方向
**           GYRO_XOUT - X軸方向
**           GYRO_YOUT - Y軸方向
**           GYRO_ZOUT - Z軸方向
**********************************************
*/
float Mpu6050GyroAngle(char dir)
{
    float gyro_angle;
    gyro_angle = (float)Get6050Data(dir);   // 檢測(cè)陀螺儀的當(dāng)前值
    gyro_angle = -(gyro_angle + MPU6050_ZERO_GYRO)/16.4;    //去除零點(diǎn)偏移,計(jì)算角速度值,負(fù)號(hào)為方向處理

    return gyro_angle; // 返回測(cè)量值
}


/*
 * MPU6050.h
 *
 *  Created on: 2022年7月17日
 *      Author: S10
 */

#ifndef MPU6050_H_
#define MPU6050_H_

//********Mpu6050的零點(diǎn)校準(zhǔn)值**************
#define MPU6050_ZERO_ACCELL 378
#define MPU6050_ZERO_GYRO 13
//*************定義MPU6050內(nèi)部地址*******************
#define SMPLRT_DIV      0x19    //輸出8位無符號(hào)位,輸出分頻,用來配置采樣頻率的寄存器。采樣率=陀螺儀的輸出率/(1+該寄存器值),低通濾波器使能時(shí)陀螺儀輸出為8k,反之1k。
#define CONFIG          0x1A    //配置低通濾波器的寄存器
#define GYRO_CONFIG     0x1B    //三個(gè)方向角度的自我測(cè)試和量程
#define ACCEL_CONFIG    0x1C    //三個(gè)方向加速度的自我測(cè)試和量程
/***************加速度傳感器寄存器******************/
#define ACCEL_XOUT_H            0x3B
#define ACCEL_XOUT_L            0x3C
#define ACCEL_XOUT      ACCEL_XOUT_H    // X軸讀取地址,高位為起始位
#define ACCEL_YOUT_H            0x3D
#define ACCEL_YOUT_L            0x3E
#define ACCEL_YOUT      ACCEL_YOUT_H    // Y軸讀取地址,高位為起始位
#define ACCEL_ZOUT_H            0x3F
#define ACCEL_ZOUT_L            0x40
#define ACCEL_ZOUT      ACCEL_ZOUT_H    // Z軸讀取地址,高位為起始位
/*****************溫度傳感器寄存器****************/
#define TEMP_OUT_H      0x41
#define TEMP_OUT_L      0x42
#define TEMP_OUT          TEMP_OUT_H    // 溫度傳感器讀取地址,高位為起始位
//
/陀螺儀相關(guān)寄存器//
//
#define GYRO_XOUT_H     0x43
#define GYRO_XOUT_L     0x44
#define GYRO_XOUT        GYRO_XOUT_H    // 陀螺儀X軸讀取地址,高位為起始位
#define GYRO_YOUT_H     0x45
#define GYRO_YOUT_L     0x46
#define GYRO_YOUT        GYRO_YOUT_H    // 陀螺儀Y軸讀取地址,高位為起始位
#define GYRO_ZOUT_H     0x47
#define GYRO_ZOUT_L     0x48
#define GYRO_ZOUT        GYRO_ZOUT_H    // 陀螺儀Z軸讀取地址,高位為起始位
///
其它寄存器/
//
#define PWR_MGMT_1      0x6B    //電源管理
#define WHO_AM_I        0x75    //6位iic地址,最后一位A0控制
//
///iic地址設(shè)置
/
#define SlaveAddress    0xD0    //A0接地,若接3.3v則0xD1

extern void ByteWrite6050(unsigned char REG_Address,unsigned char REG_data);
extern unsigned char ByteRead6050(unsigned char REG_Address);
extern int Get6050Data(unsigned char REG_Address);
extern void InitMPU6050();
extern float Mpu6050AccelAngle(char dir);
extern float Mpu6050GyroAngle(char dir);

#define    SCL_HIGH    P1OUT|=BIT2
#define    SCL_LOW     P1OUT&=~BIT2
#define    SDA_HIGH    P1OUT|=BIT3
#define    SDA_LOW     P1OUT&=~BIT3
#define    SDA_OUT     P1DIR|=BIT3
#define    SDA_IN      P1DIR&=~BIT3
#define    SCL_OUT     P1DIR|=BIT2
#define    SDA         P1IN&BIT3

void IIC_start();//開始
void IIC_stop();//停止
void SendACK(unsigned char ack);//向iic發(fā)送標(biāo)志
void IIC_writebyte(unsigned char IIC_byte);///接收iic標(biāo)志
unsigned char IIC_testACK();///發(fā)送數(shù)據(jù)
unsigned char IIC_readebyte();///接收數(shù)據(jù)

#endif /* MPU6050_H_ */

直接根據(jù)自己的需求更改模擬IIC的SCL和SDA引腳即可
需要注意的是IIC時(shí)序中的延時(shí),以上代碼是在主頻為16MHZ的條件下完成的。
文章來源地址http://www.zghlxwxcb.cn/news/detail-576754.html

到了這里,關(guān)于模塊學(xué)習(xí)(二)——MPU6050的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【嵌入式模塊】MPU6050

    【嵌入式模塊】MPU6050

    ??作為慣性傳感器中入門級(jí)別的器件,MPU6050憑借它出色的性價(jià)比成為一款非常常用的角度姿態(tài)傳感器,在很多科創(chuàng)項(xiàng)目中被使用。我之前也接觸過很多次這個(gè)器件,也收集了不少資料,趁此機(jī)會(huì)總結(jié)一下學(xué)習(xí)筆記。 ??MPU6050包含3軸陀螺儀和3軸加速度計(jì),其中陀螺儀的主

    2024年01月25日
    瀏覽(20)
  • 單片機(jī)開發(fā)教程3——串口發(fā)送MPU6050姿態(tài)角

    單片機(jī)開發(fā)教程3——串口發(fā)送MPU6050姿態(tài)角

    MPU6050 是 InvenSense 公司推出的整合性 6 軸運(yùn)動(dòng)處理組件,其內(nèi)部整合了 3 軸陀螺儀和 3 軸加速度傳感器,并且含有一個(gè)IIC 接口, 可用于連接外部磁力傳感器,并利用自帶的數(shù)字運(yùn)動(dòng)處理器(DMP: Digital Motion Processor) 硬件加速引擎,通過主 IIC 接口,向應(yīng)用端輸出完整的 9 軸融

    2024年02月14日
    瀏覽(23)
  • 【STM32】STM32學(xué)習(xí)筆記-軟件I2C讀寫MPU6050(33)

    【STM32】STM32學(xué)習(xí)筆記-軟件I2C讀寫MPU6050(33)

    I2C(Inter-Integrated Circuit)總線 是一種由NXP(原PHILIPS)公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。多用于主控制器和從器件間的主從通信,在小數(shù)據(jù)量場(chǎng)合使用,傳輸距離短,任意時(shí)刻只能有一個(gè)主機(jī)等特性。 串行的 8 位雙向數(shù)據(jù)傳輸位速率在標(biāo)準(zhǔn)模式下可

    2024年01月21日
    瀏覽(42)
  • 【STM32】STM32學(xué)習(xí)筆記-硬件I2C讀寫MPU6050(35)

    【STM32】STM32學(xué)習(xí)筆記-硬件I2C讀寫MPU6050(35)

    I2C(Inter-Integrated Circuit)總線是一種由NXP(原PHILIPS)公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。多用于主控制器和從器件間的主從通信,在小數(shù)據(jù)量場(chǎng)合使用,傳輸距離短,任意時(shí)刻只能有一個(gè)主機(jī)等特性。 串行的 8 位雙向數(shù)據(jù)傳輸位速率在標(biāo)準(zhǔn)模式下可

    2024年01月25日
    瀏覽(34)
  • 【ESP32Arduino+MPU6050姿態(tài)解算】自制無人機(jī)學(xué)習(xí)筆記2 PLatformIO 下載即可使用

    【ESP32Arduino+MPU6050姿態(tài)解算】自制無人機(jī)學(xué)習(xí)筆記2 PLatformIO 下載即可使用

    本人之前發(fā)表過一篇關(guān)于esp32讀取mpu6050數(shù)據(jù)的文章,鏈接:http://t.csdn.cn/AwzSZ,但其存在一些漏洞,具體表現(xiàn)在輸出數(shù)據(jù)存在不連貫和錯(cuò)誤,在mpu6050高速運(yùn)動(dòng)時(shí)存在較大誤差等。僅作為參考。故在此重發(fā)作為修正。當(dāng)前該篇文章中所述的模塊,已經(jīng)過無人機(jī)穩(wěn)定性控制的測(cè)試

    2024年02月16日
    瀏覽(21)
  • 【stm32】stm32學(xué)習(xí)筆記(江科大)-詳解stm32獲取Mpu6050陀螺儀和加速度

    【stm32】stm32學(xué)習(xí)筆記(江科大)-詳解stm32獲取Mpu6050陀螺儀和加速度

    目錄 I2C 起始條件: 終止條件: ?發(fā)送一個(gè)字節(jié) 接收一個(gè)字節(jié) ?接收發(fā)送應(yīng)答 ?代碼 I2C I2C.C I2C.h Mpu6050 Mpu6050.c Mpu6050.h Mpu6050Reg.h main.c 結(jié)果 ? 要想獲取Mpu6050陀螺儀和加速度那就需要了解一下Mpu6050。Mpu6050使用的是I2C通訊 先了解一下 起始條件: SCL高電平期間,SDA從高電平切換

    2024年02月16日
    瀏覽(19)
  • (Rockpi 4b使用心得),Python的smbus模塊,mpu6050等模塊的使用

    (Rockpi 4b使用心得),Python的smbus模塊,mpu6050等模塊的使用

    大家好,關(guān)于有些新手們買了rockpi4b,或者使用過樹莓派的在轉(zhuǎn)rockpi4b的過程中,使用Python中的smbus模塊會(huì)遇到很多錯(cuò)誤,而Python又因?yàn)槠渲械恼Z法特別簡(jiǎn)單的關(guān)系,所以受到了眾多程序員的擁戴,而這篇文章主要講的是使用rockpi4b的時(shí)候,和樹莓派之間又有什么不同。本人也

    2023年04月12日
    瀏覽(23)
  • STM32學(xué)習(xí)筆記(十)丨I2C通信(使用I2C實(shí)現(xiàn)MPU6050和STM32之間通信)

    STM32學(xué)習(xí)筆記(十)丨I2C通信(使用I2C實(shí)現(xiàn)MPU6050和STM32之間通信)

    ???本次課程采用單片機(jī)型號(hào)為STM32F103C8T6。(鑒于筆者實(shí)驗(yàn)時(shí)身邊只有STM32F103ZET6,故本次實(shí)驗(yàn)使基于ZET6進(jìn)行的) ???課程鏈接:江協(xié)科技 STM32入門教程 ??往期筆記鏈接: ??STM32學(xué)習(xí)筆記(一)丨建立工程丨GPIO 通用輸入輸出 ??STM32學(xué)習(xí)筆記(二)丨STM32程序調(diào)試

    2024年01月19日
    瀏覽(27)
  • 【STM32學(xué)習(xí)】——I2C通信協(xié)議&MPU6050姿態(tài)傳感器&軟件I2C讀寫MPU6050

    ? ? 目錄 前言 一、I2C通信協(xié)議 1.簡(jiǎn)介 2.硬件電路設(shè)計(jì) 3.I2C時(shí)序(軟件)

    2024年02月16日
    瀏覽(29)
  • STM32入門筆記(02):MPU6050、MPU9250、ICM20948及姿態(tài)解算(SPL庫函數(shù)版)

    STM32入門筆記(02):MPU6050、MPU9250、ICM20948及姿態(tài)解算(SPL庫函數(shù)版)

    【正點(diǎn)原子】 手把手教你學(xué)STM32 系列視頻之 STM32F4-基于探索者F407 DMP 讀取MPU6050角度數(shù)據(jù)以及匿名四軸飛控上位機(jī)介紹 STM32F103 DMP讀取MPU6050角度數(shù)據(jù) MPU6050是InvenSense公司( Invensense公司成立于2003年6月,總部位于美國Sunnyvale,主要生產(chǎn)的產(chǎn)品為運(yùn)動(dòng)感測(cè)追蹤組件。) 推出的全球首

    2024年02月01日
    瀏覽(36)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包