搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2011-7-26 11:21:35 | 显示全部楼层 |阅读模式
我的与角速率传感器能够通信,但是我不知道是什么回事的,读回来的数据显示的很是有问题。。。已经检查很久,不知道是什么问题,在此虚心的向大家请教了。。。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
这个采集回来的数据,显示达到最大值,不知道是这么回事啊????

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-7-26 11:24:40 | 显示全部楼层
这个是对寄存器进行配置
  WriteITG3200Byte(0x80,PWR_M_AD);  //reset to deaults
  WriteITG3200Byte(0x04,SMPL_AD);  //DIV  4
  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;
}

出0入0汤圆

 楼主| 发表于 2011-7-26 11:25:10 | 显示全部楼层
请大家帮忙看看   是怎么一回事的呢?

出0入0汤圆

发表于 2011-7-26 16:33:13 | 显示全部楼层
2个字节怎么会有65536?如果是65535就应该是对的

出0入0汤圆

发表于 2011-7-30 19:32:46 | 显示全部楼层

前几天刚测试的ITG3200 (原文件名:数据.png)

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

出0入0汤圆

发表于 2012-2-16 21:36:16 | 显示全部楼层
那么读取只读寄存器的时候呢?结果是否正确?

出0入0汤圆

发表于 2012-2-16 23:08:06 | 显示全部楼层
静止都数据是会有点漂的,正常,,不知道你的T是什么东西,旋转数据是有变化,可以向固定的一个方向旋转,看各轴的数据变化趋势。

出0入0汤圆

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

出0入0汤圆

发表于 2012-5-11 16:40:23 | 显示全部楼层
我的静止时X -8度 Y 4度 Z 0度,估计是吹久了造成的,把这当零偏减去就成
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 02:20

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

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