社区首页
技术讨论创新帖
全部新帖
资料区
社区活动
联系管理员
★ 社区积分制度
★ 新手必读
★ 申请版主★
请
登录
后使用快捷导航
没有帐号?
注册
首页
|
电子技术
|
嵌入式
模拟电子
单片机
电源管理
传感器
半导体
电子应用
|
工业控制
物联网
汽车电子
网络通信
医疗电子
手机便携
测试测量
安防电子
家用电子
机器人
新能源
电子头条
|
社区
|
论坛
测评
博客
大学堂
|
下载
|
下载中心
电路图
精品文集
电路图
|
参考设计
|
Datasheet
|
活动
|
直播
datasheet
datasheet
文章
搜索
登录
注册
中文
En
论坛
切换旧版
电子工程世界-论坛
»
论坛
›
电子技术交流
›
国产芯片交流
›
上海航芯ACM32G103开发板学习笔记09(大气压BMP180驱动 ...
返回列表
发新帖
回复
阅
533
|
回
0
qzc0927
当前离线
一粒金砂(高级)
最后登录
2025-1-25
在线时间
41 小时
威望
359分
芯积分
299分
(兑换)
E金币
50枚
(兑换)
(兑换)
好友
1
qzc0927
147
帖子
0
TA的资源
一粒金砂(高级)
+ 好友
私信
楼主
发表于2024-1-16 13:59
只看该作者
上海航芯ACM32G103开发板学习笔记09(大气压BMP180驱动)
[复制链接]
## ==11:IIC传感器BMP180驱动== ### 11.1:硬件接口 BMP180是一款数字气压传感器,由德国公司Bosch Sensortec开发。它采用了微电机系统(MEMS)技术,可以测量大气压力和温度。该传感器采用低功耗设计,可通过I2C总线与微控制器或单片机通信。BMP180具有高精度和快速响应的特点,适用于气压计、天气预报、高度测量、室内导航等应用领域。它的工作温度范围广泛,从-40摄氏度到+85摄氏度。此外,BMP180还提供了温度补偿功能,可以减少温度对气压测量的影响。 ![image-20240116133317279](https://boreyun.oss-cn-shanghai.aliyuncs.com/image-20240116133317279.png) 硬件接口分布: ![image-20240116133350073](https://boreyun.oss-cn-shanghai.aliyuncs.com/image-20240116133350073.png) ### 11.2:软件设计 采用模拟IIC的方式来进行实现。具体实现思路如下: 1:配置GPIO引脚状态。 ```C //初始化IIC void IIC_Init(void) { GPIO_InitTypeDefGPIO_InitStruct; /* EnableClock */ BSP_BMP180_CLK_ENABLE(); GPIO_InitStruct.Pin = BSP_BMP180_SCL_PIN|BSP_BMP180_SDA_PIN; GPIO_InitStruct.Mode = BSP_BMP180_MODE; GPIO_InitStruct.Pull = BSP_BMP180_PULL; GPIO_InitStruct.Drive = BSP_BMP180_DRIVE; GPIO_InitStruct.Alternate = BSP_BMP180_ALTERNATE; GPIO_Init(BSP_BMP180_GPIO, &GPIO_InitStruct); GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SCL_PIN, GPIO_PIN_SET); GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SDA_PIN, GPIO_PIN_SET); } ``` 2:配置模拟IIC的时序 ```C void SDA_OUT(void) { GPIO_InitTypeDefGPIO_InitStruct; /* EnableClock */ BSP_BMP180_CLK_ENABLE(); GPIO_InitStruct.Pin = BSP_BMP180_SDA_PIN; GPIO_InitStruct.Mode = BSP_BMP180_MODE; GPIO_InitStruct.Pull = BSP_BMP180_PULL; GPIO_InitStruct.Drive = BSP_BMP180_DRIVE; GPIO_InitStruct.Alternate = BSP_BMP180_ALTERNATE; GPIO_Init(BSP_BMP180_GPIO, &GPIO_InitStruct); } void SDA_IN(void) { GPIO_InitTypeDefGPIO_InitStruct; /* EnableClock */ BSP_BMP180_CLK_ENABLE(); GPIO_InitStruct.Pin = BSP_BMP180_SDA_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = BSP_BMP180_PULL; GPIO_InitStruct.Drive = BSP_BMP180_DRIVE; GPIO_InitStruct.Alternate = BSP_BMP180_ALTERNATE; GPIO_Init(BSP_BMP180_GPIO, &GPIO_InitStruct); } //产生IIC起始信号 void IIC_Start(void) { SDA_OUT(); //sda线输出 GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SDA_PIN, GPIO_PIN_SET); GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SCL_PIN, GPIO_PIN_SET); delay_us(4); GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SDA_PIN, GPIO_PIN_RESET);//START:when CLK is high,DATA change form high to low delay_us(4); GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SCL_PIN, GPIO_PIN_RESET);//钳住I2C总线,准备发送或接收数据 } //产生IIC停止信号 void IIC_Stop(void) { SDA_OUT();//sda线输出 GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SCL_PIN, GPIO_PIN_RESET); GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SDA_PIN, GPIO_PIN_RESET);//STOP:when CLK is high DATA change form low to high delay_us(4); GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SCL_PIN, GPIO_PIN_SET); GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SDA_PIN, GPIO_PIN_SET); //发送I2C总线结束信号 delay_us(4); } //等待应答信号到来 //返回值:1,接收应答失败 // 0,接收应答成功 uint8_t IIC_Wait_Ack(void) { uint8_t ucErrTime=0; SDA_IN(); //SDA设置为输入 GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SDA_PIN, GPIO_PIN_SET); delay_us(1); GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SCL_PIN, GPIO_PIN_SET); delay_us(1); while(GPIO_ReadPin(BSP_BMP180_GPIO,BSP_BMP180_SDA_PIN)) //IO口数据读入 { ucErrTime++; if(ucErrTime>250) { IIC_Stop(); return 1; } } GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SCL_PIN, GPIO_PIN_RESET);//时钟输出0 return 0; } //产生ACK应答 void IIC_Ack(void) { GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SCL_PIN, GPIO_PIN_RESET); SDA_OUT(); //释放一个数据线时,ACK应答信号为0时 GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SDA_PIN, GPIO_PIN_RESET); //发送成功 delay_us(2); GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SCL_PIN, GPIO_PIN_SET); delay_us(2); GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SCL_PIN, GPIO_PIN_RESET); } //不产生ACK应答 void IIC_NAck(void) { GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SCL_PIN, GPIO_PIN_RESET); SDA_OUT(); GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SDA_PIN, GPIO_PIN_SET); delay_us(2); GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SCL_PIN, GPIO_PIN_SET); delay_us(2); GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SCL_PIN, GPIO_PIN_SET); } //IIC发送一个字节 //返回从机有无应答 //1,有应答 //0,无应答 void IIC_Send_Byte(uint8_t txd) { uint8_t t; SDA_OUT(); //数据输出 GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SCL_PIN, GPIO_PIN_RESET); for(t=0;t<8;t++) { if((txd&0x80)>>7) { GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SDA_PIN, GPIO_PIN_SET); } else { GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SDA_PIN, GPIO_PIN_RESET); } txd<<=1; delay_us(2); //对TEA5767这三个延时都是必须的 GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SCL_PIN, GPIO_PIN_SET); delay_us(2); GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SCL_PIN, GPIO_PIN_RESET); delay_us(2); } } //读1个字节,ack=1时,发送ACK,ack=0,发送nACK uint8_t IIC_Read_Byte(unsigned char ack) { uint8_t i,receive=0; SDA_IN(); //SDA设置为输入 for(i=0;i<8;i++ ) { GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SCL_PIN, GPIO_PIN_RESET); delay_us(2); GPIO_WriteBit(BSP_BMP180_GPIO, BSP_BMP180_SCL_PIN, GPIO_PIN_SET); receive<<=1; if(GPIO_ReadPin(BSP_BMP180_GPIO,BSP_BMP180_SDA_PIN))receive++; //如果数据输出了,读取一个字节 delay_us(1); } if (!ack) IIC_NAck();//发送nACK else IIC_Ack(); //发送ACK return receive; } ``` 3:bmp180驱动 ```C //BMP180初始化 //对使用的IIC端口进行初始化 void drv_bmp_init(void) { IIC_Init(); } //写一个数据到BMP180 void BMP_WriteOneByte(uint8_t WriteAddr,uint8_t DataToWrite) { IIC_Start(); IIC_Send_Byte(0xEE);//发送一个字节(地址为 Module address 0cEE) IIC_Wait_Ack();//等待 IIC_Send_Byte(WriteAddr);//发送字节的地址 IIC_Wait_Ack(); IIC_Send_Byte(DataToWrite);//发送字节地址中的数据 IIC_Wait_Ack(); IIC_Stop(); } //从BMP180读一个字节数据 uint8_t BMP_ReadOneByte(uint8_t ReadAddr) { uint8_t data = 0; IIC_Start(); IIC_Send_Byte(0xEE); IIC_Wait_Ack(); IIC_Send_Byte(ReadAddr); IIC_Wait_Ack(); IIC_Start(); IIC_Send_Byte(0xEF); //把读取的字节存到下一个地址(0xef)中去 IIC_Wait_Ack(); data = IIC_Read_Byte(1); //读取地址总的字节 IIC_Stop(); return data; } //从BMP180读一个16位的数据 short BMP_ReadTwoByte(uint8_t ReadAddr) { short data; uint8_t msb,lsb; IIC_Start(); IIC_Send_Byte(0xEE);//发送字节(地址为 Module address 0cEE) IIC_Wait_Ack(); IIC_Send_Byte(ReadAddr); IIC_Wait_Ack(); IIC_Start(); IIC_Send_Byte(0xEF);//把读取的字节存到下一个地址(0xef)中去 IIC_Wait_Ack(); msb = IIC_Read_Byte(1);//读取16位的高八位 lsb = IIC_Read_Byte(0);//读取16位的低八位 IIC_Stop(); data = msb*256 + lsb;//以16位的二进制数据给data return data; } //从BMP180的获取计算参数 void BMP_ReadCalibrationData(void) { bmp180.AC1 = BMP_ReadTwoByte(0xAA); bmp180.AC2 = BMP_ReadTwoByte(0xAC); bmp180.AC3 = BMP_ReadTwoByte(0xAE); bmp180.AC4 = BMP_ReadTwoByte(0xB0); bmp180.AC5 = BMP_ReadTwoByte(0xB2); bmp180.AC6 = BMP_ReadTwoByte(0xB4); bmp180.B1= BMP_ReadTwoByte(0xB6); bmp180.B2= BMP_ReadTwoByte(0xB8); bmp180.MB= BMP_ReadTwoByte(0xBA); bmp180.MC= BMP_ReadTwoByte(0xBC); bmp180.MD= BMP_ReadTwoByte(0xBE); } //从BMP180读取未修正的温度 long BMP_Read_UT(void) { long temp = 0; BMP_WriteOneByte(0xF4,0x2E); DelayMs(5); temp = (long)BMP_ReadTwoByte(0xF6); return temp; } //从BMP180读取未修正的大气压 long BMP_Read_UP(void) { long pressure = 0; BMP_WriteOneByte(0xF4,0x34); DelayMs(5); pressure = (long)BMP_ReadTwoByte(0xF6); //pressure = pressure + BMP_ReadOneByte(0xf8); pressure &= 0x0000FFFF; //位运算,将pressure中的高八位清0,低八位保留 return pressure; } //用获取的参数对温度和大气压进行修正,并计算海拔 void BMP_UncompemstatedToTrue(void) { bmp180.UT = BMP_Read_UT();//第一次读取错误测试的实际的温度值只有-78度 海拔高度有2500多米(改变延时没用) bmp180.UT = BMP_Read_UT();//进行第二次读取修正参数读取两次温度值正确 bmp180.UP = BMP_Read_UP();//第一次读取压强值 /**--得到温度值--**/ bmp180.X1 = ((bmp180.UT - bmp180.AC6) * bmp180.AC5) >> 15; bmp180.X2 = (((long)bmp180.MC) << 11) / (bmp180.X1 + bmp180.MD); bmp180.B5 = bmp180.X1 + bmp180.X2; bmp180.Temp= (bmp180.B5 + 8) >> 4; /**--得到气压值--**/ bmp180.B6 = bmp180.B5 - 4000; bmp180.X1 = ((long)bmp180.B2 * (bmp180.B6 * bmp180.B6 >> 12)) >> 11; bmp180.X2 = ((long)bmp180.AC2) * bmp180.B6 >> 11; bmp180.X3 = bmp180.X1 + bmp180.X2; bmp180.B3 = ((((long)bmp180.AC1) * 4 + bmp180.X3) + 2) /4; bmp180.X1 = ((long)bmp180.AC3) * bmp180.B6 >> 13; bmp180.X2 = (((long)bmp180.B1) *(bmp180.B6*bmp180.B6 >> 12)) >>16; bmp180.X3 = ((bmp180.X1 + bmp180.X2) + 2) >> 2; bmp180.B4 = ((long)bmp180.AC4) * (unsigned long)(bmp180.X3 + 32768) >> 15; bmp180.B7 = ((unsigned long)bmp180.UP - bmp180.B3) * 50000; if(bmp180.B7 < 0x80000000) { bmp180.p = (bmp180.B7 * 2) / bmp180.B4; } else { bmp180.p = (bmp180.B7 / bmp180.B4) * 2; } bmp180.X1 = (bmp180.p >> 8) * (bmp180.p >>8); bmp180.X1 = (((long)bmp180.X1) * 3038) >> 16; bmp180.X2 = (-7357 * bmp180.p) >> 16; bmp180.p = bmp180.p + ((bmp180.X1 + bmp180.X2 + 3791) >> 4); /**--得到海拔高度--**/ bmp180.altitude = 44330 * (1-pow(((bmp180.p) / 101325.0),(1.0/5.255))); } ``` ### 11.3:测试结果输出 ![image-20240116134619398](https://boreyun.oss-cn-shanghai.aliyuncs.com/image-20240116134619398.png) 实物接线图: ![image-20240116134739117](https://boreyun.oss-cn-shanghai.aliyuncs.com/image-20240116134739117.png)
此帖出自
国产芯片交流论坛
点赞
关注
(0)
回复
分享
扫一扫,分享给好友
复制链接分享
链接复制成功,分享给好友
举报
提升卡
变色卡
千斤顶
返回列表
发新帖
回复
您需要登录后才可以回帖
登录
|
注册
发表回复
回帖后跳转到最后一页
活动
更多>>
DigiKey 应用探索站 | 无线技术盛宴第二趴
有奖直播 | ADI 超低功耗 MCU MAX326xx 系列介绍
走近 AI 重磅新品 STM32N6,解锁在 MCU 部署高性能、节能型边缘 AI!答题有好礼~还有开发板等你拿!
Microchip 直播|多相降压电源控制技术的发展与探讨 报名中!
安世半导体智能工业应用探索站,闯关赢好礼!
24年年终盘点来啦!精选强推:原创、测评、拆解、视频、资料
PI 电源小课堂:集成式半桥驱动IC BridgeSwitch 2, 助力高效永磁同步电机逆变器的设计
Microchip喊你探索dsPIC33A 芯片,70份好礼等你赢!
开源项目
更多>>
AD9238BCPZ-20EB,用于 AD9238、2 通道、10 位、20 MSPS 模数转换器的评估板
LT3973IMSE-5 5V 降压转换器的典型应用,适用于汽车应用
AM6TW-2405SZ 5V 6 瓦双路输出 DC-DC 转换器的典型应用
L7824C输出稳压电路的典型应用
消费类电子产品PIC18 MCU开发系统
GS1084-1.8、5A 低压差正固定稳压器的典型应用
NCP301LSN31T1 3.1V 电压检测器的典型应用,用于具有附加迟滞的微处理器复位电路
EPT2080E,QorIQ PowerPCPCIe Board,用于开发基于QorIQ T2080的高性能网络控制设备
ALP电吉他内置耳放
NCP301LSN30T1 2.8V 电压检测器的典型应用,用于具有附加迟滞的微处理器复位电路
随便看看
DigiKey 应用探索站 | 无线技术盛宴第二趴
DigiKey应用探索站——无线技术盛宴第二趴来啦,小伙伴们,快来查收本月的无线技术干货~//当月好物•LT8418100V半桥GaN驱动器•MIC5501/2/3/4LDO•NCV8460高压侧智能分立驱动器•小信号P沟道和N沟道MOSFET•SRK1004同步整流控 ...
ROS2智能机器人开发实践-阅读分享9-机器人建模仿真
ROS2智能机器人开发实践-阅读分享8-cartograph建图
高效 SiC FET 的电源解决方案来了,快来看一下吧。
晒WEBENCH设计的过程+低通滤波器电路设计
MSP430G2553 1602显示字符
用阶乘实现小灯的闪烁
dB与放大倍数的关系
查找数据手册?
搜索
EEWorld Datasheet 技术支持
热门标签
源代码
单片机
放大器
TI
ST
电源
分立器件
传感器
测试测量
模拟
谐波抑制变压器
短路冲击电流
载波干扰比
导电陶瓷
邮局协议
加法器
多普勒
变流器
同名端
扼流圈
相关文章
更多>>
德州仪器 2024年Q4财报解析:中国市场增长亮眼,目前没有收到反垄断调查通知
在 2024 年第四季度收益电话会议上,德州仪器(TI)向外界展示了一些好消息,尤其是凸显了中国市场在其全球布局中的关键地位。 第四季度,TI 收入为 40 亿美元,环比下降 3%,比去年同期下
欧盟提议成立高级研究机构:专注于AI等战略技术以加强竞争力
据彭博社报道,欧盟将提议仿照美国政府实体建立一个高级研究项目机构,对战略技术进行投资,以此作为提高欧盟竞争力的更广泛努力的一部分。 欧盟还将呼吁为 AI 建设新的超级计算基础设施。知情人士及文件显示
传台积电报废三万片晶圆,三万片受损
晶圆代工龙头厂台积电位于南科的晶圆厂,受地震影响的机台设备移位、晶圆破损经过抢修后,供应链传出,3、 5纳米的先进制程晶圆十八厂,预计将于23日达100%复机,准备恢复正常生产,晶圆十四厂复机还没有
中国芯片出口连续14个月增长
特朗普退出巴黎协定,芯片业碳中和完了没?
汇顶科技 2024 年业绩亮眼,展现强劲发展韧性
谷歌母公司:美国AI难保证对华领先 不少方面是落后
消息称三星电子砍半晶圆代工部门 2025 年设备投资预算,陡降至 5 万亿韩元
史上最佳表现:SK 海力士 2024 年营业利润 23.5 万亿韩元
宇树发布“踢足球”机器人G1-Comp,网友:国足有救了
新帖速递
STM32和无源蜂鸣器播放声音的问题
车规级AECQ200介绍,混合铝电解电容器的选择
嵌入式教程_DSP技术_DSP实验箱操作教程:2-28 搭建轻量级WEB服务器实验
OPA847IDBVR运放器国产替代
AG32VF407测试UART
【得捷电子Follow Me第二期】第一章 收到货物的分享
请问这个红外接收头是什么型号?能用哪个型号代替?谢谢
出售全新未拆封ZYNQ 7Z020 FPGA核心板
用在锂电池供电的水表设置上的LORA模块,当有100块水表集中安装在一个楼道内时,节能
请问一下,当某个端口被设置为 RX0后,这个端口的输入输出方向还有必要设置吗
今年怎么这么难,比疫情时还难,三十了面临失业好迷茫
请教稳压管测试问题
【小华HC32F448测评】关于小华半导体的UART中断发送和PRINTF构造和重定向
【BIGTREETECH PI开发板】 HDMI输出测试
【BIGTREETECH PI开发板】+08.音频测试(zmj)
DigiKey 应用探索站 | 无线技术盛宴第二趴
当月好物、热门无线技术资源、特色活动、DigiKey在线实用工具,干货多多~
查看 »
开发板申请:拥有 AI 加持的 STM32N6570-DK 免费试用 !
申请时间:即日起-3月2日
查看 »
安世半导体智能工业应用探索站,闯关赢好礼!
点击页面内“开始探索”按钮,填写并提交表单;
请根据序号依次完成3个安世半导体智能工业应用的探索,并根据给出的资料完成共计9题(每个应用3题),答对5题以上的玩家即可获得抽奖资格;
每人仅有一次参与答题的机会,请慎重作答,活动结束后,我们将抽取30位玩家赠送礼品。
查看 »
Microchip 直播|多相降压电源控制技术的发展与探讨 报名中!
直播主题:多相降压电源控制技术的发展与探讨
直播时间:2025年2月25日(星期二)上午10:30-11:30
快来报名!
查看 »
答题赢好礼,PI电源小课堂第3期来啦!
本期内容:集成式半桥驱动IC BridgeSwitch 2, 助力高效永磁同步电机逆变器的设计
活动时间:即日起-2月28日
看视频答题即可赢取京东卡!
查看 »
本周精选下载推荐:电源管理基础Dummies
本周小编给大家带来一本超简单、超干货的电子书——《电源管理基础Dummies》!内容深入浅出,排版舒服简洁,分分钟能get到电源管理最核心的知识内容。
查看 »
关闭
站长推荐
1
/6
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
电信业务审批[2006]字第258号函
京公网安备 11010802033920号
Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复
返回顶部
返回列表
论坛首页
版块列表
专业技术中心
TI技术论坛
ST传感器与低功耗无线技术论坛
ADI参考电路
DigiKey得捷技术专区
ADI · 世健工业技术
电子技术交流
边缘AI
嵌入式系统
单片机
国产芯片交流
电机控制
FPGA/CPLD
模拟电子
电源技术
无线连接
传感器
PCB设计
综合技术交流
下载中心专版
大学堂专版
测评中心专版
行业应用
汽车电子
机器人开发
工业自动化与控制
能源基础设施
医疗电子
消费电子
创意与实践
电子竞赛
DIY/开源硬件专区
淘e淘
创意市集
休息一下
聊聊、笑笑、闹闹
工作这点儿事
为我们提意见&公告
EEWorld颁奖专区
信息发布
最新帖子
最新帖子
最新回复
精华
消灭零回复
测评中心
活动中心
积分兑换
E金币兑换
芯积分
厂商专区
TI技术论坛
ST传感器与低功耗无线技术论坛