wanxuncpx 发表于 2012-9-6 10:39:11

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

本帖最后由 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资料下载:

avatar2008 发表于 2012-9-6 10:51:34

模拟的IIC速度能达到多少?

wanxuncpx 发表于 2012-9-6 10:57:13

400KHz速度
我测过时钟高电平持续时间低至500ns,低电平近2us时间,时钟为400KHz略超一点

plc_avr 发表于 2012-9-6 11:14:26

多谢共享,为何不用硬件IIC?

wanxuncpx 发表于 2012-9-6 11:32:27

说来惭愧,用STM32硬件I2C中断驱动失败了,运行着有事莫名其妙的就不能正常读取数据了,还是用模拟的移植性好,方便稳定

badboy.tao 发表于 2012-9-6 11:39:52

没有电机接口?

wanxuncpx 发表于 2012-9-6 12:00:21

用串口控制我自作的电调!

liliuqun 发表于 2012-9-6 12:41:40

打个记号先

Rocky_Zou 发表于 2012-9-6 12:52:42

MARK                        

ffeige1984 发表于 2012-9-6 13:27:48

网上有个开源的项目 这些代码都有 而且他们用的是就是自带的IIC,可以查下。

badboy.tao 发表于 2012-9-6 14:48:37

wanxuncpx 发表于 2012-9-6 12:00 static/image/common/back.gif
用串口控制我自作的电调!

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

menghong_4 发表于 2012-9-6 16:24:18

顶,学习学习。蓝牙模块貌似的跟我用的一样。

Name_006 发表于 2012-9-6 16:34:20

哎 。。    其实严格的说 模拟的IIC也很不稳定,   我最近就遇到过着问题    还是好好扣一扣硬件的IIC比较好 。。。                  

spoonylong 发表于 2012-9-6 19:05:52

学习一下,感谢分享

wjdb3 发表于 2012-9-6 20:36:46

楼主能提供一些HMC5883的资料吗?能有源码最好了。这个从X,Y,Z读出来的数据要怎么换算成方位?

ZL_electric 发表于 2012-9-7 07:58:24

谢谢楼主分享,我也在做这个东西

wanxuncpx 发表于 2012-9-7 09:26:06

wjdb3 发表于 2012-9-6 20:36 static/image/common/back.gif
楼主能提供一些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);
}

天涯_1110 发表于 2012-9-12 17:42:56

看了电路原理图,我觉得用蓝牙通讯效果没有用NRF24L01无线模块的效果好。楼主知道怎么接上这个模块么?

酒后不开车 发表于 2012-9-12 18:27:20

研究一下,最近也在用I2C 驱动pcf8563, 用的硬件的,加了大量的延迟,否则会死在判断标志处, 读一次时间要70ms; 在准备换模拟的试一试

天涯_1110 发表于 2012-9-12 20:08:16

楼主吧 所用芯片的固件库也上传上去吧!{:handshake:}

max-men 发表于 2012-9-16 11:29:29

楼主好人啊

kexiao 发表于 2012-9-16 12:38:47

非常好的东西,多谢

chengying 发表于 2012-11-9 08:57:42

本帖最后由 chengying 于 2012-11-9 09:22 编辑

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

LCRPN 发表于 2012-11-10 11:55:44

楼主果然好人,毫无保留地开源。赞!

小溪 发表于 2012-11-14 15:46:13

谢谢,楼主无私共享的资料。

honphylin 发表于 2012-11-15 17:57:24

非常的好,谢谢分享。

lyreliu 发表于 2012-11-25 16:58:50

正在研究adxl345.。。一直不能正常工作

whf199191 发表于 2012-11-25 19:48:30

mark一下啦

fishOnFly 发表于 2012-11-26 11:17:19

正在学习四轴...thx

LCRPN 发表于 2012-11-28 18:42:39

楼主的程序写得真的是很工整啊,函数、文件的命名分类清晰,注释明了,格式规范一致,真的是好代码;提供的资料也齐全,帖子图文并茂。
这么好的帖子,怎么关注的人这么少呢。

SayBey 发表于 2012-11-29 14:59:30

{:victory:}

number007cool 发表于 2012-11-30 14:10:00

嗯   写的很整洁

lyreliu 发表于 2012-11-30 22:56:11

好东西啊,感谢楼主分享~

COMPASSNAVHK 发表于 2012-12-3 17:38:03

好呀,Mark

__@ 发表于 2012-12-3 17:50:27

{:biggrin:}

xuxi2009 发表于 2012-12-3 18:11:00

ffeige1984 发表于 2012-9-6 13:27 static/image/common/back.gif
网上有个开源的项目 这些代码都有 而且他们用的是就是自带的IIC,可以查下。 ...

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

zhengjiwu1977 发表于 2012-12-4 17:23:20

正要用,非常感谢。

yue621 发表于 2013-3-1 15:55:23

正要用,十分十分感谢楼主!另外想问楼主,400khz的速度,你是怎么测出来的呢?
以及,程序里面能不能随意更改IIC速率呢?谢谢楼主!

jmp2002911911 发表于 2013-3-3 17:47:26

楼主能做到这么彻底的分享,伟大!!

jslx 发表于 2013-3-5 10:40:43

顶死楼主,这么牛叉 学习中。。。。

huangbing110110 发表于 2013-3-9 22:21:13

ffeige1984 发表于 2012-9-6 13:27 static/image/common/back.gif
网上有个开源的项目 这些代码都有 而且他们用的是就是自带的IIC,可以查下。 ...

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

huangbing110110 发表于 2013-3-11 17:45:55

本帖最后由 huangbing110110 于 2013-3-11 17:48 编辑

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

zigbee503 发表于 2013-3-11 18:04:00

{:handshake:}学习了,谢谢分享!

flyforyou85 发表于 2013-3-20 22:26:31

希望能从中学习到有用的东西!谢谢!

flyforyou85 发表于 2013-3-26 10:42:11

多谢分享,我正在找!

炎阳 发表于 2013-4-7 15:33:19

好的。多谢{:lol:}

WITSOFT 发表于 2013-4-7 21:47:12

好东西啊,感谢楼主分享~

sssss08 发表于 2013-4-21 18:01:56

感谢楼主分享

我不乐意啊 发表于 2013-4-21 20:07:48

很不错!赞一个!

rantingting 发表于 2013-4-21 21:50:55

开源精神最伟大,LZ很好,我现在也在搞这一块,不过需要用SPI,目前还在调试中,要是有人能像lZ一样开源就好了,省得我再费那么多时间,或者我搞出来也会毫不犹豫开源的{:lol:}

Farid 发表于 2013-4-27 15:59:31

楼主的东西不错正好用到了……还没检验怎么样

divineliu 发表于 2013-4-27 16:16:36

四轴就是热门

rantingting 发表于 2013-5-21 15:57:50

找到好东西了,哈哈

WUST_LJS 发表于 2013-5-21 22:59:59

感谢共享

ye51 发表于 2013-5-25 01:22:42

谢了,参考参考,我正在做跟楼主差不多的东西,

hpzhyj113 发表于 2013-6-21 10:12:21

感谢楼主 学习下

dawnos 发表于 2013-7-15 00:45:26

太棒了!!正在做一模一样的~~

lukefan2008 发表于 2013-8-5 03:28:01

谢谢楼主分享,就是小弟还有个不情之请,能不能麻烦楼主把元器件PCB的封装给小弟也发一份啊,感激不尽

小乖 发表于 2013-8-13 17:21:33

下载了,帮顶{:tongue:}{:tongue:}

mooreg 发表于 2013-8-13 17:25:42

留着再说。

zhenchi 发表于 2013-8-17 21:26:33

楼主赞一个。先下一个先。你这个最终是做成了什么东西?

robot_abc 发表于 2013-8-28 17:46:54

谢谢楼主,资料很好用

沐风野草 发表于 2013-8-30 01:10:00

看到这么多传感器应该是做四轴飞行器,感谢楼主

沐风野草 发表于 2013-8-30 01:11:05

hpy168888 发表于 2012-9-17 20:03 static/image/common/back.gif
哪有STM32做四轴的开源资料?~

开源?资料卖40000多啊

杨闯 发表于 2013-8-30 11:32:43

plc_avr 发表于 2012-9-6 11:14 static/image/common/back.gif
多谢共享,为何不用硬件IIC?

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

feixiang1990 发表于 2013-8-31 00:10:49

ta太需要了 谢谢楼主

想飞的四轴 发表于 2013-9-1 11:16:48

自讨解算看懂了    卡尔曼滤波部分怎么写?

对妮说 发表于 2013-9-1 22:28:56

哇,,我也在网上买了一个相同的模块 ,上面的BMP085有点不靠谱

nds_shenzhen 发表于 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有什么寓意吗

danielmi 发表于 2013-9-3 16:24:29

谢谢分享!!!

keepmoving29 发表于 2013-9-23 11:01:22

非常好的东西,多谢

shuizhb 发表于 2013-10-5 00:52:59

正在学习四轴...thx

firstzys 发表于 2013-11-16 11:45:55

多谢了啊!!{:victory:}

tud3tud3 发表于 2013-12-11 11:57:41

感謝分享囉

hhhhhchch1 发表于 2013-12-11 14:53:36

谢谢分享!

LVmcu 发表于 2013-12-11 15:35:08

你好:BMP085可以测真空泵的压力吗?

chushibinsaobao 发表于 2013-12-11 17:03:49

感谢分享!

蒋盼盼 发表于 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吗   。。。。恳求楼主回帖。。。

a364669932 发表于 2014-1-9 16:17:15

不错。这个必须顶一顶。

w3154 发表于 2014-1-17 16:39:05

顶,正在学习,感谢分享。

shangso 发表于 2014-1-22 09:49:52

MARK一下有时间准备搞一下

SAILOR_HB 发表于 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_ttemp_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_ttemp_ut;
改成 uint16_ttemp_ut;
即可.经实际测试,改后一切正常.

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

arno_gsm 发表于 2014-3-2 02:21:32

多謝版主分享!!!

hfjydq 发表于 2014-4-14 11:02:43

蒋盼盼 发表于 2013-12-19 11:14
/*---------------------*
*   HMC5883 校正参数   *
*----------------------*/


你验证了吗?适合吗??

hfjydq 发表于 2014-4-16 10:21:11

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

会磁力计的椭球校正吗

棋间卒 发表于 2014-6-5 17:26:16

楼主的程序写的很有条理性,一般电子出身的一开始的程序就是if else.慢慢的程序读的多了,追求的就是条理性,移植性,模块化,深感其受

fiaanull 发表于 2014-7-1 12:03:57

感谢楼主了,最近看STM32的I2C折腾啊,楼主资料看看再说

jiangtianyu007 发表于 2014-7-1 17:12:51

但是模拟I2C有一个不好,不能配合使用DMA传输了。

LearningASM 发表于 2014-10-28 16:43:11

我没回复过?看来是忘记了

CMika 发表于 2014-10-28 17:01:49


MARK一下   坛里资料真多

xly2014 发表于 2014-11-4 12:19:43

stm32模拟I2C驱动 L3G4200,ADXL345,HMC5883,BMP085中文资料

chenpeng0407 发表于 2014-11-10 13:28:04

谢谢大神啦{:smile:}

很难发现 发表于 2015-2-12 16:28:55

{:victory:} 谢谢分享,mark一下。

liang121680 发表于 2015-2-12 17:30:08

据说smt32的硬i2c有bug?

Zenmvol 发表于 2016-3-7 08:44:14

感谢分享!!!!!!!!

wushifeng 发表于 2016-6-20 17:53:19

谢谢分享
页: [1]
查看完整版本: stm32模拟I2C驱动L3G4200,ADXL345,HMC5883,BMP085成功,含大量中文资料