DS18B20 est un capteur de température numérique qui utilise une seule synchronisation de bus pour communiquer avec l'hôte. Seulement 1 Un fil est nécessaire pour terminer la lecture des données de température;
DS18B20 a un numéro de série de produit 64 bits intégré pour une identification facile. Plusieurs capteurs DS18B20 peuvent être connectés à 1 Fil, et à travers l'authentification d'identité 64 bits, Les informations de température collectées à partir de différents capteurs peuvent être lues séparément.
Présentation du DS18B20
2.1 Caractéristiques principales de DS18B20
1. Conversion et sortie de température entièrement numériques.
2. Communication avancée de données de bus unique.
3. Résolution jusqu'à 12 bits, avec une précision allant jusqu'à ± 0,5 degrés Celsius.
4. Le cycle de travail maximum à la résolution 12 bits est 750 millisecondes.
5. Le mode de travail parasite peut être sélectionné.
6. La plage de températures de détection est de –55 ° C ~ + 125 ° C (–67 ° F ~ + 257 ° F).
7. Eeprom intégré, Fonction d'alarme de limite de température.
8. 64-bit Photolithography Rom, Numéro de série du produit intégré, pratique pour la connexion multi-machine.
9. Divers formulaires d'emballage, s'adapter à différents systèmes matériels.
2.2 Fonction DS18B20
Terre de tension GND;
DQ Bus de données unique;
Tension d'alimentation VDD;
Pin vide NC;
2.3 Principe et application de travail DS18B20
La détection de température DS18B20 et la sortie des données numériques sont entièrement intégrées sur une puce, Il a donc une capacité anti-ingérence plus forte. Son seul cycle de travail peut être divisé en deux parties, à savoir la détection de température et le traitement des données.
18B20 a trois formes de ressources de mémoire. Ils sont: Mémoire de lecture seule ROM, Utilisé pour stocker le code DS18B20ID; le premier 8 Les bits sont un code de série à une seule ligne (Le code DS18B20 est 19h), ce qui suit 48 Les bits sont le numéro de série unique de la puce; le dernier 8 Les bits sont le code CRC (chèque de redondance) de ce qui précède 56 morceaux. Les données sont définies à la production et ne peuvent pas être modifiées par l'utilisateur. DS18B20 a un total de 64 Bits de Rom.
Registre de données RAM, Utilisé pour le calcul interne et l'accès aux données, Les données sont perdues après une défaillance de puissance, DS18B20 a un total de 9 octets de bélier, Chaque octet est 8 morceaux. Les premier et deuxième octets sont les informations sur la valeur des données après la conversion de la température; Les troisième et quatrième octets sont l'image miroir de l'éprom de l'utilisateur (couramment utilisé pour le stockage de la valeur d'alarme de température). Sa valeur sera actualisée lorsque la puissance sera réinitialisée. Le cinquième octet est l'image miroir du troisième EEPROM de l'utilisateur. Le 6e, 7ème, et les 8e octets sont des registres de comptage, qui sont conçus pour permettre aux utilisateurs d'obtenir une résolution de température plus élevée. Ce sont également des unités de stockage temporaires pour la conversion et le calcul de la température interne. Le 9e octet est le code CRC du premier 8 octets. EEPROM est une mémoire non volatile utilisée pour stocker des données qui doivent être enregistrées pendant longtemps, Valeurs d'alarme de température supérieure et inférieure, et données de vérification. DS18B20 a un total de 3 Bits d'Eeprom, Et il y a des images miroir dans RAM pour faciliter le fonctionnement de l'utilisateur.
DS18B20 fonctionne en mode de résolution 12 bits par défaut. Les données 12 bits obtenues après la conversion sont stockées dans deux RAM 8 bits de DS18B20 (les deux premiers octets). Le premier 5 Les bits en binaire sont des bits de signe. Si la température mesurée est supérieure à 0, ces 5 Les bits sont 0. Multipliez simplement la valeur mesurée par 0.0625 Pour obtenir la température réelle. Si la température est inférieure à 0, ces 5 Les bits sont 1. La valeur mesurée doit être inversée, ajouté par 1, puis multiplié par 0.0625 Pour obtenir la température réelle. Ou utiliser le fonctionnement du bit pour extraire la température: les décimales occupent le plus bas 4 morceaux, et les bits supérieurs sont des bits entiers (Les nombres négatifs ne sont pas pris en compte).
2.4 Table d'instructions ROM de la puce DS18B20
1. Lire la rom [33H] (Le mot de commande hexadécimal est à carré crochets).
Cette commande permet au contrôleur de bus de lire la ROM 64 bits de DS18B20. Cette instruction ne peut être utilisée que lorsqu'il n'y a qu'un seul DS18B20 dans le bus. Si plus d'un est connecté, Les conflits de données se produiront pendant la communication.
2. atch rom [55H]
Cette instruction est suivie d'un numéro de série 64 bits émis par le contrôleur. Lorsqu'il y a plusieurs ds18b20 dans le bus, Seule la puce avec le même numéro de série que celle publiée par le contrôleur peut répondre, Et les autres puces attendront la prochaine réinitialisation. Cette instruction convient à la connexion à puce unique et multi-chip.
3. Salle de navire [CCH]
Cette instruction fait que la puce ne répond pas au code ROM. Dans le cas d'un seul bus, Cette instruction peut être utilisée pour gagner du temps. Si cette instruction est utilisée lorsque plusieurs puces sont connectées, Les conflits de données se produiront, entraînant des erreurs.
4. ROM ROM [F0H]
Une fois la puce initialisée, L'instruction de recherche permet d'identifier la ROM 64 bits de tous les appareils par élimination lorsque plusieurs puces sont connectées au bus.
5. Recherche d'alarme [je]
Dans le cas de plusieurs puces, L'instruction de recherche de puce d'alarme ne répond qu'aux puces qui répondent à la condition d'alarme de température supérieure à celle ou inférieure à TL. Tant que la puce n'est pas éteinte, L'état d'alarme sera maintenu jusqu'à ce que la température soit à nouveau mesurée et que la condition d'alarme ne soit pas atteinte.
6. Écrire Scratchpad [4Eh]
Ceci est l'instruction d'écrire des données à RAM. Les deux octets de données écrits par la suite seront stockés à l'adresse 2 (TH de l'alarme RAM) et adresser 3 (TL de RAM d'alarme). Le processus d'écriture peut être résilié par un signal de réinitialisation.
7. Lire Scratchpad (Lire les données de RAM) [Bel]
Cette instruction lira les données de RAM, À partir de l'adresse 0 Et pour s'adresser 9, terminer la lecture de l'ensemble des données RAM. La puce permet au signal de réinitialisation de terminer le processus de lecture, c'est, Les octets inutiles ultérieurs peuvent être ignorés pour réduire le temps de lecture.
8. Copier Scratchpad (Copiez les données RAM sur EEPROM) [48H]
Cette instruction stocke les données en RAM dans EEPROM afin que les données ne soient pas perdues lorsque l'alimentation est désactivée. Puisque la puce est occupée avec le traitement du stockage EEPROM, Lorsque le contrôleur envoie un créneau horaire de lecture, les sorties de bus “0”, Et lorsque le travail de stockage est terminé, Le bus sortira “1”.
En mode de travail parasite, Une forte pull-up doit être utilisée immédiatement après l'émission et maintenue de cette instruction pendant au moins 10 ms pour maintenir le fonctionnement des puces.
9. Convertir t (conversion de température) [44H]
Après avoir reçu cette instruction, La puce effectuera une conversion de température et stockera la valeur de température convertie dans les 1er et 2e adresses de la RAM. Puisque la puce est occupée par le traitement de la conversion de la température, Lorsque le contrôleur envoie un créneau horaire de lecture, les sorties de bus “0”, Et lorsque le travail de stockage est terminé, Le bus sortira “1”. En mode de travail parasite, Une forte pull-up doit être utilisée immédiatement après l'émission et maintenue de cette instruction pendant au moins 500 ms pour maintenir le fonctionnement des puces.
10. Rappeler Eeprom (Copiez la valeur d'alarme dans EEPROM en RAM) [B8h]
Cette instruction copie la valeur d'alarme en EEPROM aux 3e et 4e octets de RAM. Puisque la puce est occupée à copier le traitement, Lorsque le contrôleur envoie un créneau horaire de lecture, les sorties de bus “0”, Et lorsque le travail de stockage est terminé, les sorties de bus “1”. En outre, Cette instruction sera automatiquement exécutée lorsque la puce sera mise sous tension et réinitialise. De cette façon, Les deux bits d'octets d'alarme en RAM seront toujours l'image miroir des données dans EEPROM.
11. Lire l'alimentation (Commutateur de mode de travail) [B4H]
Une fois cette instruction, Un écart de lecture est émis, et la puce renverra son mot d'alimentation. “0” est l'état de pouvoir parasite et “1” est l'état de puissance externe.
2.5 Diagramme de synchronisation DS18B20
2.5.1 Diagramme de réinitialisation et de réponse de réinitialisation DS18B20
Une réinitialisation doit être effectuée avant chaque communication. L'heure de réinitialisation, temps d'attente, et le temps de réponse doit être strictement programmé en fonction du timing.
DS18B20 Lire et écrivez un écart de temps: La lecture et l'écriture des données DS18B20 sont confirmées par le bit de traitement du temps et le mot de commande pour échanger des informations.
2.5.2 Écrire des données 0 et les données 1 à ds18b20
Dans les 15 premiers US de l'écart de données d'écriture, Le bus doit être tiré par le contrôleur, Et puis ce sera le temps d'échantillonnage des puces pour les données de bus. Le temps d'échantillonnage est de 15 à 60us. Si le contrôleur tire le bus élevé pendant le temps d'échantillonnage, Cela signifie écrire “1”, Et si le contrôleur tire le bus bas, Cela signifie écrire “0”.
Chaque bit de transmission devrait avoir un bit de départ de bas niveau d'au moins 15 US, et les données suivantes “0” ou “1” devrait être terminé dans les 45us.
Le temps de transmission de tout le bit doit être conservé à 60 à 120 US, sinon la communication normale ne peut être garantie.
Note: DS18B20 lit et écrit des données à partir du bit bas.
2.5.3 Données de lecture 0 et les données 1 De DS18B20
Le temps d'échantillonnage du contrôle pendant l'écart de lecture devrait être plus précis. Pendant l'écart de lecture, L'hôte doit également générer un niveau bas d'au moins 1 US pour indiquer le début du temps de lecture. Alors, dans 15us après la libération du bus, Le DS18B20 enverra le bit de données interne. A cette époque, Si le contrôle trouve que le bus est élevé, Cela signifie lire “1”, Et si le bus est bas, Cela signifie lire les données “0”. Avant de lire chaque bit, Le contrôleur ajoute un signal de démarrage.
Note: Le bit de données doit être lu dans les 15 heures suivant le début de l'écart de lecture pour assurer une communication correcte.
Pendant la communication, 8 bits de “0” ou “1” sont utilisés comme octet, Et la lecture ou l'écriture de l'octet commence à partir du bit bas.
2.5.4 Ordre de la température de lecture une fois (Un seul DS18B20 dans le bus)
1. Envoyer un signal de réinitialisation
2. Détecter le signal de réponse
3. Envoyer 0xcc
4. Envoyer 0x44
5. Envoyer un signal de réinitialisation
6. Détecter le signal de réponse
7. Écrivez 0xcc
8. Écrivez 0xbe
9. Boucle 8 fois pour lire l'octet bas de la température
10. Boucle 8 fois pour lire l'octet élevé de la température
11. Synthétiser les données et le processus de température 16 bits
3. Code de conducteur
3.1 Ds18b20.c
#inclure “ds18b20.h”
/*
Fonction: Initialisation DS18B20
Connexion matérielle: PB15
*/
void ds18b20_init(vide)
{
RCC->Apb2enr|= 1<<3; //PB
GpioB->CRH&= 0x0fffffff;
GpioB->CRH|= 0x30000000;
GpioB->ODR|= 1<<15; //Tirer vers le haut
}
/*
Fonction: Vérifiez si le périphérique DS18B20 existe
Valeur de retour: 1 signifie que l'appareil n'existe pas 0 signifie que l'appareil est normal
*/
U8 DS18B20_CHECKDEVICE(vide) //Contient une impulsion de réinitialisation, impulsion de détection
{
Ds18b20_output_mode();//Initialiser le mode de sortie
Ds18b20_out = 0; //Générer une réinitialisation d'impulsion
Retardus(750); //Générer 750 US de bas niveau
Ds18b20_out = 1; //Bus de libération
Retardus(15); //Attendez la réponse DS18B20
si(Ds18b20_cleckack())//Détecter l'impulsion d'existence
{
retour 1;
}
retour 0;
}
/*
Fonction: Détecter l'impulsion d'existence de l'appareil DS18B20
Valeur de retour: 1 indique une erreur 0 indique normal
*/
U8 DS18B20_CLECKACK(vide)
{
U8 cnt = 0;
Ds18b20_input_mode();//Initialiser le mode d'entrée
alors que(Ds18b20_in&&cnt<200) //Attendez la réponse à la réponse DS18B20
{
Retardus(1);
CNT ++;
}
si(cnt>= 200)retour 1; //erreur
cnt = 0;
alors que((!Ds18b20_in)&&cnt<240) //Attendez que DS18B20 libère le bus
{
Retardus(1);
CNT ++;
}
si(cnt>= 240)retour 1; //erreur
retour 0;
}
/*
Fonction: Écrire un octet
Apprenez d'abord à écrire un peu.
*/
void ds18b20_writebyte(CMD U8)
{
U8 I;
Ds18b20_output_mode(); //Initialiser le mode de sortie
pour(i = 0;je<8;je++)
{
Ds18b20_out = 0; //Générer l'écart de temps d'écriture (Écrire Start)
Retardus(2);
Ds18b20_out = cmd&0x01; //Envoyer un bit de données réel
Retardus(60); //Attendez l'achèvement de l'écriture
Ds18b20_out = 1; //Libérez le bus et préparez-vous à la prochaine transmission
CMD>>= 1; //Continuez à envoyer le prochain morceau de données
}
}
/*
Fonction: Lire un octet
Apprenez d'abord à lire un peu.
*/
U8 DS18B20_READBYTE(vide)
{
U8 I,données = 0;
pour(i = 0;je<8;je++)
{
Ds18b20_output_mode(); //Initialiser le mode de sortie
Ds18b20_out = 0; //Générer l'écart de temps de lecture (Lire Start)
Retardus(2);
Ds18b20_out = 1; //Bus de libération
Ds18b20_input_mode(); //Initialiser le mode d'entrée
Retardus(8); //Attendez la sortie des données DS18B20
données>>= 1; //Remplir un bit haut de gamme 0, la valeur par défaut est 0
si(Ds18b20_in) données|= 0x80;
Retardus(60);
Ds18b20_out = 1; //Bus de libération, Attendez la lecture de données suivantes
}
Retour des données;
}
/*
Fonction: Lisez les données de température de DS18B20 une fois
Valeur de retour: Les données de température se lisent
Situation considérée: Il n'y a qu'un seul DS18B20 connecté au bus
*/
U16 DS18B20_READTEMP(vide)
{
U16 temp = 0;
U8 temp_h,temp_l;
Ds18b20_checkdevice(); //Envoyer une impulsion de réinitialisation, détecter l'impulsion
Ds18b20_writebyte(0xCC); //Sauter la détection de séquence ROM
Ds18b20_writebyte(0x44); //Démarrer une conversion de température
//Attendez la conversion de la température pour terminer
alors que(Ds18b20_readbyte()!= 0xff){}
Ds18b20_checkdevice(); //Envoyer une impulsion de réinitialisation, détecter l'impulsion
Ds18b20_writebyte(0xCC); //Sauter la détection de séquence ROM
Ds18b20_writebyte(0xBE); //Température de lecture
temp_l = ds18b20_readbyte(); //Lire des données à basse température
temp_h = ds18b20_readbyte(); //Lire des données à haute température
temp = temp_l|(temp_h<<8); //Température synthétisée
retour à la température;
}
3.2 Ds18b20.h
#ifndef ds18b20_h
#définir ds18b20_h
#inclure “stm32f10x.h”
#inclure “SYS.H”
#inclure “ralentissement”
#inclure “ds18b20.h”
#inclure “usart.h”
/*Interface de package * /
//Initialiser DS18B20 en mode d'entrée
#définir ds18b20_input_mode() {GpioB->CRH&= 0x0fffffff;GpioB->CRH|= 0x80000000;}
//Initialiser DS18B20 en mode de sortie
#définir ds18b20_output_mode(){GpioB->CRH&= 0x0fffffff;GpioB->CRH|= 0x30000000;}
//Sortie du port IO DS18B20
#définir ds18b20_out pbout(15)
//Entrée du port IO DS18B20
#définir ds18b20_in pbin(15)
//Déclaration de fonction
U8 DS18B20_CLECKACK(vide);
U8 DS18B20_CHECKDEVICE(vide);
void ds18b20_init(vide);
U16 DS18B20_READTEMP(vide);
U8 DS18B20_READBYTE(vide);
void ds18b20_writebyte(CMD U8);
#fin
POYBAGDYDXCAWKKMAAAAK8RNS4S030.PNG
3.3 Retarder la fonction
/*
Fonction: Retard aux États-Unis
*/
Vide retardus(Int nous)
{
#ifdef _Systick_irq_
int i,J;
pour(i = 0;ival = 0; //Valeur de comptoir CNT
Systick->Charge = 9 * US; //9 signifie 1US
Systick->Ctrl|= 1<<0; //Démarrer
faire
{
tmp = systick->Ctrl; //Lire l'état
}alors que((!(TMP&1<<16))&&(TMP&1<<0));
Systick->Val = 0; //Valeur de comptoir CNT
Systick->Ctrl&= ~(1<<0); //Éteindre la minuterie
#fin
};je++)>
3.4 Main.c Appelez DS18B20 pour lire la température et l'imprimer au port série
#inclure “stm32f10x.h”
#inclure “ds18b20.h”
U8 DS18B20_ROM[8]; //Stockez le code ROM 64 bits de DS18B20
int principal(vide)
{
U16 Temp;
Usartx_init(USART1,72,115200);//Initialisation du port série 1
Ds18b20_init(); //Initialisation DS18B20
/*1. Lisez le code ROM 64 bits de DS18B20 * /
//Envoyer une impulsion de réinitialisation, détecter l'impulsion d'existence
alors que(Ds18b20_checkdevice())
{
imprimer(“Le périphérique DS18B20 n'existe pas!\n”);
Retards(500);
}
//Envoyez la commande pour lire le code ROM 64 bits
Ds18b20_writebyte(0x33);
//LOOP LIRE CODE ROM 64 BIT
pour(i = 0;je<8;je++)
{
Ds18b20_rom[je]= Ds18b20_readbyte();
imprimer(“Ds18b20_rom[%d]= 0x% x n”,je,Ds18b20_rom[je]);
}
alors que(1)
{
/*2. Faire fonctionner simultanément tous les DS18B20 dans le bus pour commencer à convertir la température * /
Ds18b20_checkdevice(); //Envoyer une impulsion de réinitialisation, détecter l'impulsion
Ds18b20_writebyte(0xCC); //Sauter la détection de séquence ROM
Ds18b20_writebyte(0x44); //Démarrer une conversion de température (Laissez tous les DS18B20 sur le bus convertir la température)
Retards(500); //Attendez que toutes les conversions de température DS18B20 sur la ligne se terminent
/*3. Lecture ciblée unique de la température de chaque DS18B20 * /
Ds18b20_checkdevice(); //Envoyer une impulsion de réinitialisation, détecter l'impulsion
Ds18b20_writebyte(0x55); //Envoyer la commande pour faire correspondre ROM
pour(i = 0;je<8;je++) //Envoyer un code 64 bits
{
Ds18b20_writebyte(Ds18b20_rom[je]);
}
Ds18b20_writebyte(0xBE); //Température de lecture
temp = ds18b20_readbyte(); //Lire les données de température de faible commande
temp|= Ds18b20_readbyte()<<8; //Lire les données de température d'ordre élevé
imprimer(“temp1=%d.%dn”,temp>>4,temp&0xf);
imprimer(“temp2 =% f n”,Temp * 0,0625);
Retards(500);
}
}