OpenEdv-开源电子网

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

求助!stm32F4驱动DS18B20温度传感器温度变化缓慢的问题

[复制链接]

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2019-7-4
在线时间
27 小时
发表于 2019-7-31 17:47:46 | 显示全部楼层 |阅读模式
3金钱
我用stm32f4接ds18b20、mpu6050、gps等传感器实验,用了单片机资源串口1串口2串口3,定时器3和定时器7,在LCD12864显示传感器数据,ds18b20测得的温度值是挺正常的,但是我用手握住它让它升温,温度值过了将近一分钟才会变化,而且温度不会一点一点的上升,而是直接跳了几度。传感器在别的板子上试过是没问题的,ds18b20底层驱动基本是官方例程里的,请问这可能是什么原因导致的?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

231

帖子

0

精华

高级会员

Rank: 4

积分
755
金钱
755
注册时间
2018-12-7
在线时间
131 小时
发表于 2019-7-31 17:53:34 | 显示全部楼层
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2019-7-4
在线时间
27 小时
 楼主| 发表于 2019-7-31 18:04:32 | 显示全部楼层
chenchen1 发表于 2019-7-31 17:53
屏幕刷新太慢了吧

不是屏幕刷新问题,我还接了一个dht11测湿度,主程序中读取温度之后就读取湿度数据,湿度数据可以很快刷新,用串口调试助手试过以一定的时间读取温湿度,湿度可以不断变化,温度就不行
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2019-7-4
在线时间
27 小时
 楼主| 发表于 2019-7-31 18:07:06 | 显示全部楼层
如果stm32板子刚接上ds18b20传感器,lcd会显示温度85.0,过大概一分多钟才变成室温值。
回复

使用道具 举报

4

主题

231

帖子

0

精华

高级会员

Rank: 4

积分
755
金钱
755
注册时间
2018-12-7
在线时间
131 小时
发表于 2019-8-1 09:11:50 | 显示全部楼层
lzjino 发表于 2019-7-31 18:04
不是屏幕刷新问题,我还接了一个dht11测湿度,主程序中读取温度之后就读取湿度数据,湿度数据可以很快刷 ...

那就可能是温度读取有问题吧。
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2019-7-4
在线时间
27 小时
 楼主| 发表于 2019-8-1 10:17:57 | 显示全部楼层
我用的是stm32F407VET6板子,我把主程序简化,其他传感器去掉只剩ds18b20和dht11,问题还是存在?请大佬帮忙看一下。
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "lcd.h"
  6. #include "dht11.h"
  7. #include "ds18b20.h"

  8. u8 Page_Flag=2;

  9. __align(4) u8 dtbuf[50];                                                                   //′òó¡»o′æÆ÷          

  10. int main(void)
  11. {
  12.        
  13.         u8 tmp,humi;    //dht11ζè¡¢êa¶è
  14.         short temp;       //ds18b20ÎÂ¶è       
  15.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÏμí3ÖD¶ÏóÅÏè¼¶·Ö×é2
  16.         delay_init(168);    //3õê¼»ˉÑóê±oˉêy
  17.         uart_init(38400);     //3õê¼»ˉ′®¿ú2¨ìØÂêÎa500000
  18.        
  19.         InitDis();                                //LCD3õê¼»ˉ
  20.        
  21.         DS18B20_Init();
  22.        
  23.        
  24.         while(DHT11_Init())
  25.         {
  26.                 lcd_DisStr(1,0,"DHT11 Error    ");
  27.                 delay_ms(200);
  28.                 lcd_clear();
  29.                 delay_ms(200);
  30.         }
  31.        
  32.         while(1)
  33.         {       
  34.                 temp = DS18B20_Get_Temp();         //¶áè¡ds18b20ÎÂ¶è               
  35.                 DHT11_Read_Data(&tmp,&humi);         //¶áè¡dht11μÄÎÂêa¶è
  36.        
  37.                 //printf("temp: %3.1f C  humi: %2d %%\r\n",temp,humi);
  38.                
  39.                 if(Page_Flag == 2)
  40.                 {
  41.        
  42.                         lcd_DisStr(1,0," Temp Humi is OK");
  43.                         lcd_DisStr(2,0,"                ");
  44.                         sprintf((char *)dtbuf,"temp: %3.1f C     ",(double)temp/10);        //
  45.                         lcd_DisStr(3,0,dtbuf);
  46.                         sprintf((char *)dtbuf,"humi: %2d %%      ",humi);
  47.                         lcd_DisStr(4,0,dtbuf);
  48.                 }
  49.         }        
  50. }
复制代码
  1. #ifndef __DS18B20_H
  2. #define __DS18B20_H
  3. #include "sys.h"


  4. //IO·½ÏòéèÖÃ
  5. #define DS18B20_IO_IN() {GPIOC->MODER&=~(3<<(3*2));GPIOC->MODER|=0<<3*2;}        //PC3ê&#228;è&#235;&#196;£ê&#189;
  6. #define DS18B20_IO_OUT() {GPIOC->MODER&=~(3<<(3*2));GPIOC->MODER|=1<<3*2;} //PC3ê&#228;3&#246;&#196;£ê&#189;

  7. ////IO2ù×÷oˉêy       
  8. #define        DS18B20_DQ_OUT PCout(3) //êy&#190;Y&#182;&#203;&#191;ú        PC3
  9. #define        DS18B20_DQ_IN PCin(3) //êy&#190;Y&#182;&#203;&#191;ú        PC3

  10. u8 DS18B20_Init(void);        //3&#245;ê&#188;&#187;ˉDS18B20
  11. short DS18B20_Get_Temp(void);        //&#187;&#241;è&#161;&#206;&#194;&#182;è
  12. void DS18B20_Start(void);        //&#191;aê&#188;&#206;&#194;&#182;è×a&#187;&#187;
  13. void DS18B20_Write_Byte(u8 dat);//D′è&#235;ò&#187;&#184;&#246;×&#214;&#189;ú
  14. u8 DS18B20_Read_Byte(void);        //&#182;á3&#246;ò&#187;&#184;&#246;×&#214;&#189;ú
  15. u8 DS18B20_Read_Bit(void);        //&#182;á3&#246;ò&#187;&#184;&#246;&#206;&#187;
  16. u8 DS18B20_Check(void);        //&#188;ì2aê&#199;·&#241;′&#230;&#212;úDS18B20
  17. void DS18B20_Rst(void);        //&#184;′&#206;&#187;DS18B20
  18. #endif


复制代码
ds18b20.c
  1. #include "ds18b20.h"
  2. #include "delay.h"       

  3. //&#184;′&#206;&#187;DS18B20
  4. void DS18B20_Rst(void)       
  5. {
  6. DS18B20_IO_OUT(); //SET PG11 OUTPUT
  7. DS18B20_DQ_OUT=0; //à-μíDQ
  8. delay_us(750); //à-μí750us
  9. DS18B20_DQ_OUT=1; //DQ=1
  10. delay_us(15); //15US
  11. }
  12. //μè′yDS18B20μ&#196;&#187;&#216;ó|
  13. //·μ&#187;&#216;1:&#206;′&#188;ì2aμ&#189;DS18B20μ&#196;′&#230;&#212;ú
  14. //·μ&#187;&#216;0:′&#230;&#212;ú
  15. u8 DS18B20_Check(void)
  16. {
  17. u8 retry=0;
  18. DS18B20_IO_IN();//SET PG11 INPUT       
  19. while (DS18B20_DQ_IN&&retry<200)
  20. {
  21. retry++;
  22. delay_us(1);
  23. };         
  24. if(retry>=200)return 1;
  25. else retry=0;
  26. while (!DS18B20_DQ_IN&&retry<240)
  27. {
  28. retry++;
  29. delay_us(1);
  30. };
  31. if(retry>=240)return 1;       
  32. return 0;
  33. }
  34. //′óDS18B20&#182;áè&#161;ò&#187;&#184;&#246;&#206;&#187;
  35. //·μ&#187;&#216;&#214;μ£o1/0
  36. u8 DS18B20_Read_Bit(void) // read one bit
  37. {
  38. u8 data;
  39. DS18B20_IO_OUT();//SET PG11 OUTPUT
  40. DS18B20_DQ_OUT=0;
  41. delay_us(2);
  42. DS18B20_DQ_OUT=1;
  43. DS18B20_IO_IN();//SET PG11 INPUT
  44. delay_us(12);
  45. if(DS18B20_DQ_IN)data=1;
  46. else data=0;       
  47. delay_us(50);
  48. return data;
  49. }
  50. //′óDS18B20&#182;áè&#161;ò&#187;&#184;&#246;×&#214;&#189;ú
  51. //·μ&#187;&#216;&#214;μ£o&#182;áμ&#189;μ&#196;êy&#190;Y
  52. u8 DS18B20_Read_Byte(void) // read one byte
  53. {
  54. u8 i,j,dat;
  55. dat=0;
  56. for (i=1;i<=8;i++)
  57. {
  58. j=DS18B20_Read_Bit();
  59. dat=(j<<7)|(dat>>1);
  60. }       
  61. return dat;
  62. }
  63. //D′ò&#187;&#184;&#246;×&#214;&#189;úμ&#189;DS18B20
  64. //dat£oòaD′è&#235;μ&#196;×&#214;&#189;ú
  65. void DS18B20_Write_Byte(u8 dat)
  66. {
  67. u8 j;
  68. u8 testb;
  69. DS18B20_IO_OUT();//SET PG11 OUTPUT;
  70. for (j=1;j<=8;j++)
  71. {
  72. testb=dat&0x01;
  73. dat=dat>>1;
  74. if (testb)
  75. {
  76. DS18B20_DQ_OUT=0;// Write 1
  77. delay_us(2);
  78. DS18B20_DQ_OUT=1;
  79. delay_us(60);
  80. }
  81. else
  82. {
  83. DS18B20_DQ_OUT=0;// Write 0
  84. delay_us(60);
  85. DS18B20_DQ_OUT=1;
  86. delay_us(2);
  87. }
  88. }
  89. }
  90. //&#191;aê&#188;&#206;&#194;&#182;è×a&#187;&#187;
  91. void DS18B20_Start(void)// ds1820 start convert
  92. {
  93. DS18B20_Rst();       
  94. DS18B20_Check();       
  95. DS18B20_Write_Byte(0xcc);// skip rom
  96. DS18B20_Write_Byte(0x44);// convert
  97. }
  98. //3&#245;ê&#188;&#187;ˉDS18B20μ&#196;IO&#191;ú DQ í&#172;ê±&#188;ì2aDSμ&#196;′&#230;&#212;ú
  99. //·μ&#187;&#216;1:2&#187;′&#230;&#212;ú
  100. //·μ&#187;&#216;0:′&#230;&#212;ú
  101. u8 DS18B20_Init(void)
  102. {
  103. GPIO_InitTypeDef GPIO_InitStructure;

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

  105. //GPIOG9
  106. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  107. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//&#198;&#213;í¨ê&#228;3&#246;&#196;£ê&#189;
  108. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//í&#198;íìê&#228;3&#246;
  109. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz
  110. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//é&#207;à-
  111. GPIO_Init(GPIOC, &GPIO_InitStructure);//3&#245;ê&#188;&#187;ˉ

  112. DS18B20_Rst();
  113. return DS18B20_Check();
  114. }
  115. //′óds18b20μ&#195;μ&#189;&#206;&#194;&#182;è&#214;μ
  116. //&#190;&#171;&#182;è£o0.1C
  117. //·μ&#187;&#216;&#214;μ£o&#206;&#194;&#182;è&#214;μ £¨-550~1250£&#169;
  118. short DS18B20_Get_Temp(void)
  119. {
  120. u8 temp;
  121. u8 TL,TH;
  122. short tem;
  123. DS18B20_Start (); // ds1820 start convert
  124. DS18B20_Rst();
  125. DS18B20_Check();       
  126. DS18B20_Write_Byte(0xcc);// skip rom
  127. DS18B20_Write_Byte(0xbe);// convert       
  128. TL=DS18B20_Read_Byte(); // LSB
  129. TH=DS18B20_Read_Byte(); // MSB
  130. if(TH>7)
  131. {
  132. TH=~TH;
  133. TL=~TL;
  134. temp=0;//&#206;&#194;&#182;è&#206;a&#184;o
  135. }else temp=1;//&#206;&#194;&#182;è&#206;a&#213;y       
  136. tem=TH; //&#187;&#241;μ&#195;&#184;&#223;°&#203;&#206;&#187;
  137. tem<<=8;
  138. tem+=TL;//&#187;&#241;μ&#195;μ×°&#203;&#206;&#187;
  139. tem=(double)tem*0.625;//×a&#187;&#187;
  140. if(temp)return tem; //·μ&#187;&#216;&#206;&#194;&#182;è&#214;μ
  141. else return -tem;
  142. }
复制代码



回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 16:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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