智能车制作

标题: L3G4200D 数据一直在跳来跳去 [打印本页]

作者: 大止    时间: 2015-4-2 13:00
标题: L3G4200D 数据一直在跳来跳去
这是XS128模拟IIC读取陀螺仪数据的程序 采集回来的数据 高位只在0和255两个数跳 低位到处乱跳
  1. #include"L3G4200D.h"

  2. uchar bz2;
  3. uchar jj=0;

  4. void delay_us(int j)
  5. {
  6.   while(j--)
  7.   {
  8.       _asm NOP; _asm NOP;_asm NOP;
  9.        _asm NOP;_asm NOP;
  10.       _asm NOP; _asm NOP;_asm NOP;
  11.   }
  12.    
  13. }
  14. void delay_ms(int j)
  15. {
  16.     while(j--)
  17.     delay_us(1000);
  18.   
  19. }

  20. void IIC_START()
  21. {
  22.   
  23.     SDA=1;
  24.     SCL=1;
  25.     delay_us(5);//SCL保持高电平4.7us以上 SDA才下降
  26.     SDA=0;
  27.     delay_us(5); //SDA下降后 SCL保持高电平4us以上才下降
  28.     SCL=0;


  29. }
  30. void IIC_STOP()
  31. {
  32.   
  33.     SDA=0;
  34.     SCL=1;
  35.     delay_us(5);      //SDA上升前 SCL要先保持高电平4us
  36.     SDA=1;
  37.     delay_us(5);       //SDA要保持高电平4.7us
  38.   
  39. }




  40. void IIC_RASK() //发完数据 读应答
  41. {
  42.   
  43.     DDRA_DDRA2=0;    //读
  44.     SCL=1;
  45.     delay_us(2);
  46.     while(SDA);
  47.     delay_us(2);
  48.     SCL=0;       //第9个下降沿 应答结束
  49.     DDRA_DDRA2=1;
  50. }
  51. void IIC_WRITE(uchar dat)
  52. {
  53.    
  54.     uchar i;
  55.     for(i=0;i<=7;i++)
  56.     {
  57.       delay_us(2);
  58.       if(dat&0x80)
  59.       {
  60.         SDA=1;  
  61.       }
  62.       else
  63.       {
  64.         SDA=0;  
  65.       }
  66.       delay_us(5);
  67.       SCL=1;
  68.       delay_us(5);
  69.       SCL=0;  
  70.       dat=dat<<1;
  71.     }  
  72.     IIC_RASK();   
  73. }



  74. void IIC_WASK()
  75. {                    
  76.     SDA=1;           //为什么是应答1
  77.     delay_us(2);
  78.     SCL=1;        
  79.     delay_us(2);
  80.     SCL=0;
  81.     delay_us(2);
  82. }
  83. uchar IIC_READ()
  84. {
  85.   uchar i;
  86.   uchar dat=0;
  87.   DDRA_DDRA2=0; //读
  88.   delay_us(5);
  89.   for(i=0;i<=7;i++)
  90.   {
  91.     dat <<= 1;
  92.     SCL = 1;                //拉高时钟线
  93.     delay_us(5);             //延时
  94.     dat |= SDA;             //读数据               
  95.     SCL = 0;                //拉低时钟线
  96.     delay_us(5);             //延时
  97.   }
  98.   DDRA_DDRA2=1;//写
  99.   return dat;
  100. }     


  101. void IIC_WRITEREG(uchar REG_ADRESS,uchar dat) //写寄存器
  102. {
  103.   IIC_START();
  104.   IIC_WRITE(SlaveAddress); //设备地址
  105.   IIC_WRITE(REG_ADRESS);
  106.   IIC_WRITE(dat);
  107.   IIC_STOP();  
  108. }
  109. uchar IIC_READREG(uchar REG_ADRESS)
  110. {
  111.   
  112.   uchar dat;
  113.   
  114.   IIC_START();
  115.   IIC_WRITE(SlaveAddress); //设备地址   写信号
  116.   IIC_WRITE(REG_ADRESS);
  117.   IIC_START();
  118.   IIC_WRITE(SlaveAddress+1); //设备地址   读
  119.   dat=IIC_READ();
  120.     IIC_WASK() ;
  121.   IIC_STOP();
  122.   return dat;
  123. }


  124. void Init_L3G4200D()
  125. {
  126.    IIC_WRITEREG(CTRL_REG1, 0x8f);   
  127.    IIC_WRITEREG(CTRL_REG2, 0x00);   
  128.    IIC_WRITEREG(CTRL_REG3, 0x08);   
  129.    IIC_WRITEREG(CTRL_REG4, 0x30);
  130.    IIC_WRITEREG(CTRL_REG5, 0x00);
  131. }
复制代码

作者: 大止    时间: 2015-4-2 13:00
救命救命
作者: 大止    时间: 2015-4-2 13:15
本帖最后由 大止 于 2015-4-2 13:17 编辑

换了个模块 高位时稳定了 可是低位还是跳 不动的时候 12-17的跳变。。
作者: 大止    时间: 2015-4-2 13:18
静止的是偶 低位有时候还会跳到200多
作者: 大止    时间: 2015-4-2 13:55
不确定 寄存器里的数据读出来怎么转换为角速度 高位有符号吗 我用char 来接收时 数据在静止时很稳定 但是一动 数据马上又跳了。




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2