DS18B20 é um sensor de temperatura digital que usa um único tempo de barramento para se comunicar com o host. Apenas 1 O fio é necessário para completar a leitura dos dados de temperatura;
DS18B20 possui um número de série de produto integrado de 64 bits para fácil identificação. Vários sensores DS18B20 podem ser conectados a 1 Arame, e por meio de autenticação de identidade de 64 bits, as informações de temperatura coletadas de diferentes sensores podem ser lidas separadamente.
Introdução ao DS18B20
2.1 Principais características do DS18B20
1. Conversão e saída de temperatura totalmente digital.
2. Comunicação avançada de dados de barramento único.
3. Resolução de até 12 bits, com uma precisão de até ±0,5 graus Celsius.
4. O ciclo de trabalho máximo na resolução de 12 bits é 750 milissegundos.
5. O modo de trabalho parasita pode ser selecionado.
6. A faixa de temperatura de detecção é –55° C ~+125° C (–67°F ~+257°F).
7. EEPROM integrada, função de alarme de limite de temperatura.
8. 64-ROM de fotolitografia de bits, número de série do produto integrado, conveniente para conexão de várias máquinas.
9. Várias formas de embalagem, adaptar-se a diferentes sistemas de hardware.
2.2 Função do pino DS18B20
Tensão GND terra;
Barramento de dados único DQ;
Tensão de alimentação VDD;
Pino vazio NC;
2.3 Princípio de funcionamento e aplicação do DS18B20
A detecção de temperatura DS18B20 e a saída de dados digitais são totalmente integradas em um chip, por isso tem capacidade anti-interferência mais forte. Seu único ciclo de trabalho pode ser dividido em duas partes, nomeadamente detecção de temperatura e processamento de dados.
18B20 possui três formas de recursos de memória. Eles são: Memória ROM somente leitura, usado para armazenar o código DS18B20ID; o primeiro 8 bits são códigos de série de linha única (O código DS18B20 é 19H), a seguir 48 bits são o número de série exclusivo do chip; o último 8 bits são o código CRC (verificação de redundância) do acima 56 bits. Os dados são definidos na produção e não podem ser alterados pelo usuário. DS18B20 tem um total de 64 pedaços de ROM.
Registro de dados RAM, usado para cálculo interno e acesso a dados, os dados são perdidos após falha de energia, DS18B20 tem um total de 9 bytes de RAM, cada byte é 8 bits. O primeiro e o segundo bytes são as informações do valor dos dados após a conversão da temperatura; o terceiro e quarto bytes são a imagem espelhada da EEPROM do usuário (comumente usado para armazenamento de valor de alarme de temperatura). Seu valor será atualizado quando a energia for reiniciada. O quinto byte é a imagem espelhada da terceira EEPROM do usuário. O 6º, 7th, e os 8º bytes são registros de contagem, que são projetados para permitir que os usuários obtenham resolução de temperatura mais alta. Eles também são unidades de armazenamento temporário para conversão e cálculo de temperatura interna. O 9º byte é o código CRC do primeiro 8 bytes. EEPROM é uma memória não volátil usada para armazenar dados que precisam ser salvos por um longo tempo, valores de alarme de temperatura superior e inferior, e dados de verificação. DS18B20 tem um total de 3 pedaços de EEPROM, e há imagens espelhadas na RAM para facilitar a operação do usuário.
DS18B20 funciona no modo de resolução de 12 bits por padrão. Os dados de 12 bits obtidos após a conversão são armazenados em duas RAMs de 8 bits do DS18B20 (os dois primeiros bytes). O primeiro 5 bits em binário são bits de sinal. Se a temperatura medida for superior a 0, esses 5 bits são 0. Basta multiplicar o valor medido por 0.0625 para obter a temperatura real. Se a temperatura for inferior a 0, esses 5 bits são 1. O valor medido precisa ser invertido, adicionado por 1, e depois multiplicado por 0.0625 para obter a temperatura real. Ou use a operação de bits para extrair a temperatura: as casas decimais ocupam a parte inferior 4 bits, e os bits superiores são bits inteiros (números negativos não são considerados).
2.4 Tabela de instruções da ROM do chip DS18B20
1. Leia ROM [33H] (a palavra de comando hexadecimal está entre colchetes).
Este comando permite que o controlador de barramento leia a ROM de 64 bits do DS18B20. Esta instrução só pode ser usada quando houver apenas um DS18B20 no barramento. Se mais de um estiver conectado, conflitos de dados ocorrerão durante a comunicação.
2. anexar ROM [55H]
Esta instrução é seguida por um número de série de 64 bits emitido pelo controlador. Quando há vários DS18B20s no barramento, apenas o chip com o mesmo número de série daquele emitido pelo controlador pode responder, e os outros chips aguardarão o próximo reset. Esta instrução é adequada para conexão de chip único e multichip.
3. Sala de navios [CCH]
Esta instrução faz com que o chip não responda ao código ROM. No caso de um único ônibus, esta instrução pode ser usada para economizar tempo. Se esta instrução for usada quando vários chips estiverem conectados, ocorrerão conflitos de dados, resultando em erros.
4. Pesquisar ROM [F0H]
Depois que o chip for inicializado, a instrução de pesquisa permite que a ROM de 64 bits de todos os dispositivos seja identificada por eliminação quando vários chips estão conectados ao barramento.
5. Pesquisa de alarme [CADA]
No caso de vários chips, a instrução de busca de chip de alarme responde apenas aos chips que atendem à condição de alarme de temperatura superior a TH ou inferior a TL. Contanto que o chip não esteja desligado, o estado de alarme será mantido até que a temperatura seja medida novamente e a condição de alarme não seja atingida.
6. Escreva ScratchPad [4EH]
Esta é a instrução para gravar dados na RAM. Os dois bytes de dados gravados posteriormente serão armazenados no endereço 2 (TH da RAM de alarme) e endereço 3 (TL de RAM de alarme). O processo de gravação pode ser encerrado por um sinal de reset.
7. Leia o ScratchPad (ler dados da RAM) [BEH]
Esta instrução irá ler dados da RAM, começando pelo endereço 0 e até o endereço 9, completando a leitura de todos os dados da RAM. O chip permite que o sinal de reset encerre o processo de leitura, aquilo é, os bytes desnecessários subsequentes podem ser ignorados para reduzir o tempo de leitura.
8. Copie o ScratchPad (copie os dados da RAM para a EEPROM) [48H]
Esta instrução armazena os dados na RAM na EEPROM para que os dados não sejam perdidos quando a energia for desligada. Como o chip está ocupado com o processamento de armazenamento EEPROM, quando o controlador envia um intervalo de tempo de leitura, as saídas do barramento “0”, e quando o trabalho de armazenamento estiver concluído, o ônibus irá produzir “1”.
No modo de trabalho parasita, um pull-up forte deve ser usado imediatamente após esta instrução ser emitida e mantido por pelo menos 10MS para manter a operação do chip.
9. Converter T (conversão de temperatura) [44H]
Depois de receber esta instrução, o chip realizará uma conversão de temperatura e armazenará o valor de temperatura convertido no 1º e 2º endereços da RAM. Como o chip está ocupado com o processamento de conversão de temperatura, quando o controlador envia um intervalo de tempo de leitura, as saídas do barramento “0”, e quando o trabalho de armazenamento estiver concluído, o ônibus irá produzir “1”. No modo de trabalho parasita, um forte pull-up deve ser usado imediatamente após esta instrução ser emitida e mantido por pelo menos 500MS para manter a operação do chip.
10. Recuperar EEPROM (Copie o valor do alarme na EEPROM para a RAM) [B8H]
Esta instrução copia o valor do alarme na EEPROM para o 3º e 4º bytes da RAM. Como o chip está ocupado com o processamento de cópias, quando o controlador envia um intervalo de tempo de leitura, as saídas do barramento “0”, e quando o trabalho de armazenamento estiver concluído, as saídas do barramento “1”. Além disso, esta instrução será executada automaticamente quando o chip for ligado e reiniciado. Desta maneira, os dois bits de bytes de alarme na RAM serão sempre a imagem espelhada dos dados na EEPROM.
11. Leia a fonte de alimentação (Interruptor de modo de trabalho) [B4H]
Após esta instrução ser emitida, um intervalo de tempo de leitura é emitido, e o chip retornará sua palavra de status de energia. “0” é o estado de poder parasita e “1” é o estado de energia externa.
2.5 Diagrama de temporização DS18B20
2.5.1 Diagrama de relacionamento de redefinição e resposta DS18B20
Uma reinicialização deve ser realizada antes de cada comunicação. O tempo de reinicialização, tempo de espera, e o tempo de resposta deve ser estritamente programado de acordo com o tempo.
Intervalo de tempo de leitura e gravação DS18B20: A leitura e gravação de dados DS18B20 é confirmada pelo bit de processamento de intervalo de tempo e pela palavra de comando para troca de informações.
2.5.2 Gravar dados 0 e dados 1 para DS18B20
Nos primeiros 15uS do intervalo de tempo de gravação de dados, o barramento precisa ser puxado para baixo pelo controlador, e então será o tempo de amostragem do chip para os dados do barramento. O tempo de amostragem é 15~60uS. Se o controlador puxar o barramento para cima durante o tempo de amostragem, isso significa escrever “1”, e se o controlador puxar o barramento para baixo, isso significa escrever “0”.
Cada bit de transmissão deve ter um bit inicial de baixo nível de pelo menos 15uS, e os dados subsequentes “0” ou “1” deve ser concluído dentro de 45uS.
O tempo de transmissão de todo o bit deve ser mantido em 60 ~ 120uS, caso contrário, a comunicação normal não pode ser garantida.
Observação: DS18B20 lê e grava dados do bit baixo.
2.5.3 Lendo dados 0 e dados 1 de DS18B20
O tempo de amostragem do controle durante o intervalo de tempo de leitura deve ser mais preciso. Durante o intervalo de tempo de leitura, o host também deve gerar um nível baixo de pelo menos 1uS para indicar o início do tempo de leitura. Então, em 15uS após a liberação do ônibus, o DS18B20 enviará o bit de dados interno. Neste momento, se o controle descobrir que o barramento está alto, isso significa ler “1”, e se o ônibus estiver baixo, significa ler dados “0”. Antes de ler cada pedaço, o controlador adiciona um sinal de partida.
Observação: O bit de dados deve ser lido dentro de 15uS do início do intervalo de leitura para garantir a comunicação correta.
Durante a comunicação, 8 pedaços de “0” ou “1” são usados como um byte, e a leitura ou escrita do byte começa no bit baixo.
2.5.4 Ordem de leitura da temperatura uma vez (apenas um único DS18B20 no barramento)
1. Enviar sinal de reinicialização
2. Detectar sinal de resposta
3. Enviar 0xCC
4. Enviar 0x44
5. Enviar sinal de reinicialização
6. Detectar sinal de resposta
7. Escreva 0xcc
8. Escreva 0xbe
9. Laço 8 vezes para ler o byte baixo de temperatura
10. Laço 8 vezes para ler o byte alto de temperatura
11. Sintetize dados e processos de temperatura de 16 bits
3. Código do motorista
3.1 DS18B20.c
#incluir “ds18b20.h”
/*
Função: Inicialização DS18B20
Conexão de hardware: PB15
*/
Void ds18b20_init(vazio)
{
RCC->APB2ENR|=1<<3; //OP
GPIOB->CRH&=0x0FFFFFFFF;
GPIOB->CRH|=0x30000000;
GPIOB->ODR|=1<<15; //Pull-up
}
/*
Função: Verifique se o dispositivo DS18B20 existe
Valor de retorno: 1 significa que o dispositivo não existe 0 significa que o dispositivo está normal
*/
u8 DS18B20_CheckDevice(vazio) //Contém pulso de reinicialização, pulso de detecção
{
DS18B20_OUTPUT_MODE();//Inicializar no modo de saída
DS18B20_OUT=0; //Gerar pulso de reinicialização
Atraso(750); //Gerar 750us de baixo nível
DS18B20_OUT=1; //Liberar ônibus
Atraso(15); //Aguarde a resposta do DS18B20
se(DS18B20_CleckAck())//Detectar pulso de existência
{
retornar 1;
}
retornar 0;
}
/*
Função: Detectar pulso de existência do dispositivo DS18B20
Valor de retorno: 1 indica erro 0 indica normal
*/
u8 DS18B20_CleckAck(vazio)
{
u8 cnt=0;
DS18B20_INPUT_MODE();//Inicializar no modo de entrada
enquanto(DS18B20_IN&&cnt<200) //Aguarde o pulso de existência da resposta DS18B20
{
Atraso(1);
cnt++;
}
se(cnt>=200)retornar 1; //erro
cnt=0;
enquanto((!DS18B20_IN)&&cnt<240) //espere o DS18B20 liberar o barramento
{
Atraso(1);
cnt++;
}
se(cnt>=240)retornar 1; //erro
retornar 0;
}
/*
Função: Escreva um byte
Primeiro aprenda a escrever um pouco.
*/
Void DS18B20_WRITEBYTE(u8 cmd)
{
u8 eu;
DS18B20_OUTPUT_MODE(); //Inicializar no modo de saída
para(eu=0;eu<8;eu++)
{
DS18B20_OUT=0; //Gerar intervalo de tempo de gravação (escrever começar)
Atraso(2);
DS18B20_OUT=cmd&0x01; //Enviar bit de dados real
Atraso(60); //Aguarde a conclusão da gravação
DS18B20_OUT=1; //Solte o ônibus e prepare-se para a próxima transmissão
cmd>>=1; //Continue a enviar o próximo bit de dados
}
}
/*
Função: Ler um byte
Primeiro aprenda a ler um pouco.
*/
u8 DS18B20_ReadByte(vazio)
{
u8 eu,dados=0;
para(eu=0;eu<8;eu++)
{
DS18B20_OUTPUT_MODE(); //Inicializar no modo de saída
DS18B20_OUT=0; //Gerar intervalo de tempo de leitura (leia começar)
Atraso(2);
DS18B20_OUT=1; //Liberar ônibus
DS18B20_INPUT_MODE(); //Inicializar no modo de entrada
Atraso(8); //Aguarde a saída de dados DS18B20
dados>>=1; //Preencha a parte alta com 0, o padrão é 0
se(DS18B20_IN) dados|=0x80;
Atraso(60);
DS18B20_OUT=1; //Liberar ônibus, espere para ler o próximo pedaço de dados
}
dados de retorno;
}
/*
Função: Leia os dados de temperatura do DS18B20 uma vez
Valor de retorno: os dados de temperatura lidos
Situação considerada: Existe apenas um DS18B20 conectado ao barramento
*/
u16 DS18B20_ReadTemp(vazio)
{
temperatura u16=0;
u8 temp_H,temp_L;
DS18B20_CheckDevice(); //Enviar pulso de reinicialização, detectar pulso
DS18B20_WRITEBYTE(0XCC); //Ignorar detecção de sequência de ROM
DS18B20_WRITEBYTE(0x44); //Iniciar uma conversão de temperatura
//Aguarde a conclusão da conversão de temperatura
enquanto(Ds18b20_readbyte()!=0xFF){}
DS18B20_CheckDevice(); //Enviar pulso de reinicialização, detectar pulso
DS18B20_WRITEBYTE(0XCC); //Ignorar detecção de sequência de ROM
DS18B20_WRITEBYTE(0Xbe); //Ler temperatura
temp_L=DS18B20_ReadByte(); //Leia dados de baixa temperatura
temp_H=DS18B20_ReadByte(); //Leia dados de alta temperatura
temperatura=temp_L|(temperatura_H<<8); //Temperatura sintetizada
Retornar Temp;
}
3.2 DS18B20.h
#ifndef DS18B20_H
#definir DS18B20_H
#incluir “stm32f10x.h”
#incluir “sys.h”
#incluir “atraso.h”
#incluir “ds18b20.h”
#incluir “usart.h”
/*Interface do pacote*/
//Inicialize DS18B20 para modo de entrada
#definir DS18B20_INPUT_MODE() {GPIOB->CRH&=0x0FFFFFFFF;GPIOB->CRH|=0x80000000;}
//Inicialize DS18B20 para modo de saída
#definir DS18B20_OUTPUT_MODE(){GPIOB->CRH&=0x0FFFFFFFF;GPIOB->CRH|=0x30000000;}
//Saída da porta IO DS18B20
#definir DS18B20_OUT PBout(15)
//Entrada da porta IO DS18B20
#definir DS18B20_IN PBin(15)
//Declaração de função
u8 DS18B20_CleckAck(vazio);
u8 DS18B20_CheckDevice(vazio);
Void ds18b20_init(vazio);
u16 DS18B20_ReadTemp(vazio);
u8 DS18B20_ReadByte(vazio);
Void DS18B20_WRITEBYTE(u8 cmd);
#final se
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png
3.3 Função de atraso
/*
Função: Atraso em nós
*/
anular DelayUs(entre nós)
{
#ifdef _SYSTICK_IRQ_
int eu,j;
para(eu=0;iVAL=0; //Valor do contador CNT
SysTick->CARREGAR=9*nós; //9 significa 1us
SysTick->CTRL|=1<<0; //Iniciar cronômetro
fazer
{
tmp=SysTick->CTRL; //Ler status
}enquanto((!(tmp&1<<16))&&(tmp&1<<0));
SysTick->VAL=0; //Valor do contador CNT
SysTick->CTRL&=~(1<<0); //Desligue o cronômetro
#final se
};eu++)>
3.4 main.c Ligue para DS18B20 para ler a temperatura e imprimi-la na porta serial
#incluir “stm32f10x.h”
#incluir “ds18b20.h”
u8 DS18B20_ROM[8]; //Armazene o código ROM de 64 bits do DS18B20
int main(vazio)
{
temperatura u16;
USARTx_Heat(USART1,72,115200);//Inicialização da porta serial 1
Ds18b20_init(); //Inicialização DS18B20
/*1. Leia o código ROM de 64 bits do DS18B20*/
//Enviar pulso de reinicialização, detectar pulso de existência
enquanto(DS18B20_CheckDevice())
{
printf(“O dispositivo DS18B20 não existe!\n”);
Atrasos(500);
}
//Envie o comando para ler o código ROM de 64 bits
DS18B20_WRITEBYTE(0x33);
//Loop de leitura de código ROM de 64 bits
para(eu=0;eu<8;eu++)
{
DS18B20_ROM[eu]= DS18B20_ReadByte();
printf(“DS18B20_ROM[%d]=0x%X\n”,eu,DS18B20_ROM[eu]);
}
enquanto(1)
{
/*2. Opere simultaneamente todos os DS18B20 no barramento para iniciar a conversão de temperatura*/
DS18B20_CheckDevice(); //Enviar pulso de reinicialização, detectar pulso
DS18B20_WRITEBYTE(0XCC); //Ignorar detecção de sequência de ROM
DS18B20_WRITEBYTE(0x44); //Iniciar uma conversão de temperatura (deixe todos os DS18B20 no barramento converterem a temperatura)
Atrasos(500); //Aguarde a conclusão de todas as conversões de temperatura DS18B20 na linha
/*3. Leitura direcionada única da temperatura de cada DS18B20*/
DS18B20_CheckDevice(); //Enviar pulso de reinicialização, detectar pulso
DS18B20_WRITEBYTE(0x55); //Enviar comando para corresponder à ROM
para(eu=0;eu<8;eu++) //Enviar código de 64 bits
{
DS18B20_WRITEBYTE(DS18B20_ROM[eu]);
}
DS18B20_WRITEBYTE(0Xbe); //Ler temperatura
temp=DS18B20_ReadByte(); //Leia dados de temperatura de baixa ordem
temperatura|=DS18B20_ReadByte()<<8; //Leia dados de temperatura de alta ordem
printf(“temp1=%d.%d\n”,temperatura>>4,temperatura&0xF);
printf(“temp2=%f\n”,temperatura*0,0625);
Atrasos(500);
}
}
English
Afrikaans
العربية
বাংলা
bosanski jezik
Български
Català
粤语
中文(简体)
中文(漢字)
Hrvatski
Čeština
Nederlands
Eesti keel
Suomi
Français
Deutsch
Ελληνικά
हिन्दी; हिंदी
Magyar
Bahasa Indonesia
Italiano
日本語
한국어
Latviešu valoda
Lietuvių kalba
македонски јазик
Bahasa Melayu
Norsk
پارسی
Polski
Português
Română
Русский
Cрпски језик
Slovenčina
Slovenščina
Español
Svenska
ภาษาไทย
Türkçe
Українська
اردو
Tiếng Việt







