DS18B20 è un sensore di temperatura digitale che utilizza un singolo bus di bus per comunicare con l'host. Soltanto 1 È necessario il filo per completare la lettura dei dati di temperatura;
DS18B20 ha un numero di serie del prodotto a 64 bit incorporato per una facile identificazione. Più sensori DS18b20 possono essere collegati a 1 Filo, e attraverso l'autenticazione dell'identità a 64 bit, Le informazioni di temperatura raccolte da diversi sensori possono essere lette separatamente.
Introduzione a DS18B20
2.1 Caratteristiche principali di DS18B20
1. Conversione e produzione di temperatura completamente digitale.
2. Comunicazione avanzata di dati di bus singolo.
3. Risoluzione fino a 12 bit, con una precisione fino a ± 0,5 gradi Celsius.
4. Il ciclo di lavoro massimo con una risoluzione a 12 bit è 750 millisecondi.
5. È possibile selezionare la modalità di lavoro parassita.
6. L'intervallo di temperatura di rilevamento è –55 ° C ~+125 ° C (–67 ° F ~+257 ° F).
7. Eeprom incorporato, funzione di allarme limite di temperatura.
8. 64-rom della fotolitografia bit, Numero di serie del prodotto integrato, Conveniente per la connessione multi-macchina.
9. Varie forme di imballaggio, Adattati a diversi sistemi hardware.
2.2 Funzione pin DS18B20
Terra di tensione GND;
Bus dati singolo DQ;
Tensione di alimentazione VDD;
Nc pin vuoto;
2.3 Principio di lavoro e applicazione DS18B20
Il rilevamento della temperatura DS18B20 e l'output dei dati digitali sono completamente integrati su un chip, Quindi ha una maggiore capacità anti-interferenza. Il suo ciclo di lavoro può essere diviso in due parti, vale a dire il rilevamento della temperatura e l'elaborazione dei dati.
18B20 ha tre forme di risorse di memoria. Sono: ROM SOLO MEMORIA ROM, utilizzato per archiviare il codice DS18B20ID; il primo 8 I bit sono codice serie singolo (Il codice DS18B20 è 19h), quanto segue 48 I bit sono il numero seriale unico del chip; l'ultimo 8 I bit sono il codice CRC (Controllo di ridondanza) di quanto sopra 56 bit. I dati sono impostati in produzione e non possono essere modificati dall'utente. DS18B20 ha un totale di 64 Bit di Rom.
Registro dei dati RAM, utilizzato per il calcolo interno e l'accesso ai dati, I dati vengono persi dopo l'interruzione dell'alimentazione, DS18B20 ha un totale di 9 byte di ariete, Ogni byte è 8 bit. Il primo e il secondo byte sono le informazioni sul valore dei dati dopo la conversione della temperatura; Il terzo e il quarto byte sono l'immagine speculare dell'EEPROM dell'utente (comunemente usato per la conservazione del valore di allarme di temperatura). Il suo valore verrà aggiornato quando viene ripristinato l'alimentazione. Il quinto byte è l'immagine speculare della terza Eeprom dell'utente. Il 6 °, 7th, e gli 8 ° byte sono registri di conteggio, che sono progettati per consentire agli utenti di ottenere una maggiore risoluzione della temperatura. Sono anche unità di conservazione temporanea per la conversione e il calcolo della temperatura interna. Il 9 ° byte è il codice CRC del primo 8 byte. EEPROM è una memoria non volatile utilizzata per archiviare i dati che devono essere salvati a lungo, Valori di allarme superiore e superiore a temperatura, e dati di verifica. DS18B20 ha un totale di 3 Bit di Eeprom, e ci sono immagini mirror in RAM per facilitare il funzionamento dell'utente.
DS18B20 funziona in modalità risoluzione a 12 bit per impostazione predefinita. I dati a 12 bit ottenuti dopo la conversione vengono archiviati in due RAM a 8 bit di DS18B20 (i primi due byte). Il primo 5 I bit in binario sono pezzi di segno. Se la temperatura misurata è maggiore di 0, questi 5 I bit sono 0. Basta moltiplicare il valore misurato 0.0625 Per ottenere la temperatura effettiva. Se la temperatura è inferiore a 0, questi 5 I bit sono 1. Il valore misurato deve essere invertito, aggiunto da 1, e poi moltiplicato per 0.0625 Per ottenere la temperatura effettiva. O utilizzare il funzionamento bit per estrarre la temperatura: I luoghi decimali occupano il basso 4 bit, e i pezzi superiori sono pezzi interi (I numeri negativi non sono considerati).
2.4 Tabella delle istruzioni ROM DS18B20
1. Leggi Rom [33H] (La parola di comando esadecimale si trova tra parentesi quadrate).
Questo comando consente al controller del bus di leggere la ROM a 64 bit di DS18B20. Questa istruzione può essere utilizzata solo quando c'è solo un DS18B20 sul bus. Se più di uno è collegato, I conflitti di dati si verificheranno durante la comunicazione.
2. atch rom [55H]
Questa istruzione è seguita da un numero di serie a 64 bit emesso dal controller. Quando ci sono più DS18B20 sul bus, Solo il chip con lo stesso numero di serie di quello emesso dal controller può rispondere, E gli altri chip attenderanno il prossimo ripristino. Questa istruzione è adatta per la connessione a chip singolo e multi-chip.
3. Camera delle navi [CCH]
Questa istruzione fa sì che il chip non risponda al codice ROM. Nel caso di un singolo autobus, Questa istruzione può essere utilizzata per risparmiare tempo. Se questa istruzione viene utilizzata quando sono collegati più chip, Si verificheranno conflitti di dati, risultante in errori.
4. Cerca ROM [F0H]
Dopo aver inizializzato il chip, L'istruzione di ricerca consente di identificare la ROM a 64 bit di tutti i dispositivi per l'eliminazione quando sono collegati più chip al bus.
5. Ricerca allarme [IO]
Nel caso di più chip, L'istruzione di ricerca del chip di allarme risponde solo ai chip che soddisfano la condizione di allarme della temperatura superiore a th o meno di TL. Finché il chip non è spento, Lo stato di allarme verrà mantenuto fino a quando la temperatura non viene nuovamente misurata e la condizione di allarme non viene raggiunta.
6. Scrivi scratchpad [4Eh]
Questa è l'istruzione per scrivere i dati su RAM. I due byte di dati scritti successivamente saranno archiviati all'indirizzo 2 (Th of Alarm Ram) e indirizzo 3 (TL di RAM di allarme). Il processo di scrittura può essere terminato da un segnale di ripristino.
7. Leggi ScratchPad (Leggi i dati da RAM) [Beh]
Questa istruzione leggerà i dati da RAM, A partire dall'indirizzo 0 e fino a indirizzare 9, Completare la lettura degli interi dati RAM. Il chip consente al segnale di ripristino di terminare il processo di lettura, questo è, I successivi byte non necessari possono essere ignorati per ridurre il tempo di lettura.
8. Copia Scratchpad (Copia i dati RAM su EEPROM) [48H]
Questa istruzione memorizza i dati in RAM in EEPROM in modo che i dati non vengano persi quando la potenza è spenta. Poiché il chip è impegnato con l'elaborazione di archiviazione EEPROM, Quando il controller invia una fascia oraria di lettura, Le uscite del bus “0”, e quando il lavoro di archiviazione è completato, Il bus verrà fornito “1”.
In modalità di lavoro parassita, Un forte pull-up deve essere utilizzato immediatamente dopo che questa istruzione viene emessa e mantenuta per almeno 10 ms per mantenere il funzionamento di chip.
9. Convertire t (conversione della temperatura) [44H]
Dopo aver ricevuto questa istruzione, Il chip eseguirà una conversione della temperatura e memorizzerà il valore di temperatura convertito nel primo e 2 ° indirizzi di RAM. Poiché il chip è impegnato con l'elaborazione della conversione della temperatura, Quando il controller invia una fascia oraria di lettura, Le uscite del bus “0”, e quando il lavoro di archiviazione è completato, Il bus verrà fornito “1”. In modalità di lavoro parassita, Un forte pull-up deve essere utilizzato immediatamente dopo che questa istruzione viene emessa e mantenuta per almeno 500 ms per mantenere il funzionamento di chip.
10. Ricorda Eeprom (Copia il valore di allarme in eeprom su RAM) [B8H]
Questa istruzione copia il valore di allarme in EEPROM al 3 ° e 4 ° byte in RAM. Poiché il chip è impegnato con la copia dell'elaborazione, Quando il controller invia una fascia oraria di lettura, Le uscite del bus “0”, e quando il lavoro di archiviazione è completato, Le uscite del bus “1”. Inoltre, Questa istruzione verrà eseguita automaticamente quando il chip è acceso e ripristinato. In questo modo, I due bit di byte di allarme in RAM saranno sempre l'immagine speculare dei dati in EEPROM.
11. Leggi l'alimentazione (Interruttore in modalità di lavoro) [B4H]
Dopo aver emesso questa istruzione, Viene emesso un divario di lettura, e il chip restituirà la sua parola di stato di potere. “0” è lo stato di potere parassita e “1” è lo stato di potenza esterno.
2.5 Diagramma di temporizzazione DS18B20
2.5.1 DS18B20 RESET e Diagramma delle relazioni di risposta
Un ripristino deve essere eseguito prima di ogni comunicazione. Il tempo di ripristino, Tempo di attesa, e il tempo di risposta dovrebbe essere rigorosamente programmato in base ai tempi.
DS18B20 Leggi e scrivi il gap time: La lettura e la scrittura dei dati DS18B20 è confermata dal bit di elaborazione del gap time e dalla parola di comando per scambiare informazioni.
2.5.2 Scrivi dati 0 e dati 1 a DS18B20
Nel primo 15us del gap di tempo di scrittura, Il bus deve essere tirato basso dal controller, E poi sarà il tempo di campionamento del chip per i dati del bus. Il tempo di campionamento è 15 ~ 60us. Se il controller tira in alto il bus durante l'ora di campionamento, Significa scrivere “1”, E se il controller abbassa il bus, Significa scrivere “0”.
Each bit of transmission should have a low-level start bit of at least 15uS, and the subsequent data “0” O “1” should be completed within 45uS.
The transmission time of the entire bit should be kept at 60~120uS, otherwise the normal communication cannot be guaranteed.
Nota: DS18B20 reads and writes data from the low bit.
2.5.3 Reading data 0 e dati 1 from DS18B20
The sampling time of the control during the read time gap should be more accurate. During the read time gap, the host must also generate a low level of at least 1uS to indicate the start of the read time. Poi, in 15uS after the bus is released, the DS18B20 will send the internal data bit. In questo momento, if the control finds that the bus is high, it means reading “1”, and if the bus is low, it means reading data “0”. Before reading each bit, the controller adds a start signal.
Nota: Il bit di dati deve essere letto entro 15us dall'inizio del divario di lettura per garantire una comunicazione corretta.
Durante la comunicazione, 8 pezzi di “0” O “1” sono usati come byte, E la lettura o la scrittura del byte inizia dal bit basso.
2.5.4 Ordine della temperatura di lettura una volta (Solo un singolo DS18B20 sull'autobus)
1. Invia segnale di ripristino
2. Rilevare il segnale di risposta
3. Invia 0xcc
4. Invia 0x44
5. Invia segnale di ripristino
6. Rilevare il segnale di risposta
7. Scrivi 0xcc
8. Scrivi 0xbe
9. Ciclo continuo 8 volte per leggere il basso byte di temperatura
10. Ciclo continuo 8 volte per leggere l'alto byte di temperatura
11. Sintetizzare i dati e il processo di temperatura a 16 bit
3. Codice del driver
3.1 DS18B20.C
#includere “DS18B20.H”
/*
Funzione: Inizializzazione DS18B20
Connessione hardware: PB15
*/
void ds18b20_init(vuoto)
{
RCC->Apb2enr|= 1<<3; //Pb
GPIOB->CRH&= 0x0FFFFFFF;
GPIOB->CRH|= 0x30000000;
GPIOB->ODR|= 1<<15; //Pull-up
}
/*
Funzione: Controlla se esiste il dispositivo DS18B20
Valore di ritorno: 1 significa che il dispositivo non esiste 0 significa che il dispositivo è normale
*/
U8 DS18B20_CheckDevice(vuoto) //Contiene impulsi di ripristino, impulso di rilevamento
{
Ds18b20_output_mode();//Inizializza in modalità output
Ds18b20_out = 0; //Generare impulso di ripristino
Delayus(750); //Genera 750US basso livello
Ds18b20_out = 1; //Bus di rilascio
Delayus(15); //Attendi la risposta DS18B20
Se(DS18B20_CLECKACK())//Rileva il polso di esistenza
{
ritorno 1;
}
ritorno 0;
}
/*
Funzione: Rilevare impulso di esistenza del dispositivo DS18B20
Valore di ritorno: 1 indica l'errore 0 indica normale
*/
U8 DS18B20_CLECKACK(vuoto)
{
U8 cnt = 0;
DS18B20_INPUT_MODE();//Inizializza in modalità di input
Mentre(Ds18b20_in&&cnt<200) //Attendere impulso di esistenza di risposta DS18B20
{
Delayus(1);
CNT ++;
}
Se(cnt>= 200)ritorno 1; //errore
cnt = 0;
Mentre((!Ds18b20_in)&&cnt<240) //Aspetta che DS18B20 rilasci l'autobus
{
Delayus(1);
CNT ++;
}
Se(cnt>= 240)ritorno 1; //errore
ritorno 0;
}
/*
Funzione: Scrivi un byte
Prima impara a scrivere un po '.
*/
void ds18b20_writebyte(u8 cmd)
{
u8 i;
Ds18b20_output_mode(); //Inizializza in modalità output
per(i = 0;io<8;I ++)
{
Ds18b20_out = 0; //Genera Write Time Gap (Scrivi inizia)
Delayus(2);
Ds18b20_out = cmd&0X01; //Invia bit dati effettivi
Delayus(60); //Aspetta il completamento della scrittura
Ds18b20_out = 1; //Rilasciare l'autobus e prepararsi per la prossima trasmissione
cmd>>= 1; //Continua a inviare il prossimo bit di dati
}
}
/*
Funzione: Leggi un byte
Prima impara a leggere un po '.
*/
U8 DS18B20_Readbyte(vuoto)
{
u8 i,dati = 0;
per(i = 0;io<8;I ++)
{
Ds18b20_output_mode(); //Inizializza in modalità output
Ds18b20_out = 0; //Genera il gap di lettura (Leggi Start)
Delayus(2);
Ds18b20_out = 1; //Bus di rilascio
DS18B20_INPUT_MODE(); //Inizializza in modalità di input
Delayus(8); //Attendere l'output dei dati DS18B20
dati>>= 1; //Riempi un bit conti con 0, Il default è 0
Se(Ds18b20_in) dati|= 0x80;
Delayus(60);
Ds18b20_out = 1; //Bus di rilascio, Aspetta di leggere il prossimo bit di dati
}
restituire dati;
}
/*
Funzione: Leggi i dati di temperatura di DS18B20 una volta
Valore di ritorno: i dati della temperatura letti
Considerata situazione: C'è solo un DS18B20 collegato al bus
*/
U16 DS18B20_Readtemp(vuoto)
{
U16 temp = 0;
u8 temp_h,temp_l;
DS18B20_CheckDevice(); //Invia il polso di ripristino, Rilevare il polso
Ds18b20_writebyte(0Xcc); //Salta il rilevamento della sequenza ROM
Ds18b20_writebyte(0x44); //Avvia una conversione della temperatura
//Attendere il completamento della conversione della temperatura
Mentre(DS18B20_Readbyte()!= 0xff){}
DS18B20_CheckDevice(); //Invia il polso di ripristino, Rilevare il polso
Ds18b20_writebyte(0Xcc); //Salta il rilevamento della sequenza ROM
Ds18b20_writebyte(0Xbe); //Leggi la temperatura
temp_l = ds18b20_readbyte(); //Leggi i dati a bassa temperatura
temp_h = ds18b20_readbyte(); //Leggi i dati ad alta temperatura
temp = temp_l|(temp_h<<8); //Temperatura sintetizzata
restituire temp;
}
3.2 DS18B20.H
#Ifndef DS18B20_H
#Definire DS18B20_H
#includere “STM32F10X.H”
#includere “sys.h”
#includere “ritardo.h”
#includere “DS18B20.H”
#includere “USART.H”
/*Interfaccia del pacchetto*/
//Inizializza DS18B20 in modalità di input
#Definire DS18B20_INPUT_MODE() {GPIOB->CRH&= 0x0FFFFFFF;GPIOB->CRH|= 0x80000000;}
//Inizializza DS18B20 in modalità di uscita
#Definire DS18B20_OUTPUT_MODE(){GPIOB->CRH&= 0x0FFFFFFF;GPIOB->CRH|= 0x30000000;}
//Output della porta IO DS18B20
#Definire ds18b20_out pbout(15)
//DS18B20 IO INGRESSO PORTA
#Definire ds18b20_in pbin(15)
//Dichiarazione della funzione
U8 DS18B20_CLECKACK(vuoto);
U8 DS18B20_CheckDevice(vuoto);
void ds18b20_init(vuoto);
U16 DS18B20_Readtemp(vuoto);
U8 DS18B20_Readbyte(vuoto);
void ds18b20_writebyte(u8 cmd);
#endif
poybagdydxcawkkmaaaak8rns4s030.png
3.3 Funzione di ritardo
/*
Funzione: Ritardo negli Stati Uniti
*/
Vuoto Delayus(int noi)
{
#ifdef _systick_irq_
int i,J;
per(i = 0;ival = 0; //CONTER VALORE CNT
Systick->Load = 9*US; //9 significa 1us
Systick->CTRL|= 1<<0; //Avviare il timer
Fare
{
tmp = systick->CTRL; //Leggi lo stato
}Mentre((!(tmp&1<<16))&&(tmp&1<<0));
Systick->Val = 0; //CONTER VALORE CNT
Systick->CTRL&= ~(1<<0); //Spegni il timer
#endif
};I ++)>
3.4 Main.c Chiama DS18B20 per leggere la temperatura e stamparla alla porta seriale
#includere “STM32F10X.H”
#includere “DS18B20.H”
U8 DS18B20_ROM[8]; //Memorizza il codice ROM a 64 bit di DS18B20
int principale(vuoto)
{
u16 temp;
Usartx_init(USART1,72.115200);//Inizializzazione della porta seriale 1
Ds18b20_init(); //Inizializzazione DS18B20
/*1. Leggi il codice ROM a 64 bit di DS18B20*/
//Invia il polso di ripristino, Rileva il polso di esistenza
Mentre(DS18B20_CheckDevice())
{
printf(“Il dispositivo DS18B20 non esiste!\N”);
Ritardo(500);
}
//Invia il comando per leggere il codice ROM a 64 bit
Ds18b20_writebyte(0x33);
//Loop Leggi il codice ROM a 64 bit
per(i = 0;io<8;I ++)
{
DS18B20_ROM[io]= Ds18b20_readbyte();
printf(“DS18B20_ROM[%D]=0x%X\n”,io,DS18B20_ROM[io]);
}
Mentre(1)
{
/*2. Azionare contemporaneamente tutti i DS18B20 sul bus per iniziare a convertire la temperatura*/
DS18B20_CheckDevice(); //Invia il polso di ripristino, Rilevare il polso
Ds18b20_writebyte(0Xcc); //Salta il rilevamento della sequenza ROM
Ds18b20_writebyte(0x44); //Avvia una conversione della temperatura (Lascia che tutto DS18B20 sul bus converti la temperatura)
Ritardo(500); //Attendi per completare tutte le conversioni di temperatura DS18B20 sulla linea
/*3. Lettura mirata singola della temperatura di ciascun DS18B20*/
DS18B20_CheckDevice(); //Invia il polso di ripristino, Rilevare il polso
Ds18b20_writebyte(0x55); //Invia il comando a Match Rom
per(i = 0;io<8;I ++) //Invia codice a 64 bit
{
Ds18b20_writebyte(DS18B20_ROM[io]);
}
Ds18b20_writebyte(0Xbe); //Leggi la temperatura
temp = ds18b20_readbyte(); //Leggi i dati di temperatura a basso ordine
temp|= Ds18b20_readbyte()<<8; //Leggi i dati di temperatura ad alto ordine
printf(“temp1=%d.%d\n”,temp>>4,temp&0xf);
printf(“temp2=%f\n”,temp*0,0625);
Ritardo(500);
}
}