资讯详情

数字式气压和温度传感器MPXY8020A介绍及驱动代码

数字气压和温度传感器MPXY8020A介绍和驱动代码

Author:Once Day

Date:北部市保留地,2022年5月13日

文章目录

    • 数字气压和温度传感器MPXY8020A介绍和驱动代码
        • 1.概述
        • 2.MPXY8020A和Mcu的硬件连接
        • 3.MPXY8020A的性能参数
          • 3.1 待机电流在1uA温度测量电流在400以下uA,压力测量电流为1300uA左右。
          • 3.2 ==如下图所示==:
          • 3.3 ==如下所示==:
        • 4. 编写数据通信和程序
          • 4.1 时序约束
          • 4.2 数据采样过程
          • 4.3 代码设计
          • 4.4 基于实际代码编写msp430系列单片机
          • 5. 封装信息
        • 注:本内容收集整理在互联网上,仅供学习和交流。

1.概述

MPXY8020A它是摩托罗拉公司于2003年推出的汽车轮胎气压监测传感器。它集成了气压传感器、温度传感器和数字接口电路SSOP包装;最大气压为1.4万kPa。MPXY8020A特别适用于轮胎气压和温度监测系统。

在这里插入图片描述

力传感器是由表面微加工制成的电容式传感器,接口电路和传感器采用标准硅CMOS工艺集成在同一模具上。压力信号的调节始于电容转换到电压(C到V),然后是开关电容放大器。该放大器具有可调的偏移量和增益微调。工厂校准了偏移增益,存储校准值EEPROM在微调寄存器中。该放大器还具有灵敏度和偏置的温度补偿电路EEPROM工厂调整微调寄存器。压力由电压比较器监测,将测量值与串行输入调整的8位阈值进行比较。调整阈值和监控OUT引脚状态,外部设备可检查是否超过低压阈值,或多达8位A /D转换。

以上文字机翻自数据手册,以下简要说明:

  • 温度范围-40~125摄氏度,误差较大,误差在4-5摄氏度之间。
  • 可测量压力,适当范围为250kPa~450kPa,但最大支持是14000kPa,此时可能会损坏设备。
  • 有了自己的时钟,可以输出两个的信号MCU。
  • 串行口用于输入数据,输出信号只有高低电平,需要与单片机合作收集8位adc然后将数据转化为实际温度或压力。

2.MPXY8020A和Mcu的硬件连接

VCC供电范围可为2.1v-3.6v,推荐在3.0-3.3v附近,比较合适。

如果VCC供电为0v,但是如果管脚电平高,也会通过管脚上的二极管供电!因此,为了切断电源,必须降低所有管脚。

S1和S0用于选择运行模式,触发器避免干扰:

OUT待机模式下的管脚每3个s输出脉冲:

RST管脚可以输出52个低脉冲信号mins,定期复位信号可作为外部单片机。

==DATA和CLK单路串行通信由下拉电阻和施密特触发器组成,以避免干扰。==这两个直接连接到单片机IO管脚很好,然后使用模拟SPI协议传输数据。

3.MPXY8020A的性能参数

3.1 待机电流在1uA温度测量电流在400以下uA,压力测量电流为1300uA左右。

3.2 如下图所示

3.3 如下所示

4. 编写数据通信和程序

4.1 时序约束

根据表面要求,data边沿到clk上升沿,它(data)最小电平建立时间为100ns,然后此后data数据保持100ns所以MCU的IO电平翻转速率小于5Mhz,即通信速率小于5Mhz。

可以看出,每个数据输入的大小是一个字节,即8位。在每个时钟的上升沿读取数据,在第八个下降沿读取数据D/A在数据寄存器中。

4.2 数据采样过程

信号采样分为两个步骤:首先将采样电容器上的信号转换为电压信号,然后用开关电容放大器放大信号,以提高采样精度。

通过电压比较器确定信号值的大小。外部微控制器在信号转换前通过MPXY8020A输入接口输入8位极限值。片中8位DAC(数模转换器)将该值转换为相应的模拟电压,电压比较器将采样的电压值与该值进行比较OUT引脚输出比较后的结果。当采样值高于输入值时,OUT引脚为高电平;相反,它是低电平。

也就是说,

因此,如果只是阈值判断,编程非常简单,那就是输入要判断的阈值,然后判断输出管脚的高度。

若要获得准确的测量值,可采用二次逼近法进行测量。即采用二分法进行多次比较。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。

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;
        else
            MPXY8020A_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)]

注:本内容收集整理于互联网,仅供学习交流之用。

标签: 传感器屏蔽线四线振荡极限状态传感器适用于集成式电流传感器a用在设备的传感器h1141电容传感器内置扩散硅传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台