一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 3850|回复: 14
收起左侧

[其他综合] 我的另类18B20寄生电源

[复制链接]
发表于 2015-5-22 20:47 | 显示全部楼层 |阅读模式
关于18B20的寄生电源模式,文档上都是说转换及读取温度时立即将DQ端强上拉,我用STC的MCU的强上拉模式试了不成功。软的不行干脆来硬的。
参考18B20内部框图:
18B20-0.jpg
只要设法增加那个储能电容的容量就可以了。
我是在数据端到VCC端接一支1N4148,VCC端到GND端接一支0.1uF电容,实测还不行。
换成1uF的实测可以正常工作了。
18B20-1.jpg
18B20-2.jpg
18B20-4.jpg
示波器观测VCC端波形:
18B20-3.jpg
发表于 2015-5-22 23:39 | 显示全部楼层
好像标准两线制的话vcc是要接地的

没试过,只是手册里看到过
 楼主| 发表于 2015-5-22 23:45 | 显示全部楼层
是啊,但是找不到范例程序,自己试了下不行所以才上硬件。
发表于 2015-5-23 01:28 | 显示全部楼层
寄生电源代码跟外部供电代码,稍微不同,
寄生电源代码,有个规定在xxns之内,要强上拉,要足够强上拉,io输出不够,就得修改代码用三极管反相输出强上拉
发表于 2015-5-23 03:58 | 显示全部楼层
狗狗百里游 发表于 2015-5-23 01:28
寄生电源代码跟外部供电代码,稍微不同,
寄生电源代码,有个规定在xxns之内,要强上拉,要足够强上拉,io ...

你的意思,另外再用个IO来控制三极管来输出强上拉?如果用ST的单片机用PP模式能行不,,18b20我还没做过2线,现在看到就讨论一下
发表于 2015-5-23 08:34 | 显示全部楼层
技术不错
发表于 2015-5-23 08:35 | 显示全部楼层
跟本不需要强上拉, 我用外部上拉电阻3K正常测温的
 楼主| 发表于 2015-5-23 21:22 | 显示全部楼层
xiaosun 发表于 2015-5-23 08:35
跟本不需要强上拉, 我用外部上拉电阻3K正常测温的

2线的吗?求开源。
发表于 2015-5-24 00:45 | 显示全部楼层

//读ds18b20供电情况,
//如果返回1表示ds18b20是由外部电源供电
//返回0表示是利用1-wire总线寄生供电
//返回2表示ds18b20不存在

unsigned char read_power_supply(ds18b20_typedef * _ds18b20_)
{
  cli();

  if ( RESET_18b20(_ds18b20_) == 1 )
    {
      write_18b20( 0xcc, _ds18b20_ ); //跳过Rom  没有这个就不起作用了。
      write_18b20(0xb4, _ds18b20_); //读电源供电方式(B4H) 了解18B20的供电方式

      _ds18b20_->ds18b20_power = read_byte(_ds18b20_) & 1;
//return (read_byte(_ds18b20_)&1);//其实只要取1bit,这只是为了减少代码,但要读8bit

    }

  else
    _ds18b20_->ds18b20_power = 2;


  sei();
  return (_ds18b20_->ds18b20_power);

}




unsigned char set_ds18b20_Convert_Temperature ( ds18b20_typedef * _ds18b20_ )
{
  unsigned char  flag_18b20;
  cli();
  flag_18b20 = 0;

  if (read_power_supply(_ds18b20_) != 2)
    if (RESET_18b20 (_ds18b20_) == 1)
      {
        write_18b20 ( 0xcc, _ds18b20_ ); //skip rom
        write_18b20 ( 0x44, _ds18b20_ ); //temp convert

        if (_ds18b20_->ds18b20_power == 0)  //如果不是1-wire总线寄生供电,就不使用,强上拉,减少损坏电路可能
          {
            SET_18B20_IO_qiang_vcc;  //强上拉_高电平_输出状态
          }

//   delay_ms_18b20(760);      //延时等转换完成,12bit需要750ms
//SET_18B20_IO_ruo_vcc;   //弱上拉_输入状态

//flag_18b20=Read_18b20_Temperature(_ds18b20_,32);
        flag_18b20 = 1;
      }

  sei();
  return flag_18b20;//返回1,发送温度转换命令成功,返回0,ds18b20不存在.
}

我看了一下以前我avr的代码,三线两线驱动,只有是否强上拉一句代码。
c51用个三级管反转强上拉也是可以的。
发表于 2015-5-24 00:49 | 显示全部楼层
我用两线寄生供电,用五米左右的线放18b20在阳台,再用crc校验结果,出错就重复10次之内,是可以得出正确结果的,
意思是有时候干扰还是什么,设置成重复读结果4次,有可能提示crc出错。

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-4-28 01:06 , Processed in 0.071638 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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