搜索
bottom↓
回复: 3

I2C 陀螺仪mpu6050 求大神指教

[复制链接]

出0入0汤圆

发表于 2014-7-7 18:33:39 | 显示全部楼层 |阅读模式
最近在做mpu6050,控制小车的转角。用的是DSP C2000,网上找的都是51的程序,移植后采的z轴角速度一直显示239...看网上说要初始化前要复位,但是不会...求大神指教啊。

我采用的是定时器中断,每1ms读取一次值。

#include "DSP28x_Project.h"
#include "GlobalVariable.h"
#include "math.h"

#define SCL GpioDataRegs.GPADAT.bit.GPIO6
#define SDA GpioDataRegs.GPADAT.bit.GPIO7
int CY;

//  GpioDataRegs.GPASET.bit.GPIO6
//  GpioDataRegs.GPACLEAR.bit.GPIO6



//**************************************
//I2C起始信号
//**************************************
void I2C_Start()
{
        GpioDataRegs.GPASET.bit.GPIO7 = 1;                    //拉高数据线
    GpioDataRegs.GPASET.bit.GPIO6 = 1;                    //拉高时钟线
    DELAY_US(5);                 //延时
    GpioDataRegs.GPACLEAR.bit.GPIO7 = 1;                    //产生下降沿
    DELAY_US(5);                 //延时
    GpioDataRegs.GPACLEAR.bit.GPIO6 = 1;                    //拉低时钟线
    DELAY_US(5);
}
//**************************************
//I2C停止信号
//**************************************
void I2C_Stop()
{
        GpioDataRegs.GPACLEAR.bit.GPIO7 = 1;                    //拉低数据线
        GpioDataRegs.GPASET.bit.GPIO6 = 1;                    //拉高时钟线
        DELAY_US(5);                 //延时
    GpioDataRegs.GPASET.bit.GPIO7 = 1;                    //产生上升沿
    DELAY_US(5);                 //延时
}
//**************************************
//I2C发送应答信号
//入口参数:ack (0:ACK 1:NAK)
//**************************************
void I2C_SendACK()
{
        GpioDataRegs.GPASET.bit.GPIO7 = 1;                  //写应答信号
    GpioDataRegs.GPASET.bit.GPIO6 = 1;                    //拉高时钟线
    DELAY_US(5);                 //延时
    GpioDataRegs.GPACLEAR.bit.GPIO6 = 1;                    //拉低时钟线
    DELAY_US(5);                 //延时
}
//**************************************
//I2C接收应答信号
//**************************************
void I2C_RecvACK()
{
        GpioDataRegs.GPASET.bit.GPIO7 = 1;                    //释放总线
        DELAY_US(5);                 //延时
        GpioDataRegs.GPASET.bit.GPIO6 = 1;                    //拉高时钟线
        DELAY_US(5);                 //延时
    CY = SDA;                   //读应答信号
        DELAY_US(5);                 //延时
    GpioDataRegs.GPACLEAR.bit.GPIO6 = 1;                    //拉低时钟线
    DELAY_US(5);                 //延时

}
//**************************************
//向I2C总线发送一个字节数据
//**************************************
void I2C_SendByte(Uchar dat)
{
    Uchar i,k;
    for (i=0; i<8; i++)         //8位计数器
    {
            k=dat & 128;
            if(k==128)
                    GpioDataRegs.GPASET.bit.GPIO7 = 1;
            else
                    GpioDataRegs.GPACLEAR.bit.GPIO7 = 1;  //送数据口
        DELAY_US(5);             //延时
            GpioDataRegs.GPASET.bit.GPIO6 = 1;                //拉高时钟线
        DELAY_US(5);             //延时
        GpioDataRegs.GPACLEAR.bit.GPIO6 = 1;                //拉低时钟线
        DELAY_US(5);             //延时
        dat <<= 1;              //移出数据的最高位
    }
    I2C_RecvACK();
}
//**************************************
//从I2C总线接收一个字节数据
//**************************************
Uchar I2C_RecvByte()
{
    Uchar i;
    Uchar dat = 0;
    GpioDataRegs.GPASET.bit.GPIO7 = 1;                    //使能内部上拉,准备读取数据,
    for (i=0; i<8; i++)         //8位计数器
    {
            GpioDataRegs.GPASET.bit.GPIO6 = 1;                //拉高时钟线
            DELAY_US(5);             //延时
            dat <<= 1;
            if(SDA)                                        //如果数据线为高平电平。
                    dat=dat|0x1;//则给缓冲字节的最低位写1。
        GpioDataRegs.GPACLEAR.bit.GPIO6 = 1;                //拉低时钟线
        DELAY_US(5);             //延时
    }
    return dat;
}
//**************************************
//向I2C设备写入一个字节数据
//**************************************
void Single_WriteI2C(Uchar REG_Address,Uchar REG_data)
{
    I2C_Start();                  //起始信号
    I2C_SendByte(SlaveAddress);   //发送设备地址+写信号
    I2C_SendByte(REG_Address);    //内部寄存器地址,
    I2C_SendByte(REG_data);       //内部寄存器数据,
    I2C_Stop();
}

//**************************************
//从I2C设备读取一个字节数据
//**************************************
Uchar Single_ReadI2C(Uchar REG_Address)
{
        Uchar REG_data;
        I2C_Start();                   //起始信号
        I2C_SendByte(SlaveAddress);    //发送设备地址+写信号
        I2C_SendByte(REG_Address);     //发送存储单元地址,从0开始
        I2C_Start();                   //起始信号
        I2C_SendByte(SlaveAddress+1);  //发送设备地址+读信号
        REG_data=I2C_RecvByte();       //读出寄存器数据
        I2C_SendACK();                //接收应答信号
        I2C_Stop();                    //停止信号
        return REG_data;
}
//**************************************
//初始化MPU6050
//**************************************
void InitMPU6050()
{
        Single_WriteI2C(PWR_MGMT_1, 0x00);        //解除休眠状态
        Single_WriteI2C(SMPLRT_DIV, 0x07);
        Single_WriteI2C(CONFIG, 0x06);
        Single_WriteI2C(GYRO_CONFIG, 0x18);
        Single_WriteI2C(ACCEL_CONFIG, 0x01);
}
//**************************************
//合成数据
//**************************************
int GetData(Uchar REG_Address)
{
        Uchar H,L;
        H=Single_ReadI2C(REG_Address);
        L=Single_ReadI2C(REG_Address+1);
        return (H<<8)+L;   //合成数据
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
interrupt void  TINT0_ISR(void)      // CPU-Timer 0
{
        float Angle = 0;
        CpuTimer0Regs.TCR.bit.TSS = 1; //0开始,1停止计数
        CpuTimer0Regs.TCR.bit.TRB = 1; //reload
        opaa=GetData(GYRO_ZOUT_H);

        Angle =Angle+( opaa * 1000 * 3.3 * 1.0 / (2 * 1024));//AD每读数实际角速度值 传感器资料为2mv为1度/秒
//        Angle = Angle / 1000;//每1ms取一次数据,每次取的角速度单为1000ms/度,1000/1=1000,积分后的角度需除以50,如要提高分辨率,需把此值放大,即采集时间间隔缩小
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-8-10 21:21:20 | 显示全部楼层
同求啊,坛友

出0入0汤圆

发表于 2014-8-19 17:00:46 | 显示全部楼层
软的I2C很好调的。你注意下引脚定义这些是否正确

出0入0汤圆

发表于 2014-8-19 17:21:26 | 显示全部楼层
为啥不用硬件IIC呢?你是用的2812?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-18 19:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表