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资料下载:
模拟的IIC速度能达到多少? 400KHz速度
我测过时钟高电平持续时间低至500ns,低电平近2us时间,时钟为400KHz略超一点 多谢共享,为何不用硬件IIC? 说来惭愧,用STM32硬件I2C中断驱动失败了,运行着有事莫名其妙的就不能正常读取数据了,还是用模拟的移植性好,方便稳定 没有电机接口? 用串口控制我自作的电调! 打个记号先 MARK 网上有个开源的项目 这些代码都有 而且他们用的是就是自带的IIC,可以查下。 wanxuncpx 发表于 2012-9-6 12:00 static/image/common/back.gif
用串口控制我自作的电调!
为什么我看不到有人用SPI的,不是SPI也支持的吗?还有听说STM32 硬件I2C有bug, 网上那些应硬件I2C的怎么做出来的???? 顶,学习学习。蓝牙模块貌似的跟我用的一样。 哎 。。 其实严格的说 模拟的IIC也很不稳定, 我最近就遇到过着问题 还是好好扣一扣硬件的IIC比较好 。。。 学习一下,感谢分享 楼主能提供一些HMC5883的资料吗?能有源码最好了。这个从X,Y,Z读出来的数据要怎么换算成方位? 谢谢楼主分享,我也在做这个东西 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);
} 看了电路原理图,我觉得用蓝牙通讯效果没有用NRF24L01无线模块的效果好。楼主知道怎么接上这个模块么? 研究一下,最近也在用I2C 驱动pcf8563, 用的硬件的,加了大量的延迟,否则会死在判断标志处, 读一次时间要70ms; 在准备换模拟的试一试 楼主吧 所用芯片的固件库也上传上去吧!{:handshake:} 楼主好人啊 非常好的东西,多谢 本帖最后由 chengying 于 2012-11-9 09:22 编辑
谢谢,资料真齐全,向你好好学习,有什么好资料就传到这来
楼主果然好人,毫无保留地开源。赞! 谢谢,楼主无私共享的资料。 非常的好,谢谢分享。 正在研究adxl345.。。一直不能正常工作 mark一下啦 正在学习四轴...thx 楼主的程序写得真的是很工整啊,函数、文件的命名分类清晰,注释明了,格式规范一致,真的是好代码;提供的资料也齐全,帖子图文并茂。
这么好的帖子,怎么关注的人这么少呢。 {:victory:} 嗯 写的很整洁 好东西啊,感谢楼主分享~
好呀,Mark {:biggrin:} ffeige1984 发表于 2012-9-6 13:27 static/image/common/back.gif
网上有个开源的项目 这些代码都有 而且他们用的是就是自带的IIC,可以查下。 ...
开源的stm32 IIC??给个链接呗,谢谢 正要用,非常感谢。 正要用,十分十分感谢楼主!另外想问楼主,400khz的速度,你是怎么测出来的呢?
以及,程序里面能不能随意更改IIC速率呢?谢谢楼主! 楼主能做到这么彻底的分享,伟大!! 顶死楼主,这么牛叉 学习中。。。。 ffeige1984 发表于 2012-9-6 13:27 static/image/common/back.gif
网上有个开源的项目 这些代码都有 而且他们用的是就是自带的IIC,可以查下。 ...
不麻烦的话帮忙这个网址啥,,不好找哦,, 本帖最后由 huangbing110110 于 2013-3-11 17:48 编辑
问你下,你的程序中bmp805读压强时候(bmp085ReadPressure())压强为什么没有加XLSB datasheet中计算式要加哦,,, {:handshake:}学习了,谢谢分享! 希望能从中学习到有用的东西!谢谢! 多谢分享,我正在找! 好的。多谢{:lol:} 好东西啊,感谢楼主分享~
感谢楼主分享
很不错!赞一个! 开源精神最伟大,LZ很好,我现在也在搞这一块,不过需要用SPI,目前还在调试中,要是有人能像lZ一样开源就好了,省得我再费那么多时间,或者我搞出来也会毫不犹豫开源的{:lol:} 楼主的东西不错正好用到了……还没检验怎么样 四轴就是热门 找到好东西了,哈哈 感谢共享 谢了,参考参考,我正在做跟楼主差不多的东西, 感谢楼主 学习下 太棒了!!正在做一模一样的~~ 谢谢楼主分享,就是小弟还有个不情之请,能不能麻烦楼主把元器件PCB的封装给小弟也发一份啊,感激不尽 下载了,帮顶{:tongue:}{:tongue:} 留着再说。 楼主赞一个。先下一个先。你这个最终是做成了什么东西? 谢谢楼主,资料很好用 看到这么多传感器应该是做四轴飞行器,感谢楼主 hpy168888 发表于 2012-9-17 20:03 static/image/common/back.gif
哪有STM32做四轴的开源资料?~
开源?资料卖40000多啊 plc_avr 发表于 2012-9-6 11:14 static/image/common/back.gif
多谢共享,为何不用硬件IIC?
32的I2C比较鸡肋~用起来效果比较差 ta太需要了 谢谢楼主 自讨解算看懂了 卡尔曼滤波部分怎么写? 哇,,我也在网上买了一个相同的模块 ,上面的BMP085有点不靠谱 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有什么寓意吗 谢谢分享!!! 非常好的东西,多谢 正在学习四轴...thx 多谢了啊!!{:victory:} 感謝分享囉 谢谢分享! 你好:BMP085可以测真空泵的压力吗? 感谢分享! /*---------------------*
* 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吗 。。。。恳求楼主回帖。。。 不错。这个必须顶一顶。 顶,正在学习,感谢分享。 MARK一下有时间准备搞一下 挖个坟.顺便修正楼主代码中的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;
即可.经实际测试,改后一切正常.
相信有不少同学也被此问题困扰,在此小弟先给出解决方案了.不谢. 多謝版主分享!!! 蒋盼盼 发表于 2013-12-19 11:14
/*---------------------*
* HMC5883 校正参数 *
*----------------------*/
你验证了吗?适合吗?? wanxuncpx 发表于 2012-9-6 11:32
说来惭愧,用STM32硬件I2C中断驱动失败了,运行着有事莫名其妙的就不能正常读取数据了,还是用模拟的移植性好, ...
会磁力计的椭球校正吗 楼主的程序写的很有条理性,一般电子出身的一开始的程序就是if else.慢慢的程序读的多了,追求的就是条理性,移植性,模块化,深感其受 感谢楼主了,最近看STM32的I2C折腾啊,楼主资料看看再说 但是模拟I2C有一个不好,不能配合使用DMA传输了。 我没回复过?看来是忘记了
MARK一下 坛里资料真多 stm32模拟I2C驱动 L3G4200,ADXL345,HMC5883,BMP085中文资料 谢谢大神啦{:smile:} {:victory:} 谢谢分享,mark一下。 据说smt32的硬i2c有bug? 感谢分享!!!!!!!! 谢谢分享
页:
[1]