FPGA实战:单总线协议解析与DHT11温湿度数据采集
1. 从零认识DHT11温湿度传感器第一次拿到DHT11这个白色小方块时我完全没想到这么便宜的传感器能有如此实用的功能。作为一款经典的数字温湿度复合传感器DHT11通过单总线协议输出校准后的数字信号省去了传统模拟传感器需要的ADC转换环节。实测下来它的温度测量范围-20℃~60℃、湿度测量范围5%~95%RH完全能满足大多数室内环境监测的需求。DHT11最让我惊喜的是它的稳定性。记得去年做的智能花盆项目用了三个DHT11连续工作半年数据漂移都在±2℃和±5%RH的标称误差范围内。不过要注意的是它的采样周期建议大于2秒这点在程序设计中需要特别注意否则读取的数据可能不准确。传感器引脚非常简单就4个VDD3.3V-5.5V供电DATA单总线数据线NC空引脚GND接地接线时我习惯在DATA线上加个4.7kΩ上拉电阻这是单总线设备的典型配置。有一次偷懒没加上拉结果数据时不时就丢失排查了半天才发现是这个原因。2. 单总线协议深度解析2.1 单总线通信机制单总线协议最妙的地方就是只用一根线完成双向通信。在FPGA控制DHT11的场景中FPGA作为主机DHT11作为从机。这里有个关键点总线空闲时必须保持高电平所以上拉电阻必不可少。协议的工作流程就像对话主机(FPGA)先喊话拉低总线18ms从机(DHT11)回应先拉低83us再拉高87us从机开始说话连续发送40位数据对话结束从机拉低54us后释放总线2.2 数据格式详解DHT11每次传送40位数据包含湿度整数(8bit)湿度小数(8bit实际总为0)温度整数(8bit)温度小数(8bit)校验和(8bit)校验计算很简单前32位数据相加取末8位。我在代码中专门写了校验逻辑发现数据错误就丢弃这对提高系统可靠性很有帮助。温度小数部分的处理有个坑当温度低于0℃时小数部分的最高位会置1。有次冬天测试时突然显示温度120多度就是因为没处理这个标志位。3. FPGA实现方案设计3.1 状态机设计要点控制DHT11最合适的就是状态机了我的设计包含6个状态上电等待1秒DHT11初始化需要发送18ms起始信号等待20-40us检测DHT11响应准备接收数据读取40位数据状态转换时要特别注意时序要求。我最初没严格把控时间结果DHT11经常不响应。后来严格按照数据手册的时序参数实现问题就解决了。3.2 关键时序实现用50MHz系统时钟生成1us精度的时基很重要这是我的分频代码always(posedge sys_clk or negedge sys_rst_n) if(!sys_rst_n) begin cnt 0; clk_1us 0; end else if(cnt 24) begin cnt 0; clk_1us ~clk_1us; end else cnt cnt 1;判断数据位0/1的诀窍是测量高电平持续时间26us左右是070us左右是1 我的经验是取50us作为阈值最可靠4. 完整代码实现与优化4.1 数据采集模块核心是这段状态机代码处理DHT11的响应和数据读取always(posedge clk_1us or negedge sys_rst_n) if(!sys_rst_n) state S_WAIT_1S; else case(state) S_WAIT_1S: if(cnt_1s 999999) state S_LOW_18MS; S_LOW_18MS: if(cnt_18ms 17999) state S_DLY1; S_DLY1: if(cnt_dly 10) state S_REPLY; S_REPLY: if(dht11_rise cnt_low70) state S_DLY2; else if(cnt_timeout1000) state S_LOW_18MS; S_DLY2: if(dht11_fall) state S_RD_DATA; S_RD_DATA: if(bit_cnt40 dht11_rise) state S_LOW_18MS; endcase4.2 数据校验与处理数据校验不仅要检查校验和还要处理温度的正负// 温度符号处理 always(posedge clk_1us or negedge sys_rst_n) if(!sys_rst_n) sign 0; else if(data[7] data_flag) sign 1; else sign 0; // 数据输出 always(posedge clk_1us or negedge sys_rst_n) if(!sys_rst_n) data_out 0; else if(data_valid) begin if(!data_flag) // 湿度 data_out humidity_int * 10; else // 温度 data_out temp_int * 10 temp_frac[3:0]; end5. 调试经验与性能优化5.1 常见问题排查调试单总线设备时逻辑分析仪是必备工具。我总结了几种典型问题无响应检查起始信号是否够18ms上拉电阻是否接好数据错误检查时序是否严格特别是1us时基要准确偶尔丢数据增加重试机制我一般设置最多3次重试5.2 采样率优化虽然手册说采样周期要大于2秒但实测发现连续读取时间隔1.5秒也能稳定工作加入温度变化检测变化小时延长采样间隔设置超时重发机制提高可靠性我的项目里最终实现了1.8秒的采样间隔既保证稳定性又提高了数据实时性。6. 实际应用案例去年给本地温室做的监测系统用了8个DHT11节点。关键改进包括增加CRC校验数据传输更可靠温度突变时自动提高采样率加入传感器健康监测自动报告异常节点这个系统连续运行至今数据准确率保持在99%以上。最让我自豪的是有个节点在漏水环境下坚持工作了3个月才更换可见DHT11的耐用性确实不错。7. 进阶改进方向对于需要更高精度的场景我推荐以下改进方案改用DHT22温度精度±0.5℃湿度±2%RH增加均值滤波我常用的8次滑动窗口效果不错加入温度补偿算法特别是高湿环境下的校准实现多传感器数据融合提升系统可靠性最近在做的智能家居项目中我把DHT11数据与BMP280气压传感器数据融合实现了更准确的环境感知。这种多传感器协同工作的模式可能是未来环境监测的主流方向。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2465706.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!