找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1287|回复: 8
收起左侧

DS18B20的分辨率怎么调整一下?

[复制链接]
ID:1010435 发表于 2023-3-7 22:21 | 显示全部楼层 |阅读模式
上面的18B20的温度变化只有0.5,应该怎么修改以下,能让温度在0.01就变化

  1. #include <OneWire.h>



  2. OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)

  3. void setup(void) {
  4.   Serial.begin(9600);
  5. }

  6. void loop(void) {
  7.   byte i;
  8.   byte present = 0;
  9.   byte type_s;
  10.   byte data[9];
  11.   byte addr[8];
  12.   float celsius, fahrenheit;
  13.   
  14.   if ( !ds.search(addr)) {
  15.     Serial.println("No more addresses.");
  16.     Serial.println();
  17.     ds.reset_search();
  18.     delay(250);
  19.     return;
  20.   }
  21.   
  22.   Serial.print("ROM =");
  23.   for( i = 0; i < 8; i++) {
  24.     Serial.write(' ');
  25.     Serial.print(addr[i], HEX);
  26.   }

  27.   if (OneWire::crc8(addr, 7) != addr[7]) {
  28.       Serial.println("CRC is not valid!");
  29.       return;
  30.   }
  31.   Serial.println();

  32.   // the first ROM byte indicates which chip
  33.   switch (addr[0]) {
  34.     case 0x10:
  35.       Serial.println("  Chip = DS18S20");  // or old DS1820
  36.       type_s = 1;
  37.       break;
  38.     case 0x28:
  39.       Serial.println("  Chip = DS18B20");
  40.       type_s = 0;
  41.       break;
  42.     case 0x22:
  43.       Serial.println("  Chip = DS1822");
  44.       type_s = 0;
  45.       break;
  46.     default:
  47.       Serial.println("Device is not a DS18x20 family device.");
  48.       return;
  49.   }

  50.   ds.reset();
  51.   ds.select(addr);
  52.   ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  53.   
  54.   delay(1000);     // maybe 750ms is enough, maybe not
  55.   // we might do a ds.depower() here, but the reset will take care of it.
  56.   
  57.   present = ds.reset();
  58.   ds.select(addr);   
  59.   ds.write(0xBE);         // Read Scratchpad

  60.   Serial.print("  Data = ");
  61.   Serial.print(present, HEX);
  62.   Serial.print(" ");
  63.   for ( i = 0; i < 9; i++) {           // we need 9 bytes
  64.     data[i] = ds.read();
  65.     Serial.print(data[i], HEX);
  66.     Serial.print(" ");
  67.   }
  68.   Serial.print(" CRC=");
  69.   Serial.print(OneWire::crc8(data, 8), HEX);
  70.   Serial.println();

  71.   // Convert the data to actual temperature
  72.   // because the result is a 16 bit signed integer, it should
  73.   // be stored to an "int16_t" type, which is always 16 bits
  74.   // even when compiled on a 32 bit processor.
  75.   int16_t raw = (data[1] << 8) | data[0];
  76.   if (type_s) {
  77.     raw = raw << 3; // 9 bit resolution default
  78.     if (data[7] == 0x10) {
  79.       // "count remain" gives full 12 bit resolution
  80.       raw = (raw & 0xFFF0) + 12 - data[6];
  81.     }
  82.   } else {
  83.     byte cfg = (data[4] & 0x60);
  84.     // at lower res, the low bits are undefined, so let's zero them
  85.     if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
  86.     else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
  87.     else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
  88.     //// default is 12 bit resolution, 750 ms conversion time
  89.   }
  90.   celsius = (float)raw / 16.0;
  91.   fahrenheit = celsius * 1.8 + 32.0;
  92.   Serial.print("  Temperature = ");
  93.   Serial.print(celsius);
  94.   Serial.print(" Celsius, ");
  95.   Serial.print(fahrenheit);
  96.   Serial.println(" Fahrenheit");
  97. }
复制代码

回复

使用道具 举报

ID:1010435 发表于 2023-3-7 22:23 | 显示全部楼层
这段程序是从米思齐里找到的
回复

使用道具 举报

ID:1065634 发表于 2023-3-7 23:16 | 显示全部楼层
通过寄存器地址0x4e地址内容修改为1f,3f,5f,分别对应精度0.5,0.25,0.125℃精度
回复

使用道具 举报

ID:1034262 发表于 2023-3-8 09:54 | 显示全部楼层
18B20的最小分辨率为0.0625度,你怎么能得到0.01度?
回复

使用道具 举报

ID:230500 发表于 2023-3-8 11:09 | 显示全部楼层
实现不了; 没有这个精度;

12位的分辨率,其精度是低4位决定的,因为低4位是代表的小数位,在低4位中,从高到底的每一位代表2^(-n)次方。

就是说第4位是2^-1=0.5,往下推2^-2=0.25,2^-3=0.125,2^-4=0.0625

18b20的测量精度是正负0.5摄氏度,最高分辨率是0.0625摄氏度(可设置采样精度来改变分辨率)。可以将分辨率提高或减小,但是精度是改不了的,由芯片决定了,可查阅datasheet。
回复

使用道具 举报

ID:1010435 发表于 2023-3-8 14:50 | 显示全部楼层
coody_sz 发表于 2023-3-8 09:54
18B20的最小分辨率为0.0625度,你怎么能得到0.01度?

我说错了 不好意思,是显示到0.01位不是度
回复

使用道具 举报

ID:1010435 发表于 2023-3-8 14:52 | 显示全部楼层
a399288395 发表于 2023-3-8 11:09
实现不了; 没有这个精度;

12位的分辨率,其精度是低4位决定的,因为低4位是代表的小数位,在低4位中, ...

受教了,我本想说是显示到0.01位,现在米思齐只能0.5度的变化
回复

使用道具 举报

ID:230500 发表于 2023-3-8 15:49 | 显示全部楼层
mtt661 发表于 2023-3-8 14:52
受教了,我本想说是显示到0.01位,现在米思齐只能0.5度的变化

如果只是要显示到小数点后2位 是可以的; 哪怕显示小数点后5位都是可以的;18B20  的精度是0.0625度;是可以显示小数点后4位的;  常规的办法就是把你得到和计算出的那个温度数,乘以1000倍;
不同的程序可能会有不同的BUG会出现;那同时程序也要改;程序中也要发命令告诉18B20,转换精度设置为12位; 那么延时时间也要改 12位分辨率转换时间好像是750毫秒
回复

使用道具 举报

ID:883242 发表于 2023-3-10 21:18 | 显示全部楼层
过采样oversampling可以实现显示0.01度,比如采样100次,把结果的和除100就能做到,但实际精度那就很不幸了。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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