搜索
bottom↓
回复: 97

stm32模拟I2C驱动L3G4200,ADXL345,HMC5883,BMP085成功,含大量中文资料

  [复制链接]

出0入0汤圆

发表于 2012-9-6 10:39:11 | 显示全部楼层 |阅读模式
本帖最后由 wanxuncpx 于 2012-9-6 11:28 编辑

首先感谢各位大大前辈们的探索,下面发表一个改写的用I2C驱动L3G4200D,ADXL345,HMC5883,BMP085的程序
PCB是嘉利创打的  5x5cm才50元,还算比较便宜.
程序经过几天测试,能稳定运行,其中几个芯片确实比较难焊,焊接失败了好几次,才成功.

ADXL345和陀螺仪输出的数据还算靠谱,磁阻仪输出的数据是椭圆磁场,人为校准后勉强何用,气压计完全是个垃圾,比室温普遍高近8度,比如实测温度27度,BMP085测得温度尽然是32度,还有海拔在1~2m的范围无特定规律的跳动,看来只能用超声波标高了.

程序框架如下图:

原理图如下


测试程序:

原理图pdf版和ad6.9版本


中文datasheet资料下载:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2012-9-6 10:51:34 | 显示全部楼层
模拟的IIC速度能达到多少?

出0入0汤圆

 楼主| 发表于 2012-9-6 10:57:13 | 显示全部楼层
400KHz速度
我测过时钟高电平持续时间低至500ns,低电平近2us时间,时钟为400KHz略超一点

出0入0汤圆

发表于 2012-9-6 11:14:26 | 显示全部楼层
多谢共享,为何不用硬件IIC?

出0入0汤圆

 楼主| 发表于 2012-9-6 11:32:27 | 显示全部楼层
说来惭愧,用STM32硬件I2C中断驱动失败了,运行着有事莫名其妙的就不能正常读取数据了,还是用模拟的移植性好,方便稳定

出0入0汤圆

发表于 2012-9-6 11:39:52 | 显示全部楼层
没有电机接口?

出0入0汤圆

 楼主| 发表于 2012-9-6 12:00:21 | 显示全部楼层
用串口控制我自作的电调!

出0入0汤圆

发表于 2012-9-6 12:41:40 来自手机 | 显示全部楼层
打个记号先

出0入0汤圆

发表于 2012-9-6 12:52:42 | 显示全部楼层
MARK                        

出0入0汤圆

发表于 2012-9-6 13:27:48 | 显示全部楼层
网上有个开源的项目 这些代码都有 而且他们用的是就是自带的IIC,可以查下。

出0入0汤圆

发表于 2012-9-6 14:48:37 | 显示全部楼层
wanxuncpx 发表于 2012-9-6 12:00
用串口控制我自作的电调!

为什么  我看不到有人用SPI的,不是SPI也支持的吗?  还有听说STM32 硬件I2C有bug, 网上那些应硬件I2C的怎么做出来的????

出0入0汤圆

发表于 2012-9-6 16:24:18 | 显示全部楼层
顶,学习学习。蓝牙模块貌似的跟我用的一样。

出0入0汤圆

发表于 2012-9-6 16:34:20 | 显示全部楼层
哎 。。    其实严格的说 模拟的IIC也很不稳定,   我最近就遇到过着问题    还是好好扣一扣  硬件的IIC比较好 。。。                  

出0入0汤圆

发表于 2012-9-6 19:05:52 | 显示全部楼层
学习一下,感谢分享

出0入0汤圆

发表于 2012-9-6 20:36:46 | 显示全部楼层
楼主能提供一些HMC5883的资料吗?能有源码最好了。这个从X,Y,Z读出来的数据要怎么换算成方位?

出0入4汤圆

发表于 2012-9-7 07:58:24 | 显示全部楼层
谢谢楼主分享,我也在做这个东西

出0入0汤圆

 楼主| 发表于 2012-9-7 09:26:06 | 显示全部楼层
wjdb3 发表于 2012-9-6 20:36
楼主能提供一些HMC5883的资料吗?能有源码最好了。这个从X,Y,Z读出来的数据要怎么换算成方位? ...

资料包里有HMC5883资料, 读出的数据按如下处理就为方位
/******************************************************************************
/ 函数功能:打印HMC的传感器数据
/ 修改日期:none
/ 输入参数:none
/ 输出参数:none
/ 使用说明:none
******************************************************************************/
void HMC5883L_Printf(tg_HMC5883L_TYPE * ptResult)
{
    int16_t x,y;
    float angle;
   
    x = ptResult->hx;      //传感器的x轴数据
    y = ptResult->hy;     //传感器的y轴数据
    //求出方向
    if(x>0x7fff)x-=0xffff;     //取绝对值
    if(y>0x7fff)y-=0xffff;
    //LED1_ON();
    angle= atan2(y,x) * (180 / 3.14159265) + 180;   //angle即为角度值
    //LED1_OFF();
    ptResult->ha = (int16_t)(angle*10);   // 得到方向精确到0.1°
    printf("HMC5883L:\thx: %4d,\thy: %4d,\thz: %4d,\t%4d\n\r",
            ptResult->hx, ptResult->hy, ptResult->hz, ptResult->ha/10);
}

出0入0汤圆

发表于 2012-9-12 17:42:56 | 显示全部楼层
看了电路原理图,我觉得用蓝牙通讯效果没有用NRF24L01无线模块的效果好。楼主知道怎么接上这个模块么?

出0入0汤圆

发表于 2012-9-12 18:27:20 | 显示全部楼层
研究一下,最近也在用I2C 驱动pcf8563, 用的硬件的,加了大量的延迟,否则会死在判断标志处, 读一次时间要70ms; 在准备换模拟的试一试

出0入0汤圆

发表于 2012-9-12 20:08:16 | 显示全部楼层
楼主吧 所用芯片的固件库也上传上去吧!

出0入0汤圆

发表于 2012-9-16 11:29:29 | 显示全部楼层
楼主好人啊

出0入0汤圆

发表于 2012-9-16 12:38:47 | 显示全部楼层
非常好的东西,多谢

出0入0汤圆

发表于 2012-11-9 08:57:42 | 显示全部楼层
本帖最后由 chengying 于 2012-11-9 09:22 编辑

谢谢,资料真齐全,向你好好学习,有什么好资料就传到这来

出0入0汤圆

发表于 2012-11-10 11:55:44 | 显示全部楼层
楼主果然好人,毫无保留地开源。赞!

出0入0汤圆

发表于 2012-11-14 15:46:13 | 显示全部楼层
谢谢,楼主无私共享的资料。

出0入0汤圆

发表于 2012-11-15 17:57:24 | 显示全部楼层
非常的好,谢谢分享。

出0入0汤圆

发表于 2012-11-25 16:58:50 | 显示全部楼层
正在研究adxl345.。。一直不能正常工作

出0入0汤圆

发表于 2012-11-25 19:48:30 | 显示全部楼层
mark一下啦

出0入0汤圆

发表于 2012-11-26 11:17:19 | 显示全部楼层
正在学习四轴...thx

出0入0汤圆

发表于 2012-11-28 18:42:39 | 显示全部楼层
楼主的程序写得真的是很工整啊,函数、文件的命名分类清晰,注释明了,格式规范一致,真的是好代码;提供的资料也齐全,帖子图文并茂。
这么好的帖子,怎么关注的人这么少呢。

出0入0汤圆

发表于 2012-11-29 14:59:30 | 显示全部楼层

出0入0汤圆

发表于 2012-11-30 14:10:00 | 显示全部楼层
嗯   写的很整洁

出0入0汤圆

发表于 2012-11-30 22:56:11 | 显示全部楼层
好东西啊,感谢楼主分享~

出0入0汤圆

发表于 2012-12-3 17:38:03 | 显示全部楼层
好呀,Mark

出0入0汤圆

发表于 2012-12-3 17:50:27 | 显示全部楼层

出0入0汤圆

发表于 2012-12-3 18:11:00 | 显示全部楼层
ffeige1984 发表于 2012-9-6 13:27
网上有个开源的项目 这些代码都有 而且他们用的是就是自带的IIC,可以查下。 ...

开源的stm32 IIC??给个链接呗,谢谢

出0入0汤圆

发表于 2012-12-4 17:23:20 | 显示全部楼层
正要用,非常感谢。

出0入0汤圆

发表于 2013-3-1 15:55:23 | 显示全部楼层
正要用,十分十分感谢楼主!另外想问楼主,400khz的速度,你是怎么测出来的呢?
以及,程序里面能不能随意更改IIC速率呢?谢谢楼主!

出0入0汤圆

发表于 2013-3-3 17:47:26 来自手机 | 显示全部楼层
楼主能做到这么彻底的分享,伟大!!

出0入0汤圆

发表于 2013-3-5 10:40:43 | 显示全部楼层
顶死楼主,这么牛叉 学习中。。。。

出0入0汤圆

发表于 2013-3-9 22:21:13 | 显示全部楼层
ffeige1984 发表于 2012-9-6 13:27
网上有个开源的项目 这些代码都有 而且他们用的是就是自带的IIC,可以查下。 ...

不麻烦的话帮忙这个网址啥,,不好找哦,,

出0入0汤圆

发表于 2013-3-11 17:45:55 | 显示全部楼层
本帖最后由 huangbing110110 于 2013-3-11 17:48 编辑

问你下,你的程序中bmp805读压强时候(bmp085ReadPressure())压强为什么没有加XLSB           datasheet中计算式要加哦,,,

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-3-11 18:04:00 | 显示全部楼层
学习了,谢谢分享!

出0入0汤圆

发表于 2013-3-20 22:26:31 | 显示全部楼层
希望能从中学习到有用的东西!谢谢!

出0入0汤圆

发表于 2013-3-26 10:42:11 | 显示全部楼层
多谢分享,我正在找!

出0入0汤圆

发表于 2013-4-7 15:33:19 | 显示全部楼层
好的。多谢

出0入0汤圆

发表于 2013-4-7 21:47:12 | 显示全部楼层
好东西啊,感谢楼主分享~

出0入0汤圆

发表于 2013-4-21 18:01:56 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2013-4-21 20:07:48 | 显示全部楼层
很不错!赞一个!

出0入0汤圆

发表于 2013-4-21 21:50:55 | 显示全部楼层
开源精神最伟大,LZ很好,我现在也在搞这一块,不过需要用SPI,目前还在调试中,要是有人能像lZ一样开源就好了,省得我再费那么多时间,或者我搞出来也会毫不犹豫开源的

出0入0汤圆

发表于 2013-4-27 15:59:31 | 显示全部楼层
楼主的东西不错  正好用到了……还没检验怎么样

出0入0汤圆

发表于 2013-4-27 16:16:36 | 显示全部楼层
四轴就是热门

出0入0汤圆

发表于 2013-5-21 15:57:50 | 显示全部楼层
找到好东西了,哈哈

出0入0汤圆

发表于 2013-5-21 22:59:59 | 显示全部楼层
感谢共享

出0入0汤圆

发表于 2013-5-25 01:22:42 | 显示全部楼层
谢了,参考参考,我正在做跟楼主差不多的东西,

出0入0汤圆

发表于 2013-6-21 10:12:21 | 显示全部楼层
感谢楼主 学习下

出0入0汤圆

发表于 2013-7-15 00:45:26 | 显示全部楼层
太棒了!!正在做一模一样的~~

出0入0汤圆

发表于 2013-8-5 03:28:01 | 显示全部楼层
谢谢楼主分享,就是小弟还有个不情之请,能不能麻烦楼主把元器件PCB的封装给小弟也发一份啊,感激不尽

出0入0汤圆

发表于 2013-8-13 17:21:33 | 显示全部楼层
下载了,帮顶

出0入0汤圆

发表于 2013-8-13 17:25:42 | 显示全部楼层
留着再说。

出0入0汤圆

发表于 2013-8-17 21:26:33 | 显示全部楼层
楼主赞一个。先下一个先。你这个最终是做成了什么东西?

出0入0汤圆

发表于 2013-8-28 17:46:54 | 显示全部楼层
谢谢楼主,资料很好用

出0入0汤圆

发表于 2013-8-30 01:10:00 | 显示全部楼层
看到这么多传感器应该是做四轴飞行器,感谢楼主

出0入0汤圆

发表于 2013-8-30 01:11:05 | 显示全部楼层
hpy168888 发表于 2012-9-17 20:03
哪有STM32做四轴的开源资料?~

开源?资料卖40000多啊

出0入0汤圆

发表于 2013-8-30 11:32:43 | 显示全部楼层
plc_avr 发表于 2012-9-6 11:14
多谢共享,为何不用硬件IIC?

32的I2C比较鸡肋~用起来效果比较差

出0入0汤圆

发表于 2013-8-31 00:10:49 | 显示全部楼层
ta太需要了 谢谢楼主

出0入0汤圆

发表于 2013-9-1 11:16:48 | 显示全部楼层
自讨解算看懂了    卡尔曼滤波部分怎么写?

出0入0汤圆

发表于 2013-9-1 22:28:56 | 显示全部楼层
哇,,我也在网上买了一个相同的模块 ,上面的BMP085有点不靠谱

出0入0汤圆

发表于 2013-9-2 17:58:48 | 显示全部楼层
void L3G4200D_Printf(tg_L3G4200D_TYPE * ptResult)
{
    int32_t tempX,tempY,tempZ;

    //temp=(float)dis_data*0.07;  //
    tempX = (int32_t)ptResult->gx;   tempX = (tempX*7)/100;
    tempY = (int32_t)ptResult->gy;   tempY = (tempY*7)/100;
    tempZ = (int32_t)ptResult->gz;   tempZ = (tempZ*7)/100;
    printf("L3G4200D:\tgx: %4d,\tgy: %4d,\tgz: %4d\n\r",tempX,tempY,tempZ);
}

为什么是tempX = (tempX*7)/100  有什么寓意吗

出0入0汤圆

发表于 2013-9-3 16:24:29 | 显示全部楼层
谢谢分享!!!

出0入0汤圆

发表于 2013-9-23 11:01:22 | 显示全部楼层
非常好的东西,多谢

出0入0汤圆

发表于 2013-10-5 00:52:59 | 显示全部楼层
正在学习四轴...thx

出0入0汤圆

发表于 2013-11-16 11:45:55 | 显示全部楼层
多谢了啊!!

出0入0汤圆

发表于 2013-12-11 11:57:41 | 显示全部楼层
感謝分享囉

出0入0汤圆

发表于 2013-12-11 14:53:36 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2013-12-11 15:35:08 | 显示全部楼层
你好:BMP085可以测真空泵的压力吗?

出0入0汤圆

发表于 2013-12-11 17:03:49 | 显示全部楼层
感谢分享!

出0入0汤圆

发表于 2013-12-19 11:14:15 | 显示全部楼层
/*---------------------*
*   HMC5883 校正参数   *
*----------------------*/
// 漂移系数。单位:1单位地磁场强度
#define HMC5883L_OFFSET_X   (9)
#define HMC5883L_OFFSET_Y   (149)

//比例因子
#define HMC5883L_GAIN_X     1f
//#define HMC5883L_GAIN_Y   1.04034582
#define HMC5883L_GAIN_Y     10403     //实际1.04034582,这里便于整除

楼主上面的校正参数是这么得到了啊。。。这个参数适合所有HMC5883吗   。。。。恳求楼主回帖。。。

出0入0汤圆

发表于 2014-1-9 16:17:15 | 显示全部楼层
不错。这个必须顶一顶。

出0入0汤圆

发表于 2014-1-17 16:39:05 | 显示全部楼层
顶,正在学习,感谢分享。

出0入0汤圆

发表于 2014-1-22 09:49:52 | 显示全部楼层
MARK  一下  有时间准备搞一下

出0入17汤圆

发表于 2014-3-2 00:28:46 | 显示全部楼层
挖个坟.顺便修正楼主代码中的BUG.
我刚入门STM32,正好公司开发一款产品用到了BMP085,用楼主的代码测试了一下BMP085,发现测量得到的温度在零下200多度,气压在500多kPa,明显有问题.
回家后,由于家里没有暖气,气温较低,一测居然好了,温度20度,大气压101.8kPa.很奇怪,用手暖了一下BMP085芯片,发现温度大约上升至22.5度时数据变成了不正常的数,隐约感觉到应该是代码有问题.
开调试工具,跟踪对比了一下,发现问题出在这个函数中:
        static int32_t bmp085ReadTemp(void)
        {   
            int16_t  temp_ut;
            Single_Write(BMP085_Addr,0xF4,0x2E);
            Delayms(5); // max time is 4.5ms
            temp_ut = Single_Read(BMP085_Addr,0xF6);
            temp_ut = (temp_ut<<8)| Single_Read(BMP085_Addr,0xF7);      
            return (int32_t) temp_ut ;
        }

经跟踪发现,其中的高字节数据  Single_Read(BMP085_Addr,0xF6) 在读取时,
实际温度低于22.5度时,读取的值<0x80;
实际温度达到22.5度或以上时,读取的值>=0x80
由于下面有左移8位的操作,小于0x80时还正常,但大于或等于0x80时,左移就会导致变量最高位变成1(有符号16位整型就变成了负数),函数在返回时强制转换成32位整型时就变成了负数,0xffffxxxx.
后面再经过计算得出的结果就会不正常.

修正方法:
把函数中的 int16_t  temp_ut;
改成 uint16_t  temp_ut;
即可.经实际测试,改后一切正常.

相信有不少同学也被此问题困扰,在此小弟先给出解决方案了.不谢.

出0入0汤圆

发表于 2014-3-2 02:21:32 | 显示全部楼层
多謝版主分享!!!

出0入0汤圆

发表于 2014-4-14 11:02:43 | 显示全部楼层
蒋盼盼 发表于 2013-12-19 11:14
/*---------------------*
*   HMC5883 校正参数   *
*----------------------*/

你验证了吗?适合吗??

出0入0汤圆

发表于 2014-4-16 10:21:11 | 显示全部楼层
wanxuncpx 发表于 2012-9-6 11:32
说来惭愧,用STM32硬件I2C中断驱动失败了,运行着有事莫名其妙的就不能正常读取数据了,还是用模拟的移植性好, ...

会磁力计的椭球校正吗

出0入0汤圆

发表于 2014-6-5 17:26:16 | 显示全部楼层
楼主的程序写的很有条理性,一般电子出身的一开始的程序就是if else.慢慢的程序读的多了,追求的就是条理性,移植性,模块化,深感其受

出0入0汤圆

发表于 2014-7-1 12:03:57 | 显示全部楼层
感谢楼主了,最近看STM32的I2C折腾啊,楼主资料看看再说

出0入0汤圆

发表于 2014-7-1 17:12:51 | 显示全部楼层
但是模拟I2C有一个不好,不能配合使用DMA传输了。

出0入0汤圆

发表于 2014-10-28 16:43:11 | 显示全部楼层
我没回复过?看来是忘记了

出0入0汤圆

发表于 2014-10-28 17:01:49 | 显示全部楼层

MARK  一下   坛里资料真多

出0入0汤圆

发表于 2014-11-4 12:19:43 | 显示全部楼层
stm32模拟I2C驱动 L3G4200,ADXL345,HMC5883,BMP085  中文资料

出0入0汤圆

发表于 2014-11-10 13:28:04 | 显示全部楼层
谢谢大神啦

出0入0汤圆

发表于 2015-2-12 16:28:55 | 显示全部楼层
谢谢分享,mark一下。

出0入0汤圆

发表于 2015-2-12 17:30:08 | 显示全部楼层
据说smt32的硬i2c有bug?

出0入0汤圆

发表于 2016-3-7 08:44:14 | 显示全部楼层
感谢分享!!!!!!!!

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-26 21:34

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

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