OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3003|回复: 9

DS18B20和DHT11布线有什么说法

[复制链接]

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2019-7-18
在线时间
50 小时
发表于 2020-1-4 11:01:21 | 显示全部楼层 |阅读模式
15金钱
按照原子哥F4的板子原理图来做的板子,但是同样的DS18B20和DHT11,拆下来放到F4板子就能识别和正确读数,放到自己的板子就是初始化时,在DHT11_Check函数的while (DHT11_DQ_IN&&retry<100)中,无法等待至拉低。
唯一改动点就是把F4的PG_9的IO口改成PE9和PE10,其中DS18B20为PE9,DHT11为PE10,程序改动部分如下:
u8 DS18B20_Init(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//ê1&#196;üGPIOGê±&#214;ó

  //GPIOE9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//&#198;&#213;í¨ê&#228;3&#246;&#196;£ê&#189;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//í&#198;íìê&#228;3&#246;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//é&#207;à-
  GPIO_Init(GPIOE, &GPIO_InitStructure);//3&#245;ê&#188;&#187;ˉ

  DS18B20_Rst();
  return DS18B20_Check();
}  


u8 DHT11_Init(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//ê1&#196;üGPIOGê±&#214;ó

  //GPIOE10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//&#198;&#213;í¨ê&#228;3&#246;&#196;£ê&#189;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//í&#198;íìê&#228;3&#246;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//é&#207;à-
  GPIO_Init(GPIOE, &GPIO_InitStructure);//3&#245;ê&#188;&#187;ˉ
  DHT11_Rst();
  return DHT11_Check();
}


//IO·方向设置
#define DS18B20_IO_IN()  {GPIOE->MODER&=~(3<<(9*2));GPIOE->MODER|=0<<9*2;}        //PE9输入模式
#define DS18B20_IO_OUT() {GPIOE->MODER&=~(3<<(9*2));GPIOE->MODER|=1<<9*2;}         //PE9输出模式

////IO函数操作                                                                                          
#define        DS18B20_DQ_OUT PEout(9) //数据端口        PE9
#define        DS18B20_DQ_IN  PEin(9)  //数据端口                PE9


//IO·方向设置
#define DHT11_IO_IN()  {GPIOE->MODER&=~(3<<(10*2));GPIOE->MODER|=0<<10*2;}        //PE10输入模式
#define DHT11_IO_OUT() {GPIOE->MODER&=~(3<<(10*2));GPIOE->MODER|=1<<10*2;}         //PE10输出模式
////IO函数操作                                                                                          
#define        DHT11_DQ_OUT PEout(10) //数据端口        PE10
#define        DHT11_DQ_IN  PEin(10)  //数据端口        PE10


原理图还搭载了一些传感器,但是都没有占用到PE9和PE10,原理图和部分PCB如图。
感觉查不出哪里有问题,各位大神有没有排查方向,或者布线时对这两个模块是否有特别要求

QQ截图20200104105734.png
QQ截图20200104110016.png

最佳答案

查看完整内容[请看2#楼]

解决了,解决过程我分享一下,首先是使用正点原子的DHT11程序下载,将DHT11的初始化和while循环所有内容都注释掉,相当于只是给DHT11供电,但是并未给任何信号,按照DHT11的手册,DQ输出口全程高电平,即正常。接着只增加回初始化IO口和DHT11_Rst()函数,观察示波器波形不对,延时部分扩大了十倍。即 DHT11_IO_OUT(); //SET OUTPUT DHT11_DQ_OUT=0; //拉低DQ delay_ms(20); //拉低至少18ms DHT11_DQ_OUT=1; //DQ=1 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2019-7-18
在线时间
50 小时
 楼主| 发表于 2020-1-4 11:01:22 | 显示全部楼层
解决了,解决过程我分享一下,首先是使用正点原子的DHT11程序下载,将DHT11的初始化和while循环所有内容都注释掉,相当于只是给DHT11供电,但是并未给任何信号,按照DHT11的手册,DQ输出口全程高电平,即正常。接着只增加回初始化IO口和DHT11_Rst()函数,观察示波器波形不对,延时部分扩大了十倍。即

DHT11_IO_OUT();         //SET OUTPUT
DHT11_DQ_OUT=0;         //拉低DQ
delay_ms(20);            //拉低至少18ms
DHT11_DQ_OUT=1;         //DQ=1
delay_us(30);             //主机拉高20~40us

这里的延迟变成了拉低200ms和拉高300us,所以我在主函数的delay_init(168);内部,将这句fac_us=SYSCLK/8;强行改成fac_us=SYSCLK/80;这样的话延迟就正常,读数正常。

问题是解决了,但是我有两个个疑问:
一:我画的板子是用的STM32F407VET6,正点原子的板子用过的是STM32F407ZGT6,两个板子的外部高速时钟都是8M,但是低速时钟的32.768K,我自己做的板子是没有接晶振的;而我查看时钟树后,我的理解是在delay_init(168)用的是高速时钟做的滴答定时器,那么我哪怕不用这个低速时钟的话,按理说也不会有什么问题才对。或者我的理解有误?
二:在不改变我的板子的情况下,我强行改的这个延迟的程序,会对其他部分有影响吗?板子上挂载的其他传感器是串口通信
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2019-7-18
在线时间
50 小时
 楼主| 发表于 2020-1-4 11:11:51 | 显示全部楼层
电源电压是稳定的,其他传感器数值正常。还是说上拉电阻需要根据布线调整阻值,那调整标准是什么?
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2019-7-18
在线时间
50 小时
 楼主| 发表于 2020-1-6 17:29:51 | 显示全部楼层
@正点原子
原子哥可以解释一下吗
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2019-7-18
在线时间
50 小时
 楼主| 发表于 2020-1-6 17:36:05 | 显示全部楼层
另外如果没有这个32.768低速时钟,我用定时器或者for循环来执行"i++"这种方式做延时,会对延时有影响吗
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-1-7 01:55:54 | 显示全部楼层
碎步湖 发表于 2020-1-6 17:29
@正点原子
原子哥可以解释一下吗

延时问题。没有外部晶振,先把延时函数搞对。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2019-7-18
在线时间
50 小时
 楼主| 发表于 2020-1-7 13:46:57 | 显示全部楼层
延时函数delay_init();是取决于外部低速晶振32.768?
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2019-7-18
在线时间
50 小时
 楼主| 发表于 2020-1-7 13:47:24 | 显示全部楼层
正点原子 发表于 2020-1-7 01:55
延时问题。没有外部晶振,先把延时函数搞对。

延时函数delay_init();是取决于外部低速晶振32.768?
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2019-7-18
在线时间
50 小时
 楼主| 发表于 2020-1-10 17:19:38 | 显示全部楼层
碎步湖 发表于 2020-1-7 13:47
延时函数delay_init();是取决于外部低速晶振32.768?

       这次是真的解决了,先说结论,”delay_init(168);“其实是由外部高速晶振8M来提供的,并不是32.768k的低速晶振。而且我前面无法读取DS18B20和DHT11的原因是正确的,因为延时有误,但是根本原因不在于没有32.768k,而是我8M的那个晶振,有一个电容被我不小心短路。
       排查如下,今早发现定时器其实也不准,而另一个相同的板子定时器是准的,经测量8M晶振的在这个板子里没有起振,另一个板子起振,先是换了一个晶振,发现依旧没有起振,排查到晶振旁边的电容,才发现之前在附近手动跳线时,因为烙铁头有点焊锡,不小心碰到电容,刚好把电容给短路了,导致8M没有起振,延时错误[img][/img]
回复

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2019-7-18
在线时间
50 小时
 楼主| 发表于 2020-1-10 17:20:22 | 显示全部楼层
碎步湖 发表于 2020-1-10 17:19
这次是真的解决了,先说结论,”delay_init(168);“其实是由外部高速晶振8M来提供的,并不是32.76 ...

排查出真正原因了,原子哥能否修改一下“最佳答案”@正点原子
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-11 13:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表