有没有人用过MS5611这个气压计?
我在使用IIC调试MS5611的时候,使用资料上提供的时序可以复位MS5611, 也可以读取PROM但是当我读取 压力值和温度值 的时候发送地址后芯片就没响应了,那位大神知道是什么情况么?
求51或stm32 程序... D1,D2 转换需要时间
IICWriteByte(MS5611_ADDRESS, 0x58);
delay_us(10);
IICReadBytes(MS5611_ADDRESS, 0x00, 3, data); sxjclike 发表于 2013-7-22 00:15 static/image/common/back.gif
D1,D2 转换需要时间
大侠呀终于等到你了 求源程序。。。
我从开始转换后延时了10MS不过还是没能读出来
把你的程序让小弟参考一下吧谢谢了
QQ:348611093@qq.com 小乔123 发表于 2013-7-22 08:42 static/image/common/back.gif
大侠呀终于等到你了 求源程序。。。
我从开始转换后延时了10MS不过还是没能读出来
#include "MS5611.h"
///////////////////////////////////////
//#define OSR256// 0.60 mSec conversion time (1666.67 Hz)
//#define OSR512// 1.17 mSec conversion time ( 854.70 Hz)
//#define OSR 1024// 2.28 mSec conversion time ( 357.14 Hz)
//#define OSR 2048// 4.54 mSec conversion time ( 220.26 Hz)
#define OSR 4096// 9.04 mSec conversion time ( 110.62 Hz)
///////////////////////////////////////
uint16_t c1, c2, c3, c4,c5, c6;
int32_t d1;
int32_t d2;
int64_t dT;
void readTemperatureRequestPressure(void)
{
uint8_t data;
IICreadBytes2(MS5611_ADDRESS, 0x00, 3, data); // Request temperature read
d2 = ((int32_t)data << 16) | ((int32_t)data << 8) | data;
#if (OSR ==256)
IICwriteByte2(MS5611_ADDRESS, 0x40);// Request pressure conversion
#elif (OSR ==512)
IICwriteByte2(MS5611_ADDRESS, 0x42);
#elif (OSR == 1024)
IICwriteByte2(MS5611_ADDRESS, 0x44);
#elif (OSR == 2048)
IICwriteByte2(MS5611_ADDRESS, 0x46);
#elif (OSR == 4096)
IICwriteByte2(MS5611_ADDRESS, 0x48);
#endif
}
void readPressureRequestPressure(void)
{
uint8_t data;
IICreadBytes2(MS5611_ADDRESS, 0x00, 3, data); // Request pressure read
d1 = ((int32_t)data << 16) | ((int32_t)data << 8) | data;
#if (OSR ==256)
IICwriteByte2(MS5611_ADDRESS, 0x40);// Request pressure conversion
#elif (OSR ==512)
IICwriteByte2(MS5611_ADDRESS, 0x42);
#elif (OSR == 1024)
IICwriteByte2(MS5611_ADDRESS, 0x44);
#elif (OSR == 2048)
IICwriteByte2(MS5611_ADDRESS, 0x46);
#elif (OSR == 4096)
IICwriteByte2(MS5611_ADDRESS, 0x48);
#endif
}
void readPressureRequestTemperature(void)
{
uint8_t data;
IICreadBytes2(MS5611_ADDRESS, 0x00, 3, data); // Request pressure read
d1 = ((int32_t)data << 16) | ((int32_t)data << 8) | data;
#if (OSR ==256)
IICwriteByte2(MS5611_ADDRESS, 0x50);// Request pressure conversion
#elif (OSR ==512)
IICwriteByte2(MS5611_ADDRESS, 0x52);
#elif (OSR == 1024)
IICwriteByte2(MS5611_ADDRESS, 0x54);
#elif (OSR == 2048)
IICwriteByte2(MS5611_ADDRESS, 0x56);
#elif (OSR == 4096)
IICwriteByte2(MS5611_ADDRESS, 0x58);
#endif
}
///////////////////////////////////////////////////////////////////////////////
// Calculate Temperature
///////////////////////////////////////////////////////////////////////////////
int32_t calculateTemperature(void)
{
int32_t dd;
dT = d2 - ((int32_t)c5 << 8);
dd =2000 + (int32_t)((dT * c6 ) >> 23);
return dd/10;
}
///////////////////////////////////////////////////////////////////////////////
// Calculate Pressure Altitude
///////////////////////////////////////////////////////////////////////////////
int32_t calculatePressureAltitude(void)
{
int64_t offset;
int32_t pressureAlt;
int64_t sens;
int32_t p;
// int32_t d1Average = 110;
offset= ((uint32_t)c2 << 16) + ((c4 * (int64_t)dT) >> 7);
sens = ((uint32_t)c1 << 15) + ((c3 * (int64_t)dT) >> 8);
p = (((d1 * sens) >> 21) - offset) >> 15;
pressureAlt = (44330.0f * (1.0f - pow((float)p / 101325.0f, 0.190295f)));
return p;
}
void MS5611_init(void)
{
uint8_t data;
IICwriteByte2(MS5611_ADDRESS, 0x1E); // Reset Device
delay_us(10);
IICreadBytes2(MS5611_ADDRESS, 0xA2, 2, data); // Read Calibration Data C1
c1 = ((uint16_t)data << 8) | data;
IICreadBytes2(MS5611_ADDRESS, 0xA4, 2, data); // Read Calibration Data C2
c2 = ((uint16_t)data << 8) | data;
IICreadBytes2(MS5611_ADDRESS, 0xA6, 2, data); // Read Calibration Data C3
c3 = ((uint16_t)data << 8) | data;
IICreadBytes2(MS5611_ADDRESS, 0xA8, 2, data); // Read Calibration Data C4
c4 = ((uint16_t)data << 8) | data;
IICreadBytes2(MS5611_ADDRESS, 0xAA, 2, data); // Read Calibration Data C5
c5 = ((uint16_t)data << 8) | data;
IICreadBytes2(MS5611_ADDRESS, 0xAC, 2, data); // Read Calibration Data C6
c6 = ((uint16_t)data << 8) | data;
#if (OSR ==256)
IICwriteByte2(MS5611_ADDRESS, 0x50);// Request temperature conversion
#elif (OSR ==512)
IICwriteByte2(MS5611_ADDRESS, 0x52);
#elif (OSR == 1024)
IICwriteByte2(MS5611_ADDRESS, 0x54);
#elif (OSR == 2048)
IICwriteByte2(MS5611_ADDRESS, 0x56);
#elif (OSR == 4096)
IICwriteByte2(MS5611_ADDRESS, 0x58);
#endif
delay_us(10);
readTemperatureRequestPressure();
} u8 IICwriteByte2(u8 dev, u8 data){
IIC_Start();
IIC_Send_Byte(dev<<1); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(data); //发送地址
IIC_Wait_Ack();
IIC_Stop();//产生一个停止条件
return 1; //status == 0;
}
u8 IICreadBytes2(u8 dev, u8 cmd, u8 length, u8 *data){
u8 count = 0;
IIC_Start();
IIC_Send_Byte(dev<<1); //发送写地址
IIC_Wait_Ack();
IIC_Send_Byte(cmd); //发送命令
IIC_Wait_Ack();
// IIC_Stop();
IIC_Start();
IIC_Send_Byte(dev<<1|1);//进入接收模式
IIC_Wait_Ack();
for(count=0;count<length;count++){
if(count!=length-1)data=IIC_Read_Byte(1);//带ACK的读数据
elsedata=IIC_Read_Byte(0); //最后一个字节NACK
}
IIC_Stop();//产生一个停止条件
return count;
} sxjclike 发表于 2013-7-22 14:30 static/image/common/back.gif
u8 IICwriteByte2(u8 dev, u8 data){
IIC_Start();
if((micros()-system_micrsecond)>upload_time)
{
frameCounter++;
if (frameCounter > 5)
frameCounter = 1;
if (frameCounter == 1)
{
readPressureRequestTemperature();
}
else if (frameCounter == 2)
{
readTemperatureRequestPressure();
}
else if (frameCounter == 5)
{
Temperature = calculateTemperature(); //读取最近的温度值
Altitude = calculatePressureAltitude();//读取最近的高度值
}
else
{
readPressureRequestPressure();
}
} 本帖最后由 小乔123 于 2013-7-22 14:41 编辑
sxjclike 发表于 2013-7-22 14:31 static/image/common/back.gif
if((micros()-system_micrsecond)>upload_time)
{
frameCounter++;
你这什么单片机晶振多少呢?我先试试看 本帖最后由 sxjclike 于 2013-7-22 14:40 编辑
STM32F103 72M upload_time时间超过10ms就行 sxjclike 发表于 2013-7-22 14:39 static/image/common/back.gif
STM32F103 72M upload_time时间超过10ms就行
你用的是正点原子的板子么 能不能直接给我发一下工程?
QQ:348611093 sxjclike 发表于 2013-7-22 14:39 static/image/common/back.gif
STM32F103 72M upload_time时间超过10ms就行
哎弄了半天那天还能读出来PROM的值 现在只能复位芯片了 sxjclike 发表于 2013-7-22 14:39 static/image/common/back.gif
STM32F103 72M upload_time时间超过10ms就行
你好现在能读出来数据了 PROM的数据能读出来 RAM数据也能读出来但是RAM中的数据一直在变化
哪一位都不是很稳定的那种感觉一会减一会又变大 从60000多到20000多变化
请问你遇到这种情况么? 你好楼主,请问你的问题解决了吗,我也在弄5611,发现设置OSR不同时,输出的P也不同 PANGKUN 发表于 2013-11-24 14:53
你好楼主,请问你的问题解决了吗,我也在弄5611,发现设置OSR不同时,输出的P也不同 ...
你好我QQ:348611093 我在百度文库搜到一个MS5611中文资料,把里面的51程序移植到1768上一切正常 #include "ms5611.h"
#define MS561101BA_SlaveAddress 0xee //定义器件在IIC总线中的从地址
#define MS561101BA_D1 0x40
#define MS561101BA_D2 0x50
#define MS561101BA_RST 0x1E
#define MS561101BA_D1_OSR_4096 0x48
#define MS561101BA_D2_OSR_4096 0x58
#define MS561101BA_ADC_RD 0x00
#define MS561101BA_PROM_RD 0xA0
#define MS561101BA_PROM_CRC 0xAE
u16 Cal_C; //存放PROM中的8个数据
u32 D1_Pres,D2_Temp; //存放压力和温度
int32_t dTT,TEMP;
int64_t OFF_,SENS;
int64_t tPressure; //大气压
int64_t TEMP2,Aux,OFF2,SENS2,T2; //温度校验
void MS5611_Reset(void)
{
IIC_Start();
IIC_Send_Byte(MS561101BA_SlaveAddress);
IIC_Wait_Ack();
IIC_Send_Byte(MS561101BA_RST);
IIC_Wait_Ack();
IIC_Stop();
}
void MS5611_PROM_Read(void)
{
u8 d1,d2,i;
for(i = 0;i <= 6;i ++)
{
IIC_Start();
IIC_Send_Byte(MS561101BA_SlaveAddress);
IIC_Wait_Ack();
IIC_Send_Byte(MS561101BA_PROM_RD + i*2);
IIC_Wait_Ack();
//IIC_Stop();
IIC_Start();
IIC_Send_Byte(MS561101BA_SlaveAddress + 1);
IIC_Wait_Ack();
d1 = IIC_Read_Byte(1); //OVER SEND ACK
d2 = IIC_Read_Byte(0); //OVER SEND NACK
IIC_Stop();
delay_ms(5);
Cal_C = ((u16)d1 << 8) | d2;
}
}
u32 MS5611_DO_Conversion(u8 command)
{
u32 conversion = 0;
u32 conv1,conv2,conv3;
IIC_Start();
IIC_Send_Byte(MS561101BA_SlaveAddress);
IIC_Wait_Ack();
IIC_Send_Byte(command);
IIC_Wait_Ack();
IIC_Stop();
delay_ms(100);
IIC_Start();
IIC_Send_Byte(MS561101BA_SlaveAddress);
IIC_Wait_Ack();
IIC_Send_Byte(0);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(MS561101BA_SlaveAddress + 1);
IIC_Wait_Ack();
conv1 = IIC_Read_Byte(1); //ACK
conv2 = IIC_Read_Byte(1); //ACK
conv3 = IIC_Read_Byte(0); //NACK
IIC_Stop();
conversion = conv1 << 16 | conv2 << 8 | conv3;
return conversion;
}
int64_t MS5611_GetTemperature(u8 OSR_Temp)
{
D2_Temp = MS5611_DO_Conversion(OSR_Temp);
delay_ms(10);
dTT = D2_Temp - (((u32)Cal_C) << 8);
TEMP = 2000 + (dTT*((u32)Cal_C) >> 23);
return TEMP;
}
int64_t MS5611_GetPressure(u8 OSR_Pres)
{
D1_Pres = MS5611_DO_Conversion(OSR_Pres);
delay_ms(10);
OFF_ = ((u32)Cal_C << 16) + (((u32)Cal_C*dTT) >> 7);
SENS = ((u32)Cal_C << 15) + (((u32)Cal_C*dTT) >> 8);
if(TEMP < 2000) //温度小于20判定为低温区 采用二阶温度补偿
{
T2 = (dTT*dTT) >> 31;
Aux = TEMP*TEMP;
OFF2 = 2.5*Aux;
SENS2 = 1.25*Aux;
TEMP = TEMP - TEMP2;
OFF_ = OFF_ - OFF2;
SENS = SENS - SENS2;
}
tPressure = ((D1_Pres * SENS >> 21) - OFF_) >> 15;
return tPressure;
}
int64_t MS5611_GetAltitude()
{
return (44330.0f * (1.0f - pow((float)tPressure / 101325.0f, 0.190295f)));;
}
void MS5611_Init(void)
{
//IIC_Init();
MS5611_Reset();
delay_ms(1000);
MS5611_PROM_Read();
delay_ms(1000);
}
你好。我能请教一下你IIC读取MS5611气压计值时候,使用到了带有ACK的函数IIC_Read_Byte();这个是你自己写的,还是库里带的,能参考一下嘛 xbcoastline 发表于 2014-2-15 15:28
你好。我能请教一下你IIC读取MS5611气压计值时候,使用到了带有ACK的函数IIC_Read_Byte();这个是你自己写的 ...
参考以前的IIC程序写的 ,就郭天祥的51程序 只有计算出温度和压强值才能看出对不对。 我现在用IIC读气压计的值还有问题。现在连MS5611的PROM值都读不出来,我的IIC还是不行
mark学习一下 学习了。 正要学习看一下 没用过,帮顶
页:
[1]