数字式气压和温度传感器MPXY8020A介绍及驱动代码
数字式气压和温度传感器MPXY8020A介绍及驱动代码
Author:Once Day
Date:北部市保留地,2022年5月13日
文章目录
- 数字式气压和温度传感器MPXY8020A介绍及驱动代码
- 1.概述
- 2.MPXY8020A和Mcu的硬件连接
- 3.MPXY8020A的性能参数
- 3.1 待机电流在1uA级别及以下,温度测量电流在400uA,压力测量电流在1300uA左右。
- 3.2 ==温度测量公式和误差如下图所示==:
- 3.3 ==压力测量公式及误差如下所示==:
- 4. 数据通信及程序编写
- 4.1 时序约束
- 4.2 数据采样过程
- 4.3 代码设计
- 4.4 实际代码编写,基于msp430系列单片机
- 5. 封装信息
- 注:本内容收集整理于互联网,仅供学习交流之用。
1.概述
MPXY8020A是摩托罗拉公司于2003年推出的汽车轮胎气压监测传感器。其内部集成了气压传感器、温度传感器和数字接口电路,8引脚SSOP封装;能承受的最大气压为1400kPa。MPXY8020A的功耗比较低,特别适用于轮胎气压和温度监测系统。
压力传感器是使用表面微加工制造的电容式传感器,接口电路与传感器使用标准硅CMOS工艺集成在同一个模具上。压力信号的调理始于电容到电压转换(C到V),随后是开关电容放大器。这个放大器有可调的偏移量和增益微调。偏移量和增益被工厂校准,校准值存储在EEPROM微调寄存器中。该放大器还具有灵敏度和偏置的温度补偿电路,也使用EEPROM微调寄存器进行工厂调整。压力由电压比较器监控,它将测量值与由串行输入调整的8位阈值进行比较。通过调整阈值和监控OUT引脚的状态,外部设备可以检查是否已越过低压阈值,或执行多达8位的A /D转换。
温度由由电流源驱动的具有正温度系数的扩散电阻测量,从而产生电压。该电压的室温值是使用EEPROM微调寄存器进行工厂校准的。双通道多路复用器可以将压力或温度信号路由到采样电容,采样电容由具有可变阈值调整的电压比较器监控,提供温度的数字输出。
一个内部低频,低功率5.4 kHz振荡器,带有一个14级分频器,为OUT引脚提供一个周期脉冲(除以16384 3秒)。该脉冲可用于唤醒外部MCU,以开始与设备的接口。额外的10级分频器将每52分钟提供一个脉冲,可用于复位外部MCU。功耗可以通过外部引脚选择的几种操作模式来控制。
以上文字机翻自数据手册,下面简要说明一下:
- 可以测量温度,范围-40~125摄氏度,误差较大,误差在4-5摄氏度之间。
- 可以测量压力,合适的范围为250kPa~450kPa,但最大支持到1400kPa,此时可能损坏器件。
- 自带时钟,可以输出两种信号,用于控制外部MCU。
- 串行口是用来输入数据的,输出的信号只有高低电平,需要和单片机配合工作才能采集8位adc数据,然后再转化为实际温度或者压力。
内部原理图构造如下:
封装如下:
2.MPXY8020A和Mcu的硬件连接
VCC供电范围可在2.1v-3.6v,推荐在3.0-3.3v附近,比较合适。
注意供电的电压是会影响测量结果的!,所以具体的计算公式和误差校准需要根据实际供电的电压来计算。
如果VCC供电为0v,但管脚有高电平的,那么也会通过管脚上的二极管进行供电!因此,要把所有管脚拉低才能做到断电。
S1和S0是用来选择运行的模式的,都具有下拉电阻和施密特触发器以避免干扰:
无论处于何种模式下,多路通道复用器,D/A寄存器,LFO,输出分频器都是开启的。
当S1的管脚电压高于Vdd2.5倍时,将会进入EEPROM修改模式,此属于内置的调试端口。
OUT管脚在待机模式下,会每个3s输出一个脉冲:
请注意,在adc比较信号输出模式时,它不会输出这个3s一次的脉冲信号。
RST管脚可输出一个低脉冲信号,间隔是52mins,可作为外部单片机的定时复位信号。
==DATA和CLK组成单路串行通信,都具有下拉电阻和施密特触发器以避免干扰。==这两个直接连到单片机的IO管脚就好,然后使用模拟SPI协议传输数据。
3.MPXY8020A的性能参数
3.1 待机电流在1uA级别及以下,温度测量电流在400uA,压力测量电流在1300uA左右。
3.2 温度测量公式和误差如下图所示:
3.3 压力测量公式及误差如下所示:
4. 数据通信及程序编写
4.1 时序约束
根据表上要求,data边沿到clk的上升沿,其(data)电平建立时间最小需要100ns,然后此后data数据还要保持100ns才能更改,所以MCU的IO电平翻转速率要小于5Mhz,即通信速率要小于5Mhz。
可以看到,每一次数据输入的大小是一个字节,即8位。在每一个时钟的上升沿读取数据,在第8个下降沿把数据移向D/A数据寄存器中。
根据上表的要求,测量时,测量模式需要维持一段时间,温度为200us,压力为500us。
在读取MPXY8020A输出结果时(高低电平),需要一段响应时间,为50~100us.
采样电容的保持时间在20ms左右,超过这个时间需要手动刷新数据。
4.2 数据采样过程
信号的采样分两步完成:首先是把采样电容上的信号转换为电压信号,然后用开关式电容放大器对信号进行放大,以提高采样的准确度。
信号值的大小通过电压比较器确定。在信号转换前,外部微控制器通过MPXY8020A的数字接口输入8位极限值。片内8位DAC(数模转换器)把该值转换成相应的模拟电压,电压比较器把采样的电压值与该值进行比较,在OUT引脚输出比较后的结果。当采样值高于输入值时,OUT引脚为高电平;反之,为低电平。
也就是说,MPXY8020并不能输出任何数字信号,只能接收数字信号输入,然后通过一个D/A模块转变成模拟信号和采集到的数据对比,输入大或小两种状态。
因此如果只是阈值判断,编程非常简单,那就是把要判断的阈值输入进去就行了,然后判断输出管脚的高低就行。
如果想要得到准确的测量值,可以使用二次逼近法进行测量。即采用二分法进行多次比较。8位ADC,需要使用8次二分法,然后就可以把值确定在一个最小的区间里面。
因此,每次读温度数据需要 ( 1 u s ∗ 8 + 200 u s + 50 u s ) ∗ 8 = 2 m s (1us*8+200us+50us)*8=2ms (1us∗8+200us+50us)∗8=2ms或者最大2.4ms,每次读压力数据需要4.4ms至4.8ms。
需要注意,DAR(也就是存储8位极限值,对比值)的寄存器只能在待机模式或输出比较结果模式中可以写入。
4.3 代码设计
模拟SPI设计,根据时序图,CLK低电平为空闲模式,并在第一个上升沿采样,因此数据线信号先行,数据线低电平为0,高电平为1。
请注意,数据是高位先行。
这里延时1us是用于数据建立时间,数据保持时间应在CLK_H后再延迟一段时间,但这里没有这么做。原理很简要,目标单片机速率并不快,而且电路状态改变并不快,因此在下次data信号改变达到时,原来的数据已成功写入了。如果数据写入存在问题,则可以额外增加上延时函数,或者增长延时时间。
由于这里是整型数据,所以二次逼近法可设计成如下程序:
很明显,取值区间在0~255.
4.4 实际代码编写,基于msp430系列单片机
初始化管脚。
S1,S0,CLk,data,初始化为输出。
OUT和 RST,初始化为输入。
//mpxy8020a io口初始化
void mpxy8020a_io_init(void)
{//S1,S0,CLk,data,输出P2DIR |= BIT0+BIT2+BIT3+BIT4;P2OUT &=~(BIT0+BIT2+BIT3+BIT4);//输出置低(P2OUT|=(BIT2));(P2OUT&=~(BIT2));delay_ms(1);//OUT和 RST,输入P2DIR &=~(BIT1+BIT5);P2REN |=(BIT5);P2OUT |=(BIT5);//RST上拉
}
管脚宏定义,屏蔽底层硬件接口:
//管脚宏定义
#define MPXY8020A_S0_H (P2OUT|=(BIT2))
#define MPXY8020A_S0_L (P2OUT&=~(BIT2))#define MPXY8020A_S1_H (P2OUT|=(BIT0))
#define MPXY8020A_S1_L (P2OUT&=~(BIT0))#define MPXY8020A_CLK_H (P2OUT|=(BIT3))
#define MPXY8020A_CLK_L (P2OUT&=~(BIT3))#define MPXY8020A_DATA_H (P2OUT|=(BIT4))
#define MPXY8020A_DATA_L (P2OUT&=~(BIT4))#define MPXY8020A_OUT_IN (P2IN&(BIT1))//延时函数宏定义
#define delayus(x) delay_us(x)
四种模式切换代码,插入必要的延时。
//测量温度
void mpxy8020a_measure_temperature(void)
{MPXY8020A_S0_L;MPXY8020A_S1_H;delayus(200);//等待测量结束
}//测量压力
void mpxy8020a_measure_pressure(void)
{MPXY8020A_S0_H;MPXY8020A_S1_L;delayus(500);//等待测量结束
}
//待机模式
void mpxy8020a_standby(void)
{MPXY8020A_S0_L;MPXY8020A_S1_L;delayus(50);//等待一会
}
//读输出比较结果模式
void mpxy8020a_read(void)
{MPXY8020A_S0_H;MPXY8020A_S1_H;delayus(50);//等待读响应到来
}
发送一个字节数据给MPXY8020A:
//向MPXY8020a发送一个数据
void mpxy8020a_send_byte(char c)
{int i;for(i=7;i>=0;i--){if(c&(1<<i))//高位在前MPXY8020A_DATA_H;elseMPXY8020A_DATA_L;MPXY8020A_CLK_L;//cpu主频低于 1Mhz就不需要延时delay_us(10);MPXY8020A_CLK_H;delay_us(10);}MPXY8020A_CLK_L;
}
获取温度的代码:
//计算结果数据,放大100倍
int mpxy8020a_get_temperature(void)
{int min=0,max=255;int value=0,output=0;double temp=0.0;while(1){value=(int)((min+max)/2);//取一半的值//待机模式下发送数据mpxy8020a_standby();//发送数据mpxy8020a_send_byte((char)(value&0xff));//开启测量mpxy8020a_measure_temperature();//输出结果mpxy8020a_read();if(MPXY8020A_OUT_IN)//判断是否为真{//真表示实际值大于给出的阈值if(max-min<=2){output=max;break;//可以结束了}else{min=value;//重新选取范围}}else{//此时给出的阈值大于真实值if(max-min<=2){output=min;break;//可以结束了}else{max=value;//重新选取范围}}}//待机模式下发送数据mpxy8020a_standby();//根据公式计算实际温度值 output=74.7461 + 0.9752*Temperature+0.0041*(Temperature)^2//解此方程可得//注意精准计算需要根据数据手册制表查找,并且根据实际情况进行校准。temp=sqrt(-4087.1654+(double)output/0.0041)-118.926829;return (int)(temp*100);
}
获取压力的代码:
//计算结果数据
int mpxy8020a_get_pressure(void)
{float pressure_error=7.5;//3.0v 25摄氏度误差,具体根据手册的表格确定int min=0,max=255;int value=0,output=0;double temp=0.0;while(1){value=(int)((min+max)/2);//取一半的值//待机模式下发送数据mpxy8020a_standby();//发送数据mpxy8020a_send_byte((char)(value&0xff));//开启测量mpxy8020a_measure_pressure();//输出结果mpxy8020a_read();if(MPXY8020A_OUT_IN)//判断是否为真{//真表示实际值大于给出的阈值if(max-min<=2){output=max;break;//可以结束了}else{min=value;//重新选取范围}}else{//此时给出的阈值大于真实值if(max-min<=2){output=min;break;//可以结束了}else{max=value;//重新选取范围}}}//待机模式下发送数据mpxy8020a_standby();//根据公式计算实际气压值temp=output*2.5+-(pressure-error)//注意精准计算需要根据数据手册制表查找,并且根据实际情况进行校准。//不减去误差temp=(double)output*2.5;return (int)(temp);
}
使用时,依次调用,后面两个函数即可。
5. 封装信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4lMzCpdF-1652605567344)(数字式气压和温度传感器MPXY8020A介绍及驱动代码.assets/image-20220515163452562.png)]
注:本内容收集整理于互联网,仅供学习交流之用。
数字式气压和温度传感器MPXY8020A介绍及驱动代码相关推荐
- FPGA_DS18B20温度传感器手册介绍以及接口代码编写思路
一. DS18B20大概介绍 1. Power 电源可以用 parasite power 或者 external power,普遍选择外部电源 2. DS18B20内部存储一共有9个字节 (1).DS ...
- DS1307驱动代码
DS1307实时时钟芯片的介绍及驱动代码 目录 一.DS1307是什么? 二.DS1307的功能 三.DS1307的寄存器 四.代码 1.读出数据 2.写入数据 3.时间初始化设置 4.获取当前时间 ...
- Linux kernel 中模块化的平台驱动代码介绍
介绍 在linux kernel中通过module_platform_driver来实现模块化平台驱动.大量的设备驱动程序都基于该种方式来实现,使用频次非常的高,在linux kernel 5.4.1 ...
- 安卓平台下的GPS架构介绍及驱动移植记录
一.前言 我的工作是关于汽车车机BSP部分. 汽车车机,其实基本和人们日常所用的手机一样,也是安卓平台的.所谓安卓,就是一层安卓服务包裹着Linux内核所形成的操作系统. BSP组,主要工作内容就是负 ...
- 使用Arduino开发板和气压、温度传感器制作实时气象站
使用Arduino开发板.RTC.气压和温度传感器可以轻松实现类似实时气象站这样简单的小型项目.在生活中,我们使用温度计来测量温度,身边没有任何可测量气压的设备,因此只能依靠新闻得知当前地区的气压.因 ...
- 传感器:土壤湿度传感器(XH-M214)介绍及stm32驱动代码
土壤湿度传感器(XH-M214)及stm32驱动代码 XH-M214简介 stm32驱动 XH-M214 protues测试 本篇主要介绍:stm32f103 ADC读取电压 采集土壤湿度传感器(XH ...
- MS5611气压计 I2C驱动代码 STM32
文章目录 前言 通信接口:IIC 一,MS5611的5种命令 RESET : 重启芯片 READ PROM: D1,D2 CONVERSION READ ADC RESULT: 二,实现代码 1 初始 ...
- AMG8833的使用与stm32驱动代码
一.介绍 1.内部框图 可以看到AMG8833的内部有红外点阵测温,并且还带有一个热敏电阻.使用同一个ADC进行采样,然后送给Control. 2.器件参数 测温点数:64(8x8的矩阵) 帧率:10 ...
- 树莓派IO口驱动代码的编写、微机总线地址、物理地址、虚拟地址、BCM2835芯片手册
地址总线: 百度百科解释: 地址总线 (Address Bus:又称:位址总线) 属于一种电脑总线 (一部份),是由CPU 或有DMA 能力的单元,用来沟通这些单元想要存取(读取/写入)电脑内存元件/ ...
最新文章
- 【python】数据结构与算法—双端队列(二)
- java中将对象转为基本数据类型
- PHP 单一入口程序
- 【vue报错】——listen EADDRINUSE :::8080 解决方案
- Windows 7/Vista 桌面上为何有两个隐含的 Desktop.INI
- [慢查优化]联表查询注意谁是驱动表 你搞不清楚谁join谁更好时请放手让mysql自行判定...
- sphereface conv64
- 力扣算法题—076最小覆盖子串
- 在Pocket PC/Smartphone智能设备上编写压缩程序(特别简单,任何人都能简单使用)...
- c语言中的单词的意思及作用,c语言入门必背单词 具体含义是什么
- 找出回文字符串用c语言写,寻找回文字符串
- Github上找到开源的《植物大战僵尸》代码分享~
- 数字基础设施可视化管理,任重而道远
- 【JS ES6】use strict 严格模式
- 票务网 php,电影票务网站的设计与制作
- 麻了,别再为难软件测试员了
- const的小把戏。
- C语言中的逗号的作用,c语言中什么是逗号运算符并举例
- 熵(entropy)的定义
- 2023年英语二大作文押题猜想(达立易考)
热门文章
- 盘点那些你不知道却很有效果的网络推广方法
- 记自己发现的—SM2国密算法应用的高危漏洞—CVE-2021-3711
- python3 manage.py startapp catalog 执行成功但未生成 catalog文件夹 解决办法
- “快到没朋友”的目标检测模型YOLO v3问世,之后arXiv垮掉了…
- 在阿里“解放”鉴黄师是一种怎样的体验
- sample.exe 病毒分析
- mgr.exe病毒导致启动程序启动失败
- WPF 学习总结归纳之发布订阅与代理模式以及命令的投石问路(一)
- 忙是治疗一切神经病的良药
- camera中文版软件 ip_ip camera软件下载-IP Camera Viewer(网络摄像机监控软件)下载 v4.09官方版--pc6下载站...