first_mouse 发表于 2011-7-26 11:21:35

与角速率传感器ITG3200通信不知道对不对啊?

我的与角速率传感器能够通信,但是我不知道是什么回事的,读回来的数据显示的很是有问题。。。已经检查很久,不知道是什么问题,在此虚心的向大家请教了。。。00003
00009
00002
00000
65536
00000
00000
65536
65536
00009
65536
00000
00000
00000
00000
00002
00000
00002
65536
65536
00000
65536
00002
00000
00000
这个采集回来的数据,显示达到最大值,不知道是这么回事啊????

first_mouse 发表于 2011-7-26 11:24:40

这个是对寄存器进行配置
WriteITG3200Byte(0x80,PWR_M_AD);//reset to deaults
WriteITG3200Byte(0x04,SMPL_AD);//DIV4
WriteITG3200Byte(0x12,DLPF_AD);//Reserved ,1KHz,98Hz
WriteITG3200Byte(0x05,INT_C_AD);
WriteITG3200Byte(0x00,PWR_M_AD);
/***********************IIC通信*****************

#include "includes.h"
/***************************************************************************
初始化IIC
***************************************************************************/
void InitIIC()
{
        IIC_DIR |= IIC_SCL;//SCL管脚为输出
        IIC_DIR &= ~IIC_SDA; //SDA管脚为输入
        C_SCL;
        Stop();
}
/***************************************************************************
进行短暂的延时,原因速度比较快。
***************************************************************************/
void delay()
{
        unsigned char q0;
        for(q0=0;q0<20;q0++)
        {
                _NOP();
        }
}

/***************************************************************************
启动IIC总线
***************************************************************************/
void Start()
{
        SDA_OUT;
        S_SDA;
        delay();
        S_SCL;
        delay();
        C_SDA;
        delay();
        C_SCL;
        delay();
}

/***************************************************************************
停止操作,释放IIC总线
***************************************************************************/
void Stop()
{
        SDA_OUT;
        C_SCL;
        delay();
        C_SDA;
        delay();
        S_SCL;
        delay();
        S_SDA;
        delay();
}

/***************************************************************************
IIC总线应答
***************************************************************************/
void Ack()
{
        SDA_OUT;
        C_SDA;
        delay();
        S_SCL;
        delay();
        C_SCL;
        delay();
        S_SDA;
}

/***************************************************************************
IIC总线无应答
***************************************************************************/
void NoAck()
{
        SDA_OUT;
        S_SDA;
        delay();
        S_SCL;
        delay();
        C_SCL;
        delay();
}

/***************************************************************************
IIC总线检验应答
返回值:IIC应答位的值0:应答   1:无应答
***************************************************************************/
unsigned char TestAck()
{
        unsigned char ack;

        S_SCL;
        delay();
        SDA_IN;
        delay();
        ack=READ_SDA;
        delay();
        C_SCL;
        delay();
        return(ack);
}

/***************************************************************************
IIC总线写8位数据
input:要写的8位数据
***************************************************************************/
void Write8Bit(unsigned char input)
{
        unsigned char temp,q0;
        SDA_OUT;
        for(temp=8;temp!=0;temp--)
        {
                q0=input&0x80;
                if(q0==0x80)
                        S_SDA;
                else
                        C_SDA;
      delay();
                S_SCL;
                delay();
                C_SCL;
                delay();
                input=input<<1;
        }
}

/***************************************************************************
IIC总线读8位数据
返回值:读出的8位数据
***************************************************************************/
unsigned char Read8Bit()
{
        unsigned char temp,q0,rbyte=0;
        SDA_IN;
        for(temp=8;temp!=0;temp--)
        {
                S_SCL;
                delay();
                rbyte=rbyte<<1;
                SDA_IN;
                q0=READ_SDA;
                if(q0==IIC_SDA)
                        rbyte=rbyte|0x1;
                delay();
                C_SCL;
                delay();
        }
        return(rbyte);
}
/***************************************************************************
向ITG3200中写一个字节
wdata:要写入的数据
adr:ITG3200中要写入数据的首地址
返回值:0:执行完毕;1:执行出现错误
***************************************************************************/
unsigned char WriteITG3200Byte(unsigned char wdata,unsigned char adr)
{
                Start();                        //启动IIC总线
                Write8Bit(W_DEVICE_ADR);        //写ITG3200的芯片地址以及确定下面执行写操作
                if(TestAck()==1)                //检验应答
                        return 1;                //若应答错误,则退出函数,返回错误
                Write8Bit(adr);                        //写对ITG3200操作的地址
                if(TestAck()==1)
                        return 1;

                Write8Bit(wdata);                //向ITG3200中写数据
                if(TestAck()==1)
                        return 1;
                Stop();                                //停止IIC总线
                DelayMs(10);                  //写入延时,等待完成内部写入
       
        return 0;
}
/***************************************************************************
从ITG3200中读一个字节
adr:ITG3200中要读出数据的地址
返回值:0:执行完毕;1:执行出现错误
***************************************************************************/
unsigned char ReadITG3200Byte(unsigned char adr)
{
      uchar temp;
        Start();                        //启动IIC总线
        Write8Bit(W_DEVICE_ADR);        //写ITG3200的芯片地址以及确定下面执行写操作
        if(TestAck()==1)
                return 1;
        Write8Bit(adr);                        //写对ITG3200操作的地址
        if(TestAck()==1)
                return 1;

        Start();                        //再次启动IIC总线
        Write8Bit(R_DEVICE_ADR);        //写ITG3200的芯片地址以及确定下面执行读操作
        if(TestAck()==1)
                return 1;
        temp=Read8Bit();                //从ITG3200中读数据
        NoAck();                        //IIC无应答操作
        Stop();                                //停止IIC总线

        return temp;
}

first_mouse 发表于 2011-7-26 11:25:10

请大家帮忙看看   是怎么一回事的呢?

autopass 发表于 2011-7-26 16:33:13

2个字节怎么会有65536?如果是65535就应该是对的

yaoyaowugui 发表于 2011-7-30 19:32:46

http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_662317WY8AIC.png
前几天刚测试的ITG3200 (原文件名:数据.png)

前几天测试ITG3200 ,没有做零点修正,直接取出数据,现在还不明白温度是怎么回事,-10000多了,对于温度,PDF上好像没详细说,没有一个参考点

linlin990 发表于 2012-2-16 21:36:16

那么读取只读寄存器的时候呢?结果是否正确?

jojasd 发表于 2012-2-16 23:08:06

静止都数据是会有点漂的,正常,,不知道你的T是什么东西,旋转数据是有变化,可以向固定的一个方向旋转,看各轴的数据变化趋势。

Name_006 发表于 2012-2-16 23:08:59

我做小板子的时候也遇到过这种情况 也可能是传感器 坏了
还有一种情况是 数据 静止状态下 显示 -2000 -- 2000的范围 变化较大 这种情况是芯片加热时间过长导致好像也能用 没仔细侧过
一半正常的情况是 静止状态下数据的模值 越小越正确

skystalker 发表于 2012-5-11 16:40:23

我的静止时X -8度 Y 4度 Z 0度,估计是吹久了造成的,把这当零偏减去就成
页: [1]
查看完整版本: 与角速率传感器ITG3200通信不知道对不对啊?