Salvar a Terra, uma resistência de cada vez - resistor de pull-up externa não é mais necessário para o sensor de temperatura DS18B20
Autor: Jefferson Gomes | Publicado: 2015-09-18T21:42:00-03:00

Utilizar o DS18b20 sem resistor de pull-up




SUMÁRIO EXECUTIVO:



Usando o Arduino atualizado código da biblioteca 1-Wire apresentado aqui, você pode eliminar a necessidade de um resistor de pull-up externa para pequenas redes típicas de sensores de temperatura DS18B20.&nbsp;Isso também deve funcionar com qualquer processador AVR e outros tipos de dispositivos 1-Wire também.Você pode baixar a biblioteca 1-Wire atualizada aqui ...

https://github.com/bigjosh/OneWireNoResistor/archive/master.zip

O mítico "necessária" pull-up externa



A partir da Ficha de Dados de DS18B20


Se você já usou o onipresente (e incrivelmente útil!)&nbsp;&nbsp;Família DS18B20&nbsp;&nbsp;de sensores de temperatura 1-wire, que você quase certamente usou um 4.7K ohm resistor pull-up também.&nbsp;Cada uma das&nbsp;aparentemente&nbsp;intermináveis&nbsp;​​ArduinoDS18B20&nbsp;&nbsp;&nbsp;tutoriais&nbsp;na web começa com alguma versão da linha "Você não será capaz de fazer qualquer coisa com esse senhor até que você sair e adquirir-se um resistor 4.7K ohm".&nbsp;Adafruit é ainda generoso o suficiente para incluir um desses resistores com cada sensor de temperatura baseado no DS18B20 eles vendem (seja ele&nbsp;nua,&nbsp;à prova&nbsp;d'água,&nbsp;ou&nbsp;&nbsp;oi-temp), porque eles sabem que você vai precisar dele.

Estou aqui para dizer-lhe que tudo está prestes a mudar.&nbsp;Se você estava apostando em seus arsenais de 4.7k ohm resistores ser a única reserva de valor confiável nestes tempos incertos, você precisa repensar a sua estratégia de preservação de ativos de longo prazo porque o prazo de uma década de demanda estável para esta peça é sobre a despencar.&nbsp;Sim - agora é possível conectar sensores DS18B20 sem qualquer resistência externa de pull-up em tudo!

Alegações ultrajantes exigir prova ultrajante, então vamos começar com uma breve demonstração que prova, sem sombra de dúvida, que esta não é apenas uma teoria Maluca, mas fato duro frio ...





Compreender o pull-up

Na tradição testada pelo tempo, o 4.7K ohm resistor pull-up está sempre conectado entre o positivo e a linha de dados e mantém a alta da linha de dados a menos que o mestre ou um dos salves está ativamente puxando-o para baixo.&nbsp;Isso é útil porque vários dispositivos podem puxar a linha de dados para baixo ao mesmo tempo e nada de ruim acontece.&nbsp;Existe um protocolo legal que todo mundo segue que lhes permite continuar a comunicação ordenada neste fio compartilhada.

Acontece que o processador no Arduino foi construído com pull-ups internos sobre os pinos de I / O que pode ser ativado via software.&nbsp;Estes pull-ups pode ser muito convenientemente, porque eles permitem que você, por exemplo,&nbsp;ligar um interruptor&nbsp;entre um pino e terra.&nbsp;O pull-up irá realizar o pino em alta, a menos que o interruptor de liga-lo à terra.&nbsp;Estes pull-ups internos são especificados na&nbsp;Folha de Dados&nbsp;como ohms 20K-50K ...



Enquanto isso é muito mais resistência do que os 4.7k ohms especificados para os 1-wire pull-ups, ainda podemos fazer o trabalho para muitos casos.&nbsp;Há verdadeiro fator limitante aqui é o tempo - o tempo que leva para o ônibus para voltar a um nível elevado, após um dos dispositivos está terminado puxando-o para baixo.

Sem entrar em muitos detalhes, aqui é o que parece que quando um mestre 1-Wire lê um pouco de um escravo (também a partir da folha de dados DS18B20) ...



O mestre vai puxar a linha de dados para baixo para dizer o escravo está pronto para ler um pouco, e então ele vai deixar de ir a linha de dados para ver o que acontece.&nbsp;Se o escravo quer enviar um 0, ele vai sinalizar assim puxando a linha para baixo.&nbsp;Se o mestre vê que a linha ainda é baixa, mesmo depois de deixá-la ir, então ele sabe que o escravo está enviando um bit 0.&nbsp;Se o escravo quer enviar um bit 1, então ele não faz nada e apenas permite que a linha se afastou até alta quando o mestre deixa ir.&nbsp;O mestre olha para a linha depois que ele deixou ir, e se voltou ao alto, então ele sabe que o escravo enviou uma 1. Cool, certo?

No caso de o escravo enviar um bit 0, o pull-up não tem efeito durante a transmissão efectiva de bits.&nbsp;Vamos partir do estado do mestre puxando ativamente baixo, para o estado de tanto o principal como o escravo puxando ativamente baixo, para o estado de apenas o escravo puxando baixo. &nbsp;A linha é ativamente baixo em toda a pouco e seria por isso mesmo sem pull-up em tudo.

No caso de a 1 bit, precisamos do pull-up para puxar a alta a linha depois o mestre deixa ir.&nbsp;Este é o momento em que a seta vermelha está apontando para cima.&nbsp;A área despojado por baixo da seta é o período de tempo onde a linha está sendo puxado de baixo a alto pelo pull-up.&nbsp;Isso não acontece de imediato, porque o resistor de pull-up, os dispositivos no barramento, e os fios que conectam todas elas formam um&nbsp;circuito&nbsp;RC.&nbsp;Quanto maior a resistência e da capacitância, o que levará mais tempo para a linha para voltar a um nível elevado.

A especificação diz que, no caso de um bit 0, o escravo vai puxar a linha para baixo dentro 1us do mestre puxando-baixo, e vai realizar alinha de dados para baixo, pelo menos 15US depois.&nbsp;Para ser capaz de dizer se o escravo estava enviando um 1 ou 0 bit, o mestre olha para a linha durante este tempo para ver se ele permaneceu baixo (o escravo foi puxando-a de baixo para enviar um bit 0), ou ele voltou para alta (o escravo enviou um 1 bit por não fazer nada e apenas deixar a linha se afastou até a alta após o mestre deixar ir).

Estas restrições de protocolo limitar o tamanho da resistência de pull-up e a capacitância do sistema.&nbsp;Se demorar mais tempo do que alinha 15US para voltar ao alto após o início dessa seqüência, em seguida, o mestre verá a linha como baixo e falsamente acho que o escravo estava enviando um bit 0.&nbsp;Desde a especificação também diz que o mestre deve manter a linha para baixo, pelo menos 1us para iniciar todo o processo, então ficamos com 14US para o pull-up para puxar a linha para cima a partir de baixo para alto.



Bit "1" com um pull-up externa


O traço amarelo no fundo é uma configuração de disparo I para mostrar quando as coisas acontecem.&nbsp;O gatilho vai alto quando o mestre deixa para ir a linha, e, em seguida, vai baixa quando o mestre lê a linha para ver se um "0" ou "1" bit está presente.&nbsp;O traço azul é a linha e você pode ver uma curva íngreme RC agradável, onde a linha de dados sobe após o mestre deixa para ir.&nbsp;Ela só faz-lo de volta até 5 volts pelo tempo que o mestre lê-lo.

Assim, pode o interno 50K Ohm (pior caso) interna pull-up fazer o trabalho?&nbsp;Bem, tudo depende da resistência e a capacidade dos dispositivos no barramento e os fios de ligação deles.&nbsp;Acontece que este é também um fator limitante ao usar um 4.7K pull-up externa, é justo que o menor resistor pull-up lhe dará mais espaço para maior resistência e capacitância na rede.

Existem&nbsp;documentos muito úteis&nbsp;que dão heurística para determinar quantos dispositivos, quanto fio, e quais configurações funcionará em redes normais 1-wire com resistores externos.&nbsp;Todas essas mesmas dicas se aplicam a redes internas impulsionados por 50K Ohm pull-ups, você só recebem menos de tudo.

Objetivo baixo

Para que tudo funcione, a nossa pull-up deve ser capaz de puxar a linha de volta até um "1" dentro de 14US.&nbsp;Mas o que é a tensão mínima para o mestre ver um bit "1"?

Como estamos usando um pino de entrada digital do nosso AVR para sentir a linha, e uma vez que estão em execução com uma tensão de alimentação (VCC) de 5 volts, a folha de dados dá a resposta aqui ...



Nível mínimo de tensão de entrada para um bit 1 ao executar a 5 volts


Precisamos de pelo menos cerca de 2,6 volts na / O pin I para que possa ser visto como um "1".

Isso pode funcionar?

Acontece que este é apenas um clássico&nbsp;circuito RC&nbsp;&nbsp;que se parece com isso ....



O maior C1 é, mais tempo vai demorar para carregar embora a 50K ohm resistor pull-up.&nbsp;Nós precisamos de encontrar o maior valor de C1 que vai pegar o ônibus até 2,6 volts em menos de 14US.

Podemos usar a fórmula ..

Vc = V * (1- e ^ (- t / R * C))

... Para descobrir o que podemos apenas torná-lo sob o fio se C1 é 400pF.Qualquer maior eo ônibus pode ser menor do que o nosso limiar de 2,6 volts no final da 14US (você pode conferir meu trabalho&nbsp;aqui).

400pF não é um monte de capacitância.&nbsp;Isso pode funcionar?

Existem 3 principais fontes de capacidade nas redes 1-wire - os nós (da nossa DS18B20), os fios, eo pino de entrada no mestre.

A folha de dados do DS18B20 nos diz que o pino de dados tem uma capacidade máxima de 25pF ...



Uma capacitância típicas para o fio de par entrançado é da ordem de&nbsp;1pF porpolegada.

A capacitância de um pino de entrada de um microcontrolador como o nosso AVR é ​​tipicamente na ordem de 20pF.

Porque todas estas capacitâncias estão em paralelo, podemos apenas adicioná-los juntos para encontrar a capacitância total.

Assim, desde que estejam dentro dos parâmetros da presente fórmula ...


(Sensor_count&nbsp;&nbsp;* 25pF) +&nbsp;(total_length_of_wire&nbsp;* 1pF / polegada) + 20 pF <400pf em="" style="background: transparent; border: 0px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;"><!--400pf--><!--400pf--><!--400pf--><!--400pf--><!--400pf--><!--400pf-->




... Então ele só poderia trabalhar!

Mas ele realmente funciona na vida real?

Realmente funciona.&nbsp;Um metro de fio com 4 sensores de obras.&nbsp;10 metros de fio com 1 obras sensores.&nbsp;3 metros de fio com 2 sensores de obras.&nbsp;Experimente.

Utilidade prática

Meu palpite é que o pull-up interno será bom o suficiente para a grande maioria das pessoas que utilizam os sensores DS18B20.&nbsp;A nova biblioteca é parece o mesmo que o antigo para o programador e irá trabalhar com ou sem um pull-up externa, para que você possa usá-lo para todos os seus projetos e esperamos que salvar o resistor maior parte do tempo.

Se você precisa de dezenas de sensores pendurados dezenas de metros de fios para monitorar o núcleo do seu reactor reprodutor para fusão parcial, então você pode fazer alarde o extra de R $ 0,02 para uma potencialmente supérfluo pull-up externa, sem ferir meus sentimentos.

Note-se que nos casos em que o interno pull-up não é forte o suficiente, você vai saber porque você não será capaz de se comunicar com os sensores, em que ponto você pode simplesmente adicionar um resistor externo e iniciar automaticamente de trabalho (supondo que o externo pull-up&nbsp;é&nbsp;forte o suficiente para a sua rede).

Implementação de Software

Ele acaba por ser quase trivialmente fácil para permitir que o pull-up interno em um pino de I / O digitais AVR em software.&nbsp;É também muito fácil de adicionar o código necessário para a biblioteca 1-fio existente.&nbsp;Você pode ver as mudanças necessárias para o original código 1-Wire aqui ...

https://github.com/bigjosh/OneWireNoResistor/commit/ebba80cf61920aef399efa252826b1b59feb6589

As mudanças são ligeiras - 2 linhas adicionadas e 2 removido.

A idéia básica é a de ligar o pull-ups a qualquer momento interno do ônibus não está sendo conduzido activamente (alta ou baixa) pelo mestre.&nbsp;Este mesmo economiza um pouco de energia (cerca de&nbsp;10 trilhões de elétron-volts por pulso dereset!)&nbsp;No caso em que o mestre está conduzindo ativamente o ônibus baixo, porque já não está lutando contra o externo pull-up.

O novo código resultante é compatível com o código antigo, e vai trabalhar com ou sem resistores pull-up externos.

Enquanto eu tinha o código aberto, eu também adicionou uma nova função que lhe permite dizer a diferença entre um ônibus curto e um ônibus que apenas não tem escravos nela.&nbsp;A função é chamada busFail () e pode ser útil na depuração de redes falharam.

Você pode encontrar a versão mais recente da biblioteca aqui ...

https://github.com/bigjosh/OneWireNoResistor

Instalação Passo-a-Passo

Baixe, instale e execute a versão 1.6.4 ou superior do&nbsp;Arduino&nbsp;IDE.
Baixe o&nbsp;biblioteca DallasTempurature como um ZIP&nbsp;e instalá-lo escolhendo "do esboço&gt; Incluir Library-&gt; Adicionar .ZIP Biblioteca ..."
Baixe o&nbsp;biblioteca OneWireNoResistor como um ZIP&nbsp;e instalá-lo escolhendo "do esboço&gt; Incluir Library-&gt; Adicionar .ZIP Biblioteca ..."
Abra o programa de exemplo, escolhendo "File-&gt; exemplos-&gt; OneWire Sem resistor&gt; NoPullupTester".
Ligue um sensor (s) de temperatura para o Arduino como mostrado acima.
Corre!


FAQ

Q: Como pode haver corrente suficiente indo embora a 50K Ohm interna pull-up de dispositivos de energia parasita no ônibus?
A: Os chips são DS18B20 especificação-ed para puxar 5uA quando ocioso (I&nbsp;DQ).Isto significa uma queda de tensão de apenas&nbsp;0,25 volts&nbsp;por dispositivo escravo.Uma vez que estamos começando a 5 volts, eo chip DS18B20 é especificação-ed para correr para baixo a 3 volts (V&nbsp;DD), então devemos Wost caso ser capaz de obter&nbsp;até 8 salves&nbsp;no ônibus antes da queda de tensão no interior pull-up é o fator limitante.

Q: Como sobre a 1.5mA per escravo necessário durante uma conversão de temperatura ou EEPROM?
A: Apesar da&nbsp;admoestação dire na&nbsp;wiki,&nbsp;a biblioteca 1-Wire impulsiona ativamente o barramento de alta energia durante estes eventos famintos que existam dispositivos estão sendo executados no poder parasita.&nbsp;Isto significa que os resistores pull-up (internas ou externas) são irrelevantes nestes casos.&nbsp;Um pino de I / O digital é especificação-ed para ser capaz de conduzir 20 mA, por isso você deve ser capaz de fazer uma conversão de temperatura simultânea com até uma dúzia de sensores movidos a parasitas no ônibus.&nbsp;Na prática, eu tenho feito ainda mais e ele funcionou bem para que os sensores são provavelmente desenho inferior à corrente máxima 1.5mA especificação-ed.

Q: Ajuda!&nbsp;Eu preciso adicionar mais escravos / fio à minha rede e eu simplesmente não estão dispostos a gastar mais o meu dinheiro suado para comprar essa resistência externa a menos que seja 100% necessário!
A: Nós ainda temos alguns truques na manga para obter ainda mais headroom fora de nossas redes.&nbsp;Nosso fator limitante acima foi que o bit "1" não teve tempo para subir todo o caminho até o nível onde ele poderia ser se registrar como um "1" na entrada pino digital (cerca de 2,6 volts).&nbsp;Mesmo que não há tensão suficiente para um pino de I / O digital para vê-lo como um "1", podemos ver claramente que está a aumentar apenas olhando para ele.&nbsp;Se tivéssemos de mudar para um pino de entrada analógica, bem, então nós poderíamos detectar sobe tão pequeno como micro-volts!&nbsp;Isto nos daria muito, muito mais espaço em ambas as redes interna e externamente puxados-up.&nbsp;E, apenas Acontece que a forma como as nossas amostras de chip AVR pinos analógicos funciona perfeitamente para esta tarefa.Há demasiada informação para enfiar nesta FAQ Resposta-mas talvez eu vou escrever um artigo de acompanhamento com código de trabalho se houver interesse suficiente.

Q: Espere, eu entendo tudo sobre o interno pull-up, mas como você conseguiu o sensor de trabalhar diretamente ligado ao Arduino cabeçalho?
A: Fácil - Acabei de adicionar as seguintes linhas de código para a função setup () ...
&nbsp; // Estas linhas apenas torná-lo assim que você pode ligar diretamente para um DS18B20  &nbsp; // Pinos digitial 8-10.  &nbsp;  &nbsp; digitalWrite (8, LOW); &nbsp; pinMode (8, OUTPUT); &nbsp; digitalWrite (10, LOW); &nbsp; &nbsp; pinMode (10, OUTPUT); 

Estes dois pinos agora são movidos baixo e aterrar de forma eficaz, de modo que tanto o Vcc e no chão do sensor está agora ligado à terra, mesmo se você ligá-lo de cabeça para baixo (lembre-se que Vcc pode ir para o chão e não poder porque nós estamos usando parasitária desligue o pino de dados no meio).

Q: Por que o frick você não apenas comprar um maldito $ 0,02 resistor você frickin 'pão-duro!
A: Na verdade, tenho caixas de 4.7k resistências sentados na minha prateleira.Não é isso que se trata.&nbsp;Acabei trabalhando sobre isso porque eu estava escrevendo instruções para um registrador de temperatura DS18B20 e ficou preso na parte sobre como ligar o pull-up.&nbsp;Olhei ao redor da web, e todo mundo disse que a resistência externa era "necessária" sem explanation.I aposto que existem lotes e lotes de pessoas que animadamente sentou-se para construir um projeto com um novo sensor de DS18B20 que pegou no caminho de casa, apenas para perder toda a sua dinâmica quando eles descobriram que eles precisam de uma parte extra que eles não têm.&nbsp;Espero que agora as futuras gerações de construtores DS18B20 vai evitar essa frustração.

Eu também sou obcecado com a&nbsp;eliminação de hardware com software inteligentesempre que possível.&nbsp;Hardware é mater e, portanto, você tem que fabricar, mover, e dispor de todos e cada parte do hardware utilizado.&nbsp;Nenhum destes problemas se aplica a esses software - escrevê-lo de uma vez e ele pode ser usado de forma eficiente infinitamente muitas vezes em muitos lugares infinitamente por um número infinito de pessoas.&nbsp;E quando você dispor de um velho pedaço de código, você tem mais espaço do que quando começou, e não menos.&nbsp;Nós nunca vai ficar sem espaço para aterros código.&nbsp;Eu acho que o software inteligente poderia eliminar cerca de 20% se o assunto na maioria dos objetos tecnológicos.&nbsp;Pense em um mundo onde cada telefone, computador, carro e foi de 20% menos material.&nbsp;Pense sobre o esforço necessário para fabricar tudo o que desnecessário massa, e para transportá-lo ao redor do mundo, e, em seguida, para despejá-lo.&nbsp;Estou feliz de trocar um pouco do meu tempo para se livrar da necessidade de uma amplamente utilizado&nbsp;$ 0,02&nbsp;resistor!



Fonte:&nbsp;http://wp.josh.com/2014/06/23/no-external-pull-up-needed-for-ds18b20-temp-sensor/