在线时间464 小时
UID3547866
注册时间2022-4-24
NXP金币3162
TA的每日心情 | 开心 13 小时前 |
---|
签到天数: 1096 天 连续签到: 14 天 [LV.10]以坛为家III
金牌会员
 
- 积分
- 5762
- 最后登录
- 2025-7-22
|
本帖最后由 suncat0504 于 2024-7-2 00:08 编辑
解决了显示的处理之后,准备用LPC845连接GXHT30温湿度传感器,进行温湿度的测量。温湿度传感器的驱动程序是之前用在其他开发板上的,没有问题。这个传感器使用I2C方式通讯,因为考虑到I2C的地址和OLED是不同的,所以就和OLED使用了相同的GPIO口作为SCL和SDA。在移植到LPC845开发板的时候,逻辑上的问题是不需要考虑的,需要注意的是时钟方面的问题。在移植过来后,调节SCL时钟的周期,保持一致即可。预想中应该不会出问题,但是测量结果却不对,温湿度的数据时钟是-1.改了一些参数,依旧没有解决。
不得已,只好做波形对比了,把在之前开发板上的正常工时的波形和当前LPC845开发板上的波形作对比,看看是不是由于时钟不对造成的。以下是用程序捕捉到的波形情况:
1、正常工作的波形(发送工作指令部分)
2、在LPC845上工作的波形(发送工作指令部分)
看起来是差不多一样的,
根据代码:
void SHT30_read_result(uint8_t addr, float* temperature, float* humidity) {
//SHT30有两种读取数值的方法,分别是状态查询和数值查询,这里我使用的是数值查询,发送指令为0x2C06
uint16_t tem,hum;//定义存放温湿度计算公式的变量
uint16_t buff[6];//定义6个字节的数组,存放温度高、低八位,湿度高、低八位,两个字节的CRC校验位
float Temperature=0;//定义存放温度拼接的变量Temperature,初始化温度为0
float Humidity=0;//定义存放湿度拼接的变量Humidity,初始化湿度为0
//发送指令为0x2C06(默认)
I2c_Start2();
I2c_WriteByte2(addr<<1 | GXHT30_WRITE);//写7位I2C设备地址加0作为写取位,1为写取位
I2c_wait_ACK();
I2c_WriteByte2(0x2C);//前半段发送指令为0x2C
I2c_wait_ACK();
I2c_WriteByte2(0x06);//后半段发送指令为0x06
I2c_wait_ACK();
I2c_Stop2();
SysTick_DelayTicks(50);
I2c_Start2();
I2c_WriteByte2(addr<<1 | GXHT30_READ);//写7位I2C设备地址加1作为读取位,1为读取位
//返回的数值是6个元素的数组
if(I2c_wait_ACK()==0) {
buff[0]=I2c_RecvByte();//返回温度高8位
I2c_ACK();
buff[1]=I2c_RecvByte();//返回温度低8位
I2c_ACK();
buff[2]=I2c_RecvByte();//温度crc校验位
I2c_ACK();
buff[3]=I2c_RecvByte();//返回湿度高8位
I2c_ACK();
buff[4]=I2c_RecvByte();//返回湿度低8位
I2c_ACK();
buff[5]=I2c_RecvByte();//湿度crc校验位
I2c_NACK();
I2c_Stop2();
PRINTF("%2x,%2x,%2x,%2x\r\n",buff[0],buff[0],buff[3], buff[4]);
}
// tem = (buff[0]<<8) + buff[1];
// hum = (buff[3]<<8) + buff[4];
tem = ((buff[0]<<8) | buff[1]);//将buff[0]采集到的温度8位数据与buff[1]采集到的低8位数据相或,实现温度拼接
hum = ((buff[3]<<8) | buff[4]);//将buff[3]采集到的湿度8位数据与buff[4]采集到的低8位数据相或,实现湿度拼接
//查询SHT30数据手册可知,温湿度的计算方法如下
Temperature= 175.0*(float)tem/65535.0-45.0 ;// T = -45 + 175 * tem / (2^16-1)
Humidity= 100.0*(float)hum/65535.0;// RH = hum*100 / (2^16-1)
if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))//设定温度和湿度的阈值,超过这个阈值则返回错误提示
{
//PRINTF("温度:%6.2f℃\r\n",Temperature);
//PRINTF("湿度:%6.2f%%\r\n",Humidity);
*temperature=Temperature;
*humidity=Humidity;
}
else
{
//PRINTF("温湿度超过给定阈值!\r\n");
*temperature=-1;
*humidity=-1;
}
hum=0;
tem=0;
}
感觉启动测量的指令没问题,怀疑问题出在数据读取环节。用示波器确认毫秒级的时间延迟是没有问题的,能保证是在发出指令后的50模式后开始读取数据。应该是在LPC845开发板上,没有读到测量数据。当然也不保证,这个启动测量的指令有问题,导致传感器没有开始干活。
明天继续分析。
|
|