智能车制作

标题: XS128模拟IIC读取LEG4200D [打印本页]

作者: pang576101312    时间: 2015-2-1 20:06
标题: XS128模拟IIC读取LEG4200D
效果还是满不错的。    功能很强大  
红色X轴  黄色Y轴  蓝色Z轴
直接测的角速度,没有积分  代码如果有人要看的话我整理好了贴出来,弄了很多天,水平问题。


这里有几个问题:1: 这款陀螺仪是数字的,那么是不是无法和MMA7361进行硬件融合了? MMA7361现在我把它的输出量已经量化为0-90°的角度量了。
2: 数字的话,应该是不可以硬件积分的吧? 软件积分,具体是个咋样子的呢? 小白求教。。。
请各路大神不吝赐教,小弟感激不尽!

作者: pang576101312    时间: 2015-2-1 20:08
主要是几乎无温漂。
另外,五个寄存器自由配置,自由度相当高
作者: 蓝猫    时间: 2015-2-1 20:15
用算法融合一下呗、Car_angel=a*(Car_angel+anglespeed*t)+(1-a)*Acc_angle
作者: 蓝猫    时间: 2015-2-1 20:17
把你那代码贴出来看看呗
作者: 孤单    时间: 2015-2-1 20:53
可以融合,我用的就是L3G4200D和MMA7361

作者: 孤单    时间: 2015-2-1 21:01
pang576101312 发表于 2015-2-1 20:08
主要是几乎无温漂。
另外,五个寄存器自由配置,自由度相当高

正常来说卡尔曼融合会好点,可是我只能弄互补滤波,可能是硬件不给力吧
作者: 蓝猫    时间: 2015-2-1 21:04
孤单 发表于 2015-2-1 20:53
可以融合,我用的就是L3G4200D和MMA7361

你用的什么单片机?之前玩了会L3G4200D,愣是没读出来数据


作者: 孤单    时间: 2015-2-1 21:06
蓝猫 发表于 2015-2-1 21:04
你用的什么单片机?之前玩了会L3G4200D,愣是没读出来数据

xs128


作者: 蓝猫    时间: 2015-2-1 21:09
anglespeed是贪图方便写的,是错误的
作者: pang576101312    时间: 2015-2-1 21:21
孤单 发表于 2015-2-1 21:06
xs128

模拟和数字怎样融合呢?

作者: 蓝猫    时间: 2015-2-1 21:33
孤单 发表于 2015-2-1 21:06
xs128

你给了多少的延迟?我给的4.88us,就是不行


作者: 孤单    时间: 2015-2-1 21:55
蓝猫 发表于 2015-2-1 21:33
你给了多少的延迟?我给的4.88us,就是不行

可以吧,我只用了4微秒就已经可以了

作者: 孤单    时间: 2015-2-1 21:57
pang576101312 发表于 2015-2-1 21:21
模拟和数字怎样融合呢?

你不是AD模数转换完吗,无非就是加了个AD,没有差,再用公式就行了

作者: 蓝猫    时间: 2015-2-1 22:46
孤单 发表于 2015-2-1 21:55
可以吧,我只用了4微秒就已经可以了

那应该是我程序错了吧


作者: 蓝猫    时间: 2015-2-1 22:46
孤单 发表于 2015-2-1 21:57
你不是AD模数转换完吗,无非就是加了个AD,没有差,再用公式就行了

公式,那不就是软件融合了,他说的是硬件融合


作者: pang576101312    时间: 2015-2-2 00:22
蓝猫 发表于 2015-2-1 21:33
你给了多少的延迟?我给的4.88us,就是不行

那个问题不大吧,我给的5US

作者: 蓝猫    时间: 2015-2-2 09:30
pang576101312 发表于 2015-2-2 00:22
那个问题不大吧,我给的5US

看来是我程序错了。把你的贴出来看看呗


作者: pang576101312    时间: 2015-2-2 10:24
软件积分怎么个思路各路大神
作者: pang576101312    时间: 2015-2-2 10:45
蓝猫 发表于 2015-2-2 09:30
看来是我程序错了。把你的贴出来看看呗

昂,正整理呢,等我弄出来哈

作者: pang576101312    时间: 2015-2-2 12:52
硬件,,应该是没法融合的吧…… 毕竟就算是输出,一个是数字信号,一个是模拟信号。   
公式的话,就是定时再累积吗?   多久合适呢?
作者: 蓝猫    时间: 2015-2-2 17:17
我前面给的那个公式,再看卓老师的调车视频,调一下数据就可以了
作者: 徐鹏    时间: 2015-2-2 17:55
能不能给个模拟的iiic库啊
作者: pang576101312    时间: 2015-2-2 23:31
#include "hidef.h"
#include "IIC_L3G4200D.h"
#include "MC9S12XS128.h"
#include "SCI_Output.h"
#include "AngDeal.h"



int  dis_datay,dis_dataz;  
int IIC_Receive[6];   
uchar IIC_ERROR;  /*应答标志位*/  
   


/***************************************************
                    IIC通信
注意   !总线频率为80MHZ,如需应用与不同频率,请
更改延时函数,增减至合适的NOP数量。器件地址为SDO接高的地址
SDO默认为高。
****************************************************/
void IIC_Init()   
{   
    DDRJ=0xff;   
}   

void Delay1us(int c)   
{   
    int cnt;   
    for(cnt=0;cnt<c;cnt++)   
    {   
        _asm NOP;_asm NOP;_asm NOP;
        _asm NOP;_asm NOP;_asm NOP;
        _asm NOP;_asm NOP;_asm NOP;
        _asm NOP;_asm NOP;_asm NOP;   
        
        _asm NOP;_asm NOP;
        _asm NOP;_asm NOP;_asm NOP;
        _asm NOP;_asm NOP;_asm NOP;      
    }   
      
}   
void IIC_START()   
{   
   SDA=1;     /*发送起始条件的数据信号*/   
   Delay1us(1);   
   SCL=1;   
   Delay1us(5);      /*起始条件建立时间大于4.7us,延时*/   
   SDA=0;     /*发送起始信号*/   
   Delay1us(5);      /* 起始条件锁定时间大于4μs*/   
   SCL=0;     /*钳住IIC总线,准备发送或接收数据 */   
   Delay1us(2);   
}   
void  IIC_STOP()   
{   
    SDA=0;    /*发送结束条件的数据信号*/   
    Delay1us(1);     /*发送结束条件的时钟信号*/   
    SCL=1;    /*结束条件建立时间大于4us*/   
    Delay1us(5);   
     
    SDA=1;    /*发送IIC总线结束信号*/   
    Delay1us(4);   
}   
void IIC_Send_ack(uchar A)   
{   
    SDA=A;   
    Delay1us(1);   
    SCL=1;   
    Delay1us(5);   
    SCL=0;   
    Delay1us(2);   
}   
void IIC_Check_ack()   
{   
    Delay1us(3);   
    SCL=0;   
    Delay1us(3);   
    DDRJ_DDRJ6=0;   
    SDA=1;   
    Delay1us(3);   
    SCL=1;   
    Delay1us(5);   
    if(SDA==1)   
        IIC_ERROR=1;   
    else   
        IIC_ERROR=0;   
    SCL=0;   
    Delay1us(3);   
    DDRJ_DDRJ6=1;   
}   
//**************通过IIC总线发送1字节数据***************//  
void IIC_Send1byte(uchar data)   
{   
    uint i=8;   
    uchar m=data;   
    uchar temp;   
    for(i=8;i>0;i--)   
    {   
        temp=m&0x80;   
        if(temp==0x80)   
            SDA=1;   
        else   
            SDA=0;   
        Delay1us(5);   
        SCL=1;   
        Delay1us(5);   
        SCL=0;   
        m=m<<1;      
    }   
}   
//***************通过IIC总线接受1字节数据******************//
uchar IIC_Receive1byte()   
{   
    int i=8;   
    uchar j=0;   
    DDRJ_DDRJ6=0;   
    SDA=1;   
    for(i=8;i>0;i--)   
    {   
        SDA=1;   
        Delay1us(3);   
        SCL=1;   
        Delay1us(5);   
        if(SDA==1)   
            j=j|0x01;   
        else j=j;   
            SCL=0;   
           
        if(i!=1)   
        {   
            j=j<<1;   
        }   
    }   
    DDRJ_DDRJ6=1;   
    return j;   
}      
// *****通过IIC总线向某一寄存器写入一个字节数据********  
void IIC_write(uchar add,uchar mem,uchar data)               // 写数据(器件地址,寄存器地址,数据)
{   
    IIC_START();   
    IIC_Send1byte(add);   
    IIC_Check_ack();   
    IIC_Send1byte(mem);   
    IIC_Check_ack();     
    IIC_Send1byte(data);
    IIC_Check_ack();   
    IIC_STOP();      
}   

//***************L3G4200D读取*******************//

void L3G4200D_Init()
{

   IIC_write(READ,0X20, 0x8F);   
   IIC_write(READ,0X21, 0x00);   
   IIC_write(READ,0X22, 0x08);  
   IIC_write(READ,0X23, 0x36 );  
   IIC_write(READ,0X24, 0x00);   
}

int IIC_Read(uchar add,uchar mem)      // 读数据(器件地址,寄存器地址)
{        
    int data;
    IIC_START();   
    IIC_Send1byte(add);   
    IIC_Check_ack();   
    IIC_Send1byte(mem);     
    IIC_Check_ack();   
    IIC_START();   
    IIC_Send1byte(add+1);   
    IIC_Check_ack();  
    data=IIC_Receive1byte();      
    IIC_Send_ack(1);
    IIC_STOP();
    return data;  
}  
/***************读取结果传送值虚拟示波器,如不需要可删去**********************
注:
采集到的值为16位数,并且要经过数据合成才可以使用。经实验,选择初始自检后波形很棒,没有毛刺
但是同样的初始后不在零位了。所以经过修正使得Y和Z初始都在零位。
数据是int型,因为有两个方向∶使用的Z轴和Y轴。其中,俯仰使用Z轴,偏航使用Y轴。没有用X轴的原因
是因为实验发现X轴即使加了初始自检,依然有较明显毛刺。原因不祥
**************************************************************************/
void GET_AngleSpeed(void)
{
        IIC_Receive[2]=IIC_Read(READ,0X2A);                         //   Y
        IIC_Receive[3]=IIC_Read(READ,0X2B);                         //数据合成
        dis_datay=(IIC_Receive[3]<<8)+IIC_Receive[2]+6500;     //因为经过了自检,初始后波形更好,但是不在0位
                                                                                               //需要加修正值,Z轴同理
//        IIC_Receive[4]=IIC_Read(READ,0X2C);                         //    Z
//        IIC_Receive[5]=IIC_Read(READ,0X2D);                          //
//        dis_dataz=(IIC_Receive[5]<<8)+IIC_Receive[4]-7320;     //
}
作者: pang576101312    时间: 2015-2-2 23:32
徐鹏 发表于 2015-2-2 17:55
能不能给个模拟的iiic库啊

看后面

作者: pang576101312    时间: 2015-2-2 23:32
蓝猫 发表于 2015-2-1 20:15
用算法融合一下呗、Car_angel=a*(Car_angel+anglespeed*t)+(1-a)*Acc_angle

这就叫互补滤波吧? 代码贴在后面了,你看下

作者: 蓝猫    时间: 2015-2-3 09:24
pang576101312 发表于 2015-2-2 23:32
这就叫互补滤波吧? 代码贴在后面了,你看下

恩,是互补的、卡尔曼的比较复杂,我这个大一的懒得研究

作者: 蓝猫    时间: 2015-2-3 09:28
谢谢你的程序啦
作者: pang576101312    时间: 2015-2-3 09:45
蓝猫 发表于 2015-2-3 09:28
谢谢你的程序啦

忘了说,我的总线是80MHZ的,不一样的话你记得改延时

作者: 蓝猫    时间: 2015-2-3 10:14
pang576101312 发表于 2015-2-3 09:45
忘了说,我的总线是80MHZ的,不一样的话你记得改延时



作者: pang576101312    时间: 2015-2-3 23:55
还有些问题,测试成功记得顶下




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