iffi123 发表于 2020-2-8 21:55:04

免费领的,给STM32做个练习

本帖最后由 iffi123 于 2020-2-8 21:57 编辑

前阵子在立创买元件,领了3个DHT11温度湿度传感器模块,指标比较差,误差大,

不过模块化结构,方便用杜邦线和最小系统连接(春节回老家没带工具), 就当作学习STM32 的练习


它是单总线通信,一来以往都在同一根数据线上,

工作流程也简单

cpu发个低电平脉冲启动,传感器也回一个低电平脉冲作为响应,然后连续发送40位数据,一位数据由低电平(固定时长)和高电平(可变时长)组成,不同时长的高电平代表1和0, 40位数据组成5个字节数据, 分别是传感器和温度的整数位和小数位,再加一个校验字节。

wenjunlin1979 发表于 2020-2-8 22:09:11

这东西准确性比较差

iffi123 发表于 2020-2-8 22:17:49

本帖最后由 iffi123 于 2020-2-8 22:28 编辑

第一步,刚开始写程序,用了最土的办法, 跟随时序,等检测到数据位的低电平后,等待判断变高后,延时一定时间,再读取数据线,如果是低电平,说明是0, 否则为1, 这种简单办法也有效,能正确显示出温度和湿度了。

不过不过瘾,感觉没什么劲,人家明明是时长不同区分的

第二步,当时正在看定时器章节, 正好知道输入捕获功能可以测脉宽,马上练手试验

使用定时器2的CH1, 对应内部就是TI1, 也使用了捕获通道IC1(4个通道其中1个),设置好定时器参数后,再设置IC1, 先设置成上升沿捕获, 当出现上升沿后, 进入中断程序,保存捕获寄存器CCR1的值,再把极性改成下降沿, 因为等高电平结束后,又会产生1次中断, 再次保存CCR1的值,2次值相减,就是高电平的时间(还要乘以时钟周期), 当然如果发生定时器溢出还要另外处理。

这样计算出来的高电平时长和手册上的典型值几乎一致,说明测得很准,这种结果才让人放心:loveliness:


还有什么别的办法,如果有,一起试试,不怕失败

第三步, 官方的参考手册,提到PWM输入模式也可以测量周期和占空比,自然要试试了。

这种办法比第二种更简单,基本差不多,就是把输入信号同时映射到2个捕获通道, 一个上升沿,一个下降沿,下降沿触发的中断读取CCR1直接出来高电平,上升沿的就是周期了,只不过要分别配置IC1,和IC2, 书上有介绍原理,换成C代码就可以了。

结果差不多,时长和第二步的结果非常一致。


结论:这模块虽不准但可以用

平时把模块伸到窗户外, 用上次的发射板数码管显示温度和湿度,随时掌握外面的温度:P


分立元件 发表于 2020-2-9 22:00:40

应该学会很多东西了吧

iffi123 发表于 2020-2-9 22:16:02

分立元件 发表于 2020-2-9 22:00
应该学会很多东西了吧

学不完,先打好基础再说, 定时器功能比较强大,内容有点杂,基本理顺关系和众多寄存器的设置
页: [1]
查看完整版本: 免费领的,给STM32做个练习