当前位置:网站首页>ATH10传感器读取温湿度
ATH10传感器读取温湿度
2022-08-10 06:38:00 【隨心ξ所欲】
一、分析AHT10 技术手册
(一)温湿度传感器信息(不太重要)
1.简介
2.应用范围
3.传感器性能
(二)温湿度传感器信息(重要)
1.接口
2.串行时钟线SCL
3.串行数据线SDA
4.I2C时序
5.AHT10指令
6.状态位说明
7.读取温湿度流程
(1)触发测量数据
(2)读取温湿度
8.采集数据处理
二、思路
(类似于I2C读写EEPROM,所以整个框架图很相似)
(先上电等待40ms,然后进入空闲状态,接着进行读操作,根据都回来的状态字节的bit[3]来判断是否需要初始化。如果bit[3]=0则需要进行初始化(发送写控制字节,0xE1命令,初始化参数0x08,0x00)如果是bit[3]=1则不需要初始化,可以直接开始触发测量(发送控制字节,0xAC命令,触发参数0x33,0x00),测量完成之后等待80ms(本来是应该再进行读操作,判断状态字节的bit[7]查看是否已经测量完成设备处于空闲状态。不过感觉挺麻烦,延迟80ms应该够了,所以没进行这次读状态操作),之后进行读温湿度操作(发送读控制字节))
(一)温湿度采集系统框架图
模块说明:
1.顶层模块–aht10
aht10(
input clk ,
input rst_n ,
output i2c_scl,
inout i2c_sda,
output tx
);
2.控制模块–controller
controller(
input clk ,
input rst_n ,
input busy ,
output i2c_scl ,
inout i2c_sda ,
output [7:0] data_tx,
output data_tx_vld
);
控制aht10_rw和i2c_interface数据传输,接收uart_tx模块的busy信号,输出data_tx和data_tx_vld给uart_tx模块,传输i2c时钟和数据。
3.AHT10读写模块–aht10_rw
aht10_rw(
input clk ,
input rst_n ,
input busy ,
output req ,
output [3:0] cmd ,
output [7:0] wr_data ,
input [7:0] rd_data ,
output reg [7:0] dout ,
output reg dout_vld ,
input done ,
input slave_ack
);
根据状态对i2c接口模块发送请求、命令(读、写、起始、停止)、发送数据。实现控制i2c接口模块对aht10传感器进行读写操作。处理接收数据并发送给uart_tx模块。
数据处理
(我直接在这个模块中处理了数据)
思路:
(1)按字节将数据存入[19:0]RH和[19:0]TP中,过滤掉状态字节,将后面的温湿度字节前2.5字节存入[19:0]RH,后2.5字节存入[19:0]TP。
//数据处理
//RH、TP
[email protected](posedge clk or negedge rst_n)begin
if(!rst_n)begin
RH <= 1'b0;
TP <= 1'b0;
end
else if(state_c == READ_WAIT && cnt_byte == 2) begin
RH[19:12] <= rd_data;
TP <= 1'b0;
end
else if(state_c == READ_WAIT && cnt_byte == 3) begin
RH[11:4] <= rd_data;
TP <= 1'b0;
end
else if(state_c == READ_WAIT && cnt_byte == 4) begin
RH[3:0] <= rd_data[7:4];
TP[19:16] <= rd_data[3:0];
end
else if(state_c == READ_WAIT && cnt_byte == 5) begin
RH <= RH;
TP[15:8] <= rd_data;
end
else if(state_c == READ_WAIT && cnt_byte == 6) begin
RH <= RH;
TP[7:0] <= rd_data;
end
end
(2)按公式处理数据
wire [39:0] RH_r;
wire [39:0] TP_r;
assign RH_r = (RH * 10000)>>20;
assign TP_r = ((TP * 20000)>>20) - 5000;
(3)将数据转换为ASCII码
wire [7:0] data_r [15:0];//寄存湿度、温度的个十百千位
assign data_r [0] = 8'b01010010 ;//R
assign data_r [1] = 8'b01001000 ;//H
assign data_r [2] = 8'b00111010 ;//:
assign data_r [3] = RH_r /1000 + 8'b0011_0000;//湿度千位
assign data_r [4] = RH_r /100 %10 + 8'b0011_0000;//湿度百位
assign data_r [5] = 8'b00101110 ;//.
assign data_r [6] = RH_r /10 %10 + 8'b0011_0000;//湿度十位
assign data_r [7] = RH_r %10 + 8'b0011_0000;//湿度个位
assign data_r [8] = 8'b01010100 ;//T
assign data_r [9] = 8'b01010000 ;//P
assign data_r [10] = 8'b00111010 ;//:
assign data_r [11] = TP_r /1000 + 8'b0011_0000;//温度千位
assign data_r [12] = TP_r /100 %10 + 8'b0011_0000;//温度百位
assign data_r [13] = 8'b00101110 ;//.
assign data_r [14] = TP_r /10 %10 + 8'b0011_0000;//温度十位
assign data_r [15] = TP_r %10 + 8'b0011_0000;//温度个位
4.I2C接口模块–i2c_interface
i2c_interface(
input clk ,
input rst_n ,
//主机发送数据
input req ,//请求
input [3:0] cmd ,//i2c接口指令,控制状态
input [7:0] din ,//i2c接口需要发送的数据
//主机接收数据
output [7:0] dout ,//i2c接口接收的数据
output done ,//完成一次读/写指令
output slave_ack ,//主机给从机的应答
//从机接收数据
output i2c_scl ,//i2c时钟
input i2c_sda_i , //i2c给主机发数据
output i2c_sda_o ,//主机给从机发数据
output i2c_sda_oe
);
根据aht10_rw模块的请求、命令进行读写操作,满足i2c读写时序,产生i2c时钟,控制i2c时钟线和数据线进行数据传输。
(二)状态转移图
1.AHT10_RW模块状态转移图
(1)状态说明:
WAIT:上电等待40ms
IDLE:空闲状态
STATU、STATU_WAIT:读状态字节状态及其等待状态
INIT、INIT_WAIT:初始化状态及其等待状态
START、START_WAIT:触发状态及其等待状态
READ、READ_WAIT:读温湿度数据状态及其等待状态
DONE:结束状态
(2)各个状态字节数:
读状态 读控制字节(8’b0111_0001) 读状态字节 共两字节
初始化 写控制字节(8’b0111_0000) 写命令(8’b11100001) 写两个参数(8’b00001000、8’b00000000) 共四字节
触发测量 写控制字节(8’b0111_0000) 写命令(8’b10101100) 写两个参数(8’b00110011、8’b00000000) 共四字节
读数据 读控制字节(8’b0111_0001) 读六字节 共七字节
(3)状态转移条件:
2.I2C_interface模块状态转移图
状态跳转条件:
三、实验结果
(一)实验效果
(二)仿真
1、状态跳转仿真
(1)读状态、初始化状态
(2)读状态、触发测量状态
(3)读温湿度状态
2、数据处理仿真
3.RTL视图
边栏推荐
猜你喜欢
Chapter 11 Database Design Specifications [2. Index and Tuning] [MySQL Advanced]
数据库学习之表的约束
【电商业务】外行为何难区别 商品属性与商品规格
高质量WordPress下载站模板5play主题
pthread编程重要知识点
Data types for database learning
Tencent Cloud Song Xiang: Kubernetes cluster utilization improvement practice
如何正确理解线程机制中常见的I/O模型,各自主要用来解决什么问题?
关于MongoDb查询Decimal128转BigDecimal问题
MySQL之InnoDB引擎(六)
随机推荐
复现dns外带数据结合sqlmap
C语言文件操作
高质量WordPress下载站模板5play主题
强化学习_05_DataWhale近端策略优化
mysql数据库月增长量问题
浅谈C语言实现冒泡排序
关于MongoDb查询Decimal128转BigDecimal问题
动态规划——从0-1背包问题到leetcode正则匹配
程序员的十楼层。看看自己在第几层。PS:我的目标是:30岁第四层
2022 Henan Mengxin League Game (5): University of Information Engineering K - Matrix Generation
2022河南萌新联赛第(五)场:信息工程大学 B - 交通改造
I would like to ask you guys, when FLink SQL reads the source, specify the time field of the watermark. If the specified field is in the grid
QScroller的QScrollerProperties参数研究
MySQL之InnoDB引擎(六)
Log4j2基本使用
2022河南萌新联赛第(五)场:信息工程大学 H - 小明喝奶茶
2022河南萌新联赛第(五)场:信息工程大学 C - 丢手绢
Parallax Mapping: More Realistic Texture Detail Representation (Part 1): Why Use Parallax Mapping
ESP32 485风速
A few lines of code can crash the system;