Temperatuurianduritehnoloogia

Temperatuurianduri sond (DS18B20 ja PT100 funktsionaalne vooluahela disain)

DS18B20 skemaatiline ja CUBEMAX konfiguratsioon

Võrdlus vahel Temperatuuriandur PT100 sond ja DS18B20 moodul
1) Signaali omandamise põhiprintsiip
① PT100 takistus muutub proportsionaalselt temperatuuriga (mida kõrgem on temperatuur, seda suurem on vastupanu), kuid takistuse muutus on väga väike, umbes 0.385 Oh / kraadi;
② PT100 temperatuuri mõõtmisvahemik on -200 ℃ -200 ℃, ja 0 ℃ juures, takistus on täpselt võrdne 100 Oh;
③ PT100 töövool peaks olema väiksem kui 5 mA;
④ Kuigi PT100 takistus muutub proportsionaalselt temperatuuriga, selle muutumise kiirus (see tähendab, K väärtus K väärtus K väärtus) on erinevates temperatuurivahemikes erinev.

2) PT100 temperatuurikindluse muutmistabel

PT100 temperatuurikindluse muutmistabel

3. PT100 ajamiahel

PT100 ajamiahel

PT100 ajamiahel

1) Pingejaotuse meetodi kaudu, AD kogub PT100 pinget, et saada temperatuuri arvutamiseks takistuse väärtus
PT100 takistuse väärtus toatemperatuuril vees (25℃25℃25℃) on umbes 109.89 Oh.
Mikrokontroller väljastab 3,3 V pinget, ja pinge jagatud PT100-ga on ligikaudu:
109.89 ∗ 0.005 = 0.54945 V

AD-i teisendusvalemi järgi teisendatud AD väärtus on ligikaudu:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682

Kui temperatuur tõuseb ühe kraadi võrra, eeldades, et PT100 takistus lihtsalt tõuseb 0.385 Oh, jagatud pinge muutusväärtus on ligikaudu võrdne:
0.385 ∗ 0.005 = 0.001925 V

AD-i teisendusvalemi järgi teisendatud AD väärtus on ligikaudu:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2

Eksperimendis, selgus, et stm32 toiteallika ebastabiilse 3,3V pinge tõttu, ADC kogus PT100 pingekõikumisi ja pingejaotuse viga oli suur. Optimeerimislahenduseks on konstantse vooluallika vooluringi projekteerimine. Kogudes PT100 pinget ja konstantse vooluallika voolu, on võimalik saada PT100 takistus, ja siis saab temperatuuri väärtuse saada.

2) Püsivooluallika vooluahel, mis põhineb LDO regulaatoril (MD5333)
Internetis on PT100 testimiseks palju juhtimisskeeme, nagu alalisvoolu sillaahel, püsivooluallika ahel, mis põhineb operatiivvõimendil, jne. Samuti kulutas autor palju aega sõiduringi valikule, arvestades plaadi valmistamise raskust ja komponentide arvu, ja lõpuks valis konstantse vooluallika ahela, mis põhineb LDO regulaatoril (MD5333). Elektriskeem on järgmine:

LDO regulaatori püsivooluallika ahel (MD5333)

LDO regulaatori püsivooluallika ahel (MD5333)

Sel hetkel, riistvara valik on põhimõtteliselt lõpetatud. Kasutatav arendusplaat on Zhengdian Atom F10ZET6 Elite Board

DS18B20 moodul
Reaalajas temperatuuri ja PT100 temperatuuri võrdluse testimiseks, DS18B20 moodul lisatakse kalibreerimise võrdluskatse jaoks

1) DS18B20 tutvustus
DS18B20 on ühe siiniga temperatuuriandur katsetemperatuuri vahemikuga -55 ~ +125 ℃ ja täpsusega ±0,5 ℃. Välitemperatuur edastatakse otse ühe siini digitaalsel viisil, mis parandab oluliselt süsteemi häiretevastast võimet. See saab otse lugeda mõõdetud temperatuuri, ja suudab realiseerida 9–12-bitise digitaalse väärtuse lugemise meetodi lihtsa programmeerimise abil vastavalt tegelikele nõuetele. Selle tööpinge vahemik on 3–5,5 V, ja see kasutab mitmesuguseid pakkevorme, muutes süsteemi seadistuse paindlikuks ja mugavaks. Kasutaja määratud eraldusvõime ja alarmi temperatuur salvestatakse EEPROM-i ja salvestatakse ka pärast voolukatkestust.

DS18B20 vooluahela disain

DS18B20 vooluahela disain

2) Sissejuhatus DS18B20 tööajastusse
Kõik ühe siiniga seadmed nõuavad andmete terviklikkuse tagamiseks ranget signaali ajastust. DS18B20-l on 6 signaali tüübid: lähtestage pulss, vastuse impulss, kirjutada 0, kirjutada 1, lugeda 0 ja lugeda 1. Kõik need signaalid, välja arvatud vastuse impulss, on hosti saadetud sünkroonsed signaalid. Ja kõik käsud ja andmed saadetakse kõigepealt baidi madala bitiga.

DS18B20 lähtestamise impulss ja vastuse impulss

DS18B20 lähtestamise impulss ja vastuse impulss

① Lähtestage impulss ja reaktsiooniimpulss
Kogu side ühel siinil algab lähtestamisjärjestusega. Host väljastab madala taseme ja hoiab madalat taset vähemalt 480 us, et genereerida lähtestusimpulss. Siis laseb peremees bussi lahti, ja 4,7K tõmbetakisti tõmbab üksiku siini kõrgele, viiteajaga 15-60 us, ja lülitub vastuvõturežiimi (Rx). Seejärel tõmbab DS18B20 siini 60–240 us madalaks, et genereerida madala taseme reaktsiooniimpulss.

DS18B20 kirjutamise ajastus

DS18B20 kirjutamise ajastus

② Kirjutage ajastus
Kirjutamise ajastus hõlmab kirjutamist 0 ajastus ja kirjutamine 1 ajastus. Kõik kirjutamisajad nõuavad vähemalt 60 us, ja kahe sõltumatu kirjutamisaja vahel on vaja vähemalt 1 us taastumisaega. Mõlemad kirjutamisajad algavad sellest, et peremees tõmbab bussi alla. Kirjutage 1 ajastus: host väljastab madala taseme, hilineb 2us, ja siis laseb bussi lahti, hilineb 60 us. Kirjutage 0 ajastus: host väljastab madala taseme, viivitused 60e eest, ja siis vabastab bussi 2us hilinemisega.

DS18B20 lugemise ajastus

DS18B20 lugemise ajastus

③ Lugemise ajastus
Ühe siiniga seadmed edastavad andmeid hostile ainult siis, kui host väljastab lugemisajastuse. Seetõttu, pärast seda, kui host annab andmete lugemise käsu, kohe tuleb genereerida lugemise ajastus, et alamseade saaks andmeid edastada. Kõik lugemisajad nõuavad vähemalt 60 us, ja kahe sõltumatu lugemisaja vahel on vaja vähemalt 1 us taastumisaega. Iga lugemise ajastuse algatab host, mis tõmbab bussi alla vähemalt 1us. Host peab vabastama siini lugemise ajastuse ajal ja proovima siini olekut 15 us jooksul pärast ajastuse algust. Tüüpiline lugemise ajastusprotsess on: host väljastab madala taseme viivituse 2us, siis lülitub host sisendrežiimi viivitusele 12us, seejärel loeb ühe siini hetketaset, ja siis hilineb 50us.

DS18B20 avab jadapordi temperatuuriteabe printimiseks

DS18B20 avab jadapordi temperatuuriteabe printimiseks

Pärast ühe bussi ajastuse mõistmist, vaatame DS18B20 tüüpilist temperatuuri lugemisprotsessi. DS18B20 tüüpiline temperatuuri lugemisprotsess on: lähtestamine → saada SKIPROM (0xCC) → saatke teisendamise alustamise käsk (0x44) → viivitus → lähtestamine → saada SKIPROM-i käsk (0xCC) → saada mälukäsk (0xBE) → loe kaks baiti andmeid (st. temperatuuri) pidevalt → lõpp.

3) Skemaatiline diagramm ja CUBEMAX konfiguratsioon
Skemaatiliselt diagrammil, on näha, et DS18B20 lubab PG11 porti jadapordi avamiseks temperatuuriteabe printimiseks

DS18B20 skemaatiline ja CUBEMAX konfiguratsioon

DS18B20 skemaatiline ja CUBEMAX konfiguratsioon

DS18B20 temperatuuri- ja niiskusanduri liides

DS18B20 temperatuuri- ja niiskusanduri liides

4) Koodi osa
Koodiosa siirdab Zhengdian Atom ds18b20 raamatukogu ja teeb väikeseid muudatusi

#ifndef __DS18B20_H
#määrake __DS18B20_H

#sisaldama “kellaaeg”
/***********************************************************************************/
/* DS18B20 viigu määratlus */

#defineerige DS18B20_DQ_GPIO_PORT GPIOG
#määrake DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#defineerige DS18B20_DQ_GPIO_CLK_ENABLE() teha{ __HAL_RCC_GPIOG_CLK_ENABLE(); }samal ajal(0) /* PG-pordi kella lubamine */

/**********************************************************************************************/

/* IO tööfunktsioon */
#defineerige DS18B20_DQ_OUT(x) teha{ x ? \
HAL_GPIO_WritePin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN, GPIO_PIN_SET) : \
HAL_GPIO_WritePin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN, GPIO_PIN_RESET); \
}samal ajal(0) /* Andmepordi väljund */
#defineerige DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Andmepordi sisend */

uint8_t ds18b20_init(tühine); /* Lähtestage DS18B20 */
uint8_t ds18b20_check(tühine); /* Kontrollige, kas DS18B20 on olemas */
lühike ds18b20_get_temperature(tühine);/* Hankige temperatuur */

#endif

5. Infrapuna kaugjuhtimismoodul
1) Juhtmeta mooduli kodeerimisprotokoll

Infrapuna kaugjuhtimispuldi laialdaselt kasutatavad kodeerimismeetodid on: PWM-i NEC-protokoll (impulsi laiuse modulatsioon) ja Philipsi PPM-i RC-5 protokoll (impulsi positsiooni modulatsioon). Arendusplaadiga kaasas olev kaugjuhtimispult kasutab NEC protokolli, millel on järgmised omadused:

1. 8-biti aadress ja 8-bitine käsu pikkus;

2. Aadress ja käsk edastatakse kaks korda (usaldusväärsuse tagamiseks);

3. PWM impulsi positsiooni modulatsioon, edastatava infrapunakandja töötsükliga “0” ja “1”;

4. Kandesagedus on 38 khz;

5. Bitiaeg on 1,125 ms või 2,25 ms;

NEC-i protokollis, kuidas protokollis olevaid andmeid seadistada ‘0’ või "1"? Siin, infrapuna vastuvõtja ja infrapunasaatja on eraldatud.

Infrapunasaatja: Protokolliandmete saatmine "0" = 560 us kandesignaali edastamist + 560meil puudub kandja signaali edastamine

Protokolliandmete saatmine „1” = 560 us kandesignaali edastamist + 1680meil puudub kandja signaali edastamine

Infrapunasaatja bitimääratlus on näidatud alloleval joonisel

Infrapuna vastuvõtja: Protokolliandmete vastuvõtmine "0" = 560 us madal tase + 560meil kõrgel tasemel

Protokolliandmete vastuvõtmine „1” = 560 us madal tase + 1680meil kõrgel tasemel

NEC-i kaugjuhtimiskäsu andmevorming on: sünkroonimisterminal, aadressi kood, aadressi pöördkood, kontrollkood, kontrolli pöördkoodi. Sünkroonimiskood koosneb 9 ms madalast tasemest ja 4,5 ms kõrgest tasemest. Aadressi kood, aadressi pöördkood, kontrollkood, ja kontrolli pöördkood on kõik 8-bitised andmevormingud. Need saadetakse madala biti esimese ja kõrge biti järjekorras. Pöördkoodi kasutatakse edastamise usaldusväärsuse suurendamiseks.

Seetõttu, sisendhõivet saab kasutada kõrge taseme impulsi laiuse mõõtmiseks, et saavutada kaugjuhtimispuldi dekodeerimine.
2) Skemaatiline diagramm ja CUBEMAX konfiguratsioon

Skemaatiliselt diagrammil, näeme, et traadita moodul on PB9 viigu kaudu lubatud ja kogub selle kaudu 4 TIM4 kanalid:

TIM4_CH4 vaikimisi viik ei ole PB9, seega tuleb see käsitsi seadistada, ja katkestuse seadistus lülitatakse samal ajal sisse

3) Koodi osa
Jäädvustage tõusev serv läbi tim tagasihelistamise funktsiooni

Sel ajal, dekodeeritud signaali on võimalik saada:

Sel ajal, andmed on keerulisemad ja neid saab veidi töödelda:

Mõju on järgmine:
Kaks viimast numbrit on dekodeeritud ja selle pöördkood. Sel ajal, seda saab määratleda makrona temperatuuriläve reguleerimiseks:

Mõju on järgmine:

Infrapuna osakood:

/* KASUTAJA KOODI ALGUS Päis */
/**
******************************************************************************
* @fail : peamine.c
* @lühidalt : Programmi põhiosa
******************************************************************************
* @tähelepanu
*
* <h2><keskus>&kopeerida; Autoriõigus (c) 2024 STMikroelektroonika.
* Kõik õigused kaitstud.</keskus></h2>
*
* Selle tarkvarakomponendi litsentsib ST BSD 3-klausli litsentsi alusel,
* a “Litsents”; Te ei tohi seda faili kasutada, välja arvatud kooskõlas
* Litsents. Litsentsi koopia saate hankida aadressil:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* KASUTAJA KOODI LÕPP Päis */
/* Sisaldab ——————————————————————*/
#sisaldama “põhi.h”
#sisaldama “kellaaeg”
#sisaldama “usart.h”
#sisaldama “gpio.h”

/* Privaatne sisaldab ———————————————————-*/
/* KASUTAJAKOOD ALGUS Sisaldab */
#sisaldama “stdio.h”
#sisaldama “string.h”
#määrake MAXUP 157
#määrake MAXDOWN 87
#määrake MINUP 221
#defineeri MINDOWN 61
/* KASUTAJAKOODI LÕPP Sisaldab */

/* Privaatne kirjatüüp ———————————————————–*/
/* KASUTAJA KOOD ALGUS PTD */

/* KASUTAJA KOODI LÕPP PTD */

/* Privaatne määratleda ————————————————————*/
/* KASUTAJA KOOD ALUSTAGE PD */
/* KASUTAJAKOODI LÕPP PD */

/* Privaatne makro ————————————————————-*/
/* KASUTAJA KOOD ALUSTAGE PM */

/* KASUTAJA KOODI LÕPP PM */

/* Privaatsed muutujad ———————————————————*/

/* KASUTAJA KOOD ALGUST PV */
uint32_t upCount=0;
uint16_t ValueUp=0;
uint16_t ValueDown=0;
uint8_t isUpCapt=1;
uint16_t laius=0;
uint16_t puhver[128]={0};
uint16_t bufferId=0;
uint8_t rcvFalg=0;
/* KASUTAJAKOODI LÕPP PV */

/* Privaatfunktsiooni prototüübid ———————————————–*/
tühine SystemClock_Config(tühine);
/* KASUTAJA KOOD ALUSTAGE PFP-d */

/* KASUTAJAKOODI LÕPP PFP */

/* Privaatne kasutajakood ———————————————————*/
/* KASUTAJA KOOD ALGAS 0 */
tühine HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
upCount++;
}
tühine HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
kui(isUpCapt)//Kui see on tõusva serva püüdmine
{
ValueUp=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);
upCount=0;
}
muidu{
ValueDown=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=1;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_RISING);
width=ValueDown+upCount*65536-ValueUp;
kui(laius>4400&&laius<4600)
{
bufferId=0;
puhver[bufferId++]=laius;
}
muidu kui(puhvri ID>0)
{
puhver[bufferId++]=laius;
kui(puhvri ID>32)
{
rcvFalg=1;
bufferId=0;
}
}
}
}
tühine bitPuffer2num(char num[])
{
nr[0]=0;
nr[1]=0;
nr[2]=0;
nr[3]=0;
jaoks(int i=0;i<32;i++)
{
kui(puhver[i+1]<1000)
{
nr[i/8]=nr[i/8]<<1;
}
muidu
{
nr[i/8]=nr[i/8]<<1;
nr[i/8]|=0x01;
}
}
}
/* KASUTAJA KOODI LÕPP 0 */

/**
* @brief Rakenduse sisenemispunkt.
* @retval int
*/
int main(tühine)
{
/* KASUTAJA KOOD ALGAS 1 */
char printbuff[128]={0};
char num[4]={0};
täheklahv=0;
/* KASUTAJA KOODI LÕPP 1 */

/* MCU konfiguratsioon——————————————————–*/

/* Kõigi välisseadmete lähtestamine, Lähtestab Flash-liidese ja Systicki. */
HAL_Init();

/* KASUTAJA KOOD ALGUS Init */

/* KASUTAJAKOODI LÕPP Init */

/* Konfigureerige süsteemi kell */
SystemClock_Config();

/* KASUTAJA KOOD ALUSTAGE SysInit */

/* KASUTAJAKOODI LÕPP SysInit */

/* Initsialiseerige kõik konfigureeritud välisseadmed */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* KASUTAJA KOOD ALGAS 2 */

/* KASUTAJA KOODI LÕPP 2 */

/* Lõpmatu silmus */
/* KASUTAJA KOOD ALGAS AJAL */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
HAL_TIM_Base_Start_IT(&htim4);//Taimeri värskendus tekitab katkestuse
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);//
samal ajal (1)
{
kui(rcvFalg)
{
jaoks(int i=0;i<4;i++)
{
bitPuffer2num(nr);
sprintf(printbuff,”0xx “,nr[i]);
HAL_UART_Edasta(&huart1, printbuff,stren(printbuff),HAL_MAX_DELAY);
}
// sprintf(printbuff,”%u “,puhver[i]);
// HAL_UART_Edasta(&huart1, printbuff,stren(printbuff),HAL_MAX_DELAY);
// }
HAL_UART_Edasta(&huart1,”\r\n”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
printf(“%d\r\n”,nr[3]);
kui(nr[3]==157)
{
printf(“111111\r\n”);
}
HAL_Delay(1000);
/* KASUTAJA KOODI LÕPP AJAL */

/* KASUTAJA KOOD ALGAS 3 */
}
/* KASUTAJA KOODI LÕPP 3 */
}

/**
* @lühike süsteemikella konfiguratsioon
* @retval Pole
*/
tühine SystemClock_Config(tühine)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};