我的 MPL115A1 上写着 M1PR XDOC。这意味着什么? <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
我注意到我的 MPL115A1 上写着 M1PR XDOC。上面甚至没有写上飞思卡尔的徽标和 MPL115A1。这意味着什么?其他 MPL115A1 也是这样吗?我一直在使用互联网上的代码来实现它,但从传感器上得到的数值远远偏离了目标。 代码如下: /* MPL115A1 SPI 数字气压计测试代码 创建于创建于: 2010 年 9 月 30 日 作者:Jeremiah McConnell - miah at miah.comJeremiah McConnell - miah at miah.com 部分:Jim Lindblom - jim at sparkfun.com 这是 MPL115A1 压力传感器(SPI 版本)的简单测试程序。 硬件ATmega168, ATmega328 供电电压为 3.3V 或 5V,运行频率为 8MHz 或 16MHz。 MPL115A1 Breakout ------------- Arduino ----------------- ------- SDN ------------------- D9 CSN ------------------- D10 SDO ------------------- D12 * SDI ------------------- D11 * SCK ------------------- D13 * GND ------------------- GND VDD ------------------- VCC + * 这些引脚物理连接到 SPI 设备,因此您无法对其进行更换 + 5V 板使用 5V VDD,3.3V 板使用 3.3V VDD 许可协议:CCAv3.0 署名-相同方式共享 (http://creativecommons.org/licenses/by-sa/3.0/) 您可以自由使用此代码进行任何冒险,但我很想听听您是如何使用它的、 以及您对它所做的任何了不起的改动。如蒙署名,不胜感激。 */ // 包括 #包括 <SPI.h> // 从 "全国 "获取当前的高度计设置 // 天气服务 - http://www.weather.gov // 该值通常标为"气压" 或"气压" 或仅为"气压" #定义 NWS_BARO 29.92 // 针脚定义 #定义 mpl115a1_enable_pin 9 #定义 mpl115a1_select_pin 10 // MPL115A1 SPI i/o 的掩码 #定义 mpl115a1_read_mask 0x80 #定义 mpl115a1_write_mask 0x7F // MPL115A1 寄存器地址图 #定义 PRESH 0x00 // 80 #定义 PRESL 0x02 // 82 #定义 TEMPH 0x04 // 84 #定义 TEMPL 0x06 // 86 #定义 A0MSB 0x08 // 88 #定义 A0LSB 0x0A // 8A #定义 B1MSB 0x0C // 8C #定义 B1LSB 0x0E // 8E #定义 B2MSB 0x10 // 90 #定义 B2LSB 0x12 // 92 #定义 C12MSB 0x14 // 94 #定义 C12LSB 0x16 // 96 #定义 C11MSB 0x18 // 98 #定义 C11LSB 0x1A // 9A #定义 C22MSB 0x1C // 9C #定义 C22LSB 0x1E // 9E // 单位转换宏 #定义 FT_TO_M(x) ((长)((x)*(0.3048))) #定义 KPA_TO_INHG(x) ((x)*(0.295333727)) #定义 KPA_TO_MMHG(x) ((x)*(7.50061683)) #定义 KPA_TO_PSIA(x) ((x)*(0.145037738)) #定义 KPA_TO_KGCM2(x) ((x)*(0.0102)) #定义 INHG_TO_PSIA(x) ((x)*(0.49109778)) #定义 DEGC_TO_DEGF(x) ((x)*(9.0/5.0)+32) 无效 设置() { // 初始化串行 i/o 系列.开始(9600); // 初始化 SPI 接口 SPI.开始(); // 这些是默认值 //SPI.setDataMode(SPI_MODE0); //SPI.setClockDivider(SPI_CLOCK_DIV4); // MPL115A1 最高支持 8MHz 频率 //SPI.setBitOrder(MSBFIRST); // 初始化芯片选择和使能引脚 引脚模式(mpl115a1_select_pin, 输出); 引脚模式(mpl115a1_enable_pin, 输出); // 让 MPL115A1 进入休眠状态 数字写入(mpl115a1_enable_pin, 低电平); // 设置芯片选择为非激活状态,选择信号为 CS LOW 数字写入(mpl115a1_select_pin, 高电平); // 垃圾邮件欢迎横幅 系列.打印("\n************************************************************************************\n"); 序列号.打印("* 使用节拍器设置:"); 系列.打印(NWS_BARO,2); 系列.打印(" in Hg *\n"); 系列.打印("* 访问 http://www.weather.gov获取当前的本地值。*\n"); 序列号.打印("************************************************************************************\n"); } 无效 loop() { 浮点数 压力_pKa = 0; 浮点数 温度_c= 0; 长 高度 = 0; // 唤醒 MPL115A1 数字写入(mpl115a1_enable_pin, 高电平); 延迟(20); // 给芯片几毫秒的唤醒时间 压力_pKa = calculatePressurekPa(); 温度_c = 计算温度C(); 高度 = calculateAltitudeFt(压力_pKa); // 让 MPL115A1 进入休眠状态,为什么不使用它呢? // 在关机状态下,部件消耗 ~1uA 电流 数字写入(mpl115a1_enable_pin, 低电平); // 将海拔高度、压力和温度表打印到控制台 系列.打印(高度); 系列.打印(" ft |"); 系列.打印(FT_TO_M(高度_ft)); 序列号.打印(" m |"); 系列.打印(KPA_TO_INHG(压力_pKa),2); 序列号.打印(" in Hg |"); 系列.打印(KPA_TO_MMHG(压力_pKa),0); 系列.打印(" 毫米汞柱"); 系列.打印(KPA_TO_PSIA(压力_pKa),2); 系列.打印(" psia |"); //Serial.print(KPA_TO_KGCM2(pressure_pKa), 3); ///Serial.print(" kg/cm2 |"); 系列.打印(压力_pKa,1); 系列.打印(" kPa |"); // 当 res 为 -5.35 计数/°C 时,低于 0.1°C 的位数不重要 系列.打印(temperature_c,1); 系列.打印(" C |"); 系列.打印(DEGC_TO_DEGF(temperature_c),1); 系列.打印(" F\n"); // 在循环之前等待几秒钟 延迟(5000); } 长 calculateAltitudeFt(浮点 压力_kPa) { 浮点数 三角; 长 高度; // 见 http://en.wikipedia.org/wiki/Barometric_formula // 如果你是飞行员,你必须知道这里发生了什么、 // 否则,只需了解以下步骤即可计算气压高度(英尺) // 基于绝对气压(psia)与 // 高度计设定值(psia)。 三角洲 = KPA_TO_PSIA(压力_kPa) / INHG_TO_PSIA( NWS_BARO ); 高度 = (1 - pow(delta, (1 / 5.25587611))) / 0.0000068756; 返回 高度; } 浮点数 计算温度C() { 无符号 int uiTadc; 无符号 字符 uiTH, uiTL; 无符号 int 温度计数 = 0; 写入注册(0x22, 0x00); // 开始温度转换 延迟(2); // 最大等待时间为 0.7 毫秒,典型值为 0.6 毫秒 // 读取压力 uiTH = 读取寄存器(TEMPH); uiTL = 读取寄存器(TEMPL); uiTadc = (无符号 int) uiTH << 8; uiTadc += (无符号 int) uiTL & 0x00FF; // 温度为 10 位值 uiTadc = uiTadc >> 6; // 每摄氏度-5.35 个计数,472 个计数为 25 摄氏度 返回 25 + (uiTadc - 472) / -5.35; } 浮子 计算压力kPa() { // 详细说明请参见飞思卡尔文件 AN3785 // 本实施方案。 签名 char sia0MSB, sia0LSB; 签名 字符 sib1MSB, sib1LSB; 签名 字符 sib2MSB, sib2LSB; 签名 char sic12MSB, sic12LSB; 签名 char sic11MSB, sic11LSB; 签名 char sic22MSB, sic22LSB; 有符号 int sia0, sib1, sib2, sic12, sic11, 西西22, siPcomp; 浮点数 解压缩; 已签署 长 lt1, lt2, 长, si_c11x1, si_a11, si_c12x2; 已签署 长 si_a1, si_c22x2, si_a2, si_a1x1, si_y1, si_a2x2; 无符号 int uiPadc, uiTadc; 无符号 字符 uiPH, uiPL, uiTH, uiTL; 写入注册(0x24, 0x00); // 开始两种转换 //writeRegister(0x20, 0x00); // 开始压力转换 //writeRegister(0x22, 0x00); // 开始温度转换 延迟(2); // 最大等待时间为 1 毫秒,典型值为 0.8 毫秒 // 读取压力 uiPH = 读取寄存器(PRESH); uiPL = 读取注册(PRESL); uiTH = 读取寄存器(TEMPH); uiTL = 读取寄存器(TEMPL); uiPadc = (无符号 int) uiPH << 8; uiPadc += (无符号 int) uiPL & 0x00FF; uiTadc = (无符号 int) uiTH << 8; uiTadc += (无符号 int) uiTL & 0x00FF; // 将系数放入 16 位变量中 // a0 sia0MSB = 读取寄存器(A0MSB); sia0LSB = 读取寄存器(A0LSB); sia0 = (有符号 int) sia0MSB << 8; sia0 += (有符号 int) sia0LSB & 0x00FF; // b1 sib1MSB = 读取寄存器(B1MSB); sib1LSB = 读取寄存器(B1LSB); sib1 = (有符号 int) sib1MSB << 8; sib1 += (有符号 int) sib1LSB & 0x00FF; // b2 sib2MSB = 读取寄存器(B2MSB); sib2LSB = 读取寄存器(B2LSB); sib2 = (有符号 int) sib2MSB << 8; sib2 += (有符号 int) sib2LSB & 0x00FF; // c12 sic12MSB = 读取寄存器(C12MSB); sic12LSB = 读取寄存器(C12LSB); sic12 = (有符号 int) sic12MSB << 8; sic12 += (有符号 int) sic12LSB & 0x00FF; // c11 sic11MSB = 读取寄存器(C11MSB); sic11LSB = 读取寄存器(C11LSB); sic11 = (有符号 int) sic11MSB << 8; sic11 += (有符号 int) sic11LSB & 0x00FF; // c22 sic22MSB = 读取寄存器(C22MSB); sic22LSB = 读取寄存器(C22LSB); 原文 22 = (有符号 int) sic22MSB << 8; sic22 += (有符号 int) sic22LSB & 0x00FF; // 系数 9 等式补偿 uiPadc = uiPadc >> 6; uiTadc = uiTadc >> 6; // 第 1 步 c11x1 = c11 * Padc lt1 = (有符号 长) sic11; lt2 = (有符号 长) uiPadc; lt3 = lt1*lt2; si_c11x1 = (有符号 长) lt3; // 第 2 步 a11 = b1 + c11x1 lt1 = ((有符号 长)sib1)<<14; lt2 = (有符号 长) si_c11x1; lt3 = lt1 + lt2; si_a11 = (有符号 长)(lt3>>14); // 第 3 步 c12x2 = c12 * Tadc lt1 = (有符号 长) sic12; lt2 = (有符号 长) uiTadc; lt3 = lt1*lt2; si_c12x2 = (有符号 长)lt3; // 第 4 步 a1 = a11 + c12x2 lt1 = ((有符号 长)si_a11<<11); lt2 = (有符号 长)si_c12x2; lt3 = lt1 + lt2; si_a1 = (有符号 长) lt3>>11; // 第 5 步 c22x2 = c22*Tadc lt1 = (有符号 长)sic22; lt2 = (有符号 长)uiTadc; lt3 = lt1 * lt2; si_c22x2 = (有符号 长)(lt3); // 第 6 步 a2 = b2 + c22x2 lt1 = ((有符号 长)sib2<<15); lt2 = ((有符号 长)si_c22x2>1); lt3 = lt1+lt2; si_a2 = ((有符号 长)lt3>>16); // 第 7 步 a1x1 = a1 * Padc lt1 = (有符号 长)si_a1; lt2 = (有符号 长)uiPadc; lt3 = lt1*lt2; si_a1x1 = (有符号 长)(lt3); // 第 8 步 y1 = a0 + a1x1 lt1 = ((有符号 长)sia0<<10); lt2 = (有符号 长)si_a1x1; lt3 = lt1+lt2; si_y1 = ((有符号 长)lt3>>10); // 第 9 步 a2x2 = a2 * Tadc lt1 = (有符号 长)si_a2; lt2 = (有符号 长)uiTadc; lt3 = lt1*lt2; si_a2x2 = (有符号 长)(lt3); // 第 10 步 pComp = y1 + a2x2 lt1 = ((有符号 长)si_y1<<10); lt2 = (有符号 长)si_a2x2; lt3 = lt1+lt2; // 四舍五入后的定点结果 //siPcomp = ((signed int)lt3>> 13); siPcomp = lt3/8192; //decpComp 被定义为浮点数 // 从 1023 ADC 计数值转换为十进制值 // ADC 计数为 0 至 1023,压力分别为 50 至 115kPa decPcomp = ((65.0/1023.0)*siPcomp)+50; 返回 解压缩; } unsigned int 读取寄存器 ( 字节 thisRegist er){ 字节结果 = 0; // 选择 MPL115A1 数字写入(mpl115a1_select_pin, 低电平); // 发送请求 SPI.转移(thisRegister | mpl115a1_read_mask); 结果 = SPI.传输(0x00); // 取消选择 MPL115A1 数字写入(mpl115a1_select_pin, 高电平); 返回 结果; } void WriteRegister ( 字节 这个寄存器 , 字节 这个 值 ){ // 选择 MPL115A1 数字写入(mpl115a1_select_pin, 低电平); // 发送请求 SPI.转移(此寄存器 & mpl115a1_write_mask); SPI.转移(thisValue); // 取消选择 MPL115A1 数字写入(mpl115a1_select_pin, 高电平); } 请大家帮忙 压力传感器 Re: My MPL115A1 has M1PR XDOC written on it. What does this mean? <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
感谢您的回复,我已经回复了您发送的另一封邮件。 附件中是我的 CW 项目和 MPL115A1 的链接,MPL115A1 可用于 我一直在使用。多谢 2014 年 1 月 27 日星期一下午 11:52, Tomas Vaverka< Re: My MPL115A1 has M1PR XDOC written on it. What does this mean? <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
嗨,弗朗西斯 正如我在您的 SR 中已经回答过的,我还没有机会研究代码,但我现在可以说的是,M1PR 代表 MPL115A1(SPI 版本),前两个字母"XD" 表示 WW30 2012。 为了更快地向前迈进,你能否把你完整的 CW 10.5 项目发给我,让我知道你在使用哪个 MPL115A1 板? 此致, 托马斯
記事全体を表示