Lämpötila-anturitekniikka

Lämpötila-anturi (DS18B20:n ja PT100:n toiminnallinen piirisuunnittelu)

DS18B20 kaavio ja CUBEMAX-kokoonpano

Vertailu välillä PT100 -lämpötila -anturi anturi ja DS18B20 moduuli
1) Signaalin hankinnan perusperiaate
① PT100:n vastus muuttuu suhteessa lämpötilaan (mitä korkeampi lämpötila, mitä suurempi vastus), mutta vastuksen muutos on hyvin pieni, noin 0.385 Voi / tutkinnon;
② PT100:n lämpötilan mittausalue on -200 ℃ -200 ℃, ja 0℃:ssa, vastus on täsmälleen sama kuin 100 Voi;
③ PT100:n käyttövirran tulee olla pienempi kuin 5 mA;
④ Vaikka PT100:n vastus muuttuu suhteessa lämpötilaan, sen muutosnopeus (eli, K arvo K arvo K arvo) on erilainen eri lämpötila-alueilla.

2) PT100 Lämpötilankestävyystaulukko

PT100 Lämpötilankestävyystaulukko

3. PT100 käyttöpiiri

PT100 käyttöpiiri

PT100 käyttöpiiri

1) Jännitteenjakomenetelmän kautta, AD kerää PT100-jännitteen resistanssiarvon saamiseksi lämpötilan laskemiseksi
PT100:n vastusarvo vedessä huoneenlämpötilassa (25℃25℃25℃) on kyse 109.89 Voi.
Mikrokontrolleri tuottaa 3,3 V jännitettä, ja jännite jaettuna PT100:lla on suunnilleen:
109.89 ∗ 0.005 = 0.54945 V

AD-muunnoskaavan mukaan muunnettu AD-arvo on noin:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682

Kun lämpötila nousee yhden asteen, olettaen, että PT100:n vastus vain kasvaa 0.385 Voi, jaetun jännitteen muutosarvo on suunnilleen yhtä suuri kuin:
0.385 ∗ 0.005 = 0.001925 V

AD-muunnoskaavan mukaan muunnettu AD-arvo on noin:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2

Kokeessa, havaittiin, että stm32-virtalähteen epävakaan 3,3 V jännitteen vuoksi, ADC keräsi PT100-jännitevaihteluita ja jännitteenjakovirhe oli suuri. Optimointiratkaisuna on suunnitella vakiovirtalähdepiiri. Keräämällä PT100:n jännite ja vakiovirtalähteen virta, PT100:n resistanssi voidaan saavuttaa, ja sitten lämpötila-arvo voidaan saada.

2) Vakiovirtalähdepiiri perustuu LDO-säätimeen (MD5333)
Internetissä on monia ohjauspiirejä PT100:n testaamiseen, kuten DC-siltapiiri, vakiovirtalähdepiiri, joka perustuu operaatiovahvistimeen, jne. Kirjoittaja käytti myös paljon aikaa ajopiirin valintaan, ottaen huomioon levyn valmistamisen vaikeus ja komponenttien lukumäärä, ja lopuksi valitsi vakiovirtalähdepiirin, joka perustuu LDO-säätimeen (MD5333). Piirikaavio on seuraava:

LDO-säätimen vakiovirtalähdepiiri (MD5333)

LDO-säätimen vakiovirtalähdepiiri (MD5333)

Tässä vaiheessa, laitteiston valinta on periaatteessa valmis. Käytetty kehityskortti on Zhengdian Atom F10ZET6 Elite Board

DS18B20 moduuli
Reaaliaikaisen lämpötilan ja PT100 lämpötilavertailun testaamiseksi, DS18B20-moduuli lisätään kalibroinnin vertailutestiä varten

1) DS18B20:n esittely
DS18B20 on yksiväyläinen lämpötila-anturi, jonka testilämpötila-alue on -55 ~ +125 ℃ ja tarkkuus ±0,5 ℃. Kentän lämpötila välitetään suoraan yhden väylän digitaalisella tavalla, mikä parantaa huomattavasti järjestelmän häiriöntorjuntakykyä. Se voi lukea mitatun lämpötilan suoraan, ja voi toteuttaa 9-12-bittisen digitaalisen arvon lukumenetelmän yksinkertaisen ohjelmoinnin avulla todellisten vaatimusten mukaisesti. Sen käyttöjännitealue on 3–5,5 V, ja se käyttää erilaisia ​​pakkausmuotoja, tekee järjestelmän asetuksista joustavan ja kätevän. Asetettu resoluutio ja käyttäjän asettama hälytyslämpötila tallennetaan EEPROM-muistiin ja tallennetaan edelleen sähkökatkon jälkeen.

DS18B20 piirisuunnittelu

DS18B20 piirisuunnittelu

2) Johdatus DS18B20:n työskentelyajoitukseen
Kaikki yksiväylälaitteet vaativat tiukan signaalin ajoituksen tietojen eheyden varmistamiseksi. DS18B20: lla on 6 signaalityypit: nollaa pulssi, vastepulssi, kirjoittaa 0, kirjoittaa 1, lukea 0 ja lukea 1. Kaikki nämä signaalit, paitsi vastepulssi, ovat isännän lähettämiä synkronisia signaaleja. Ja kaikki komennot ja tiedot lähetetään tavun matalalla bitillä ensin.

DS18B20 nollauspulssi ja vastepulssi

DS18B20 nollauspulssi ja vastepulssi

① Nollaa pulssi ja vastepulssi
Kaikki viestintä yhdellä väylällä alkaa alustussekvenssillä. Isäntä tuottaa matalan tason ja pitää matalan tason vähintään 480us ajan nollauspulssin muodostamiseksi. Sitten isäntä vapauttaa bussin, ja 4.7K vetovastus nostaa yhden väylän korkealle, 15-60 us viiveellä, ja siirtyy vastaanottotilaan (Rx). Sitten DS18B20 vetää väylän alas 60-240 us tuottaakseen matalan tason vastepulssin.

DS18B20 kirjoitusajoitus

DS18B20 kirjoitusajoitus

② Kirjoita ajoitus
Kirjoitusaika sisältää kirjoittamisen 0 ajoitus ja kirjoitus 1 ajoitus. Kaikki kirjoitusajoitukset vaativat vähintään 60 us, ja vähintään 1 us palautusaika vaaditaan kahden itsenäisen kirjoitusajoituksen välillä. Molemmat kirjoitusajoitukset alkavat isännöitsijän vetämällä väylän alas. Kirjoittaa 1 ajoitus: isäntä tuottaa matalan tason, viivästyksiä 2 us, ja vapauttaa sitten bussin, myöhässä 60 us. Kirjoittaa 0 ajoitus: isäntä tuottaa matalan tason, myöhästymisiä 60e, ja vapauttaa sitten bussin 2us:n viiveellä.

DS18B20 Lukuajastus

DS18B20 Lukuajastus

③ Lue ajoitus
Yhden väylän laitteet lähettävät dataa isännälle vain, kun isäntä antaa lukuajoituksen. Siksi, sen jälkeen, kun isäntä on antanut lukudatakomennon, lukuajoitus on generoitava välittömästi, jotta orja voi lähettää dataa. Kaikki lukuajat vaativat vähintään 60 us, ja vähintään 1 us palautusaika vaaditaan kahden riippumattoman lukuajan välillä. Isäntä aloittaa jokaisen lukuajoituksen, joka vetää bussin alas vähintään 1 us. Isännän on vapautettava väylä lukuajoituksen aikana ja otettava näyte väylän tilasta 15 us:n kuluessa ajastuksen alkamisesta. Tyypillinen lukuajoitusprosessi on: isäntä tuottaa matalan tason viiveen 2us, sitten isäntä vaihtaa tulotilan viiveeseen 12us, lukee sitten yksittäisen väylän nykyisen tason, ja sitten viivästyy 50 us.

DS18B20 avaa sarjaportin lämpötilatietojen tulostamista varten

DS18B20 avaa sarjaportin lämpötilatietojen tulostamista varten

Ymmärtettyään yhden bussin ajoituksen, Katsotaanpa DS18B20:n tyypillistä lämpötilan lukuprosessia. DS18B20:n tyypillinen lämpötilanlukuprosessi on: nollaa → lähetä SKIPROM (0xCC) → lähetä aloitusmuunnoskomento (0x44) → viive → nollaa → lähetä SKIPROM-komento (0xCC) → lähetä muistikomento (0xBE) → lue kaksi tavua dataa (eli. lämpötila) jatkuvasti → loppu.

3) Kaaviokaavio ja CUBEMAX-kokoonpano
Kaavakuvasta, voidaan nähdä, että DS18B20 mahdollistaa PG11-portin avaamaan sarjaportin lämpötilatietojen tulostamista varten

DS18B20 kaavio ja CUBEMAX-kokoonpano

DS18B20 kaavio ja CUBEMAX-kokoonpano

DS18B20 lämpötila- ja kosteusanturin liitäntä

DS18B20 lämpötila- ja kosteusanturin liitäntä

4) Koodi osa
Koodiosa siirtää Zhengdian Atomin ds18b20-kirjaston ja tekee pieniä muutoksia

#ifndef __DS18B20_H
#määritä __DS18B20_H

#sisältää “aika tunti”
/***********************************************************************************/
/* DS18B20 PIN -määritelmä */

#määritä DS18B20_DQ_GPIO_PORT GPIOG
#määritä DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#määritä DS18B20_DQ_GPIO_CLK_ENABLE() tehdä{ __HAL_RCC_GPIOG_CLK_ENABLE(); }kun taas(0) /* PG-portin kello käytössä */

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

/* IO-toiminto */
#määritä DS18B20_DQ_OUT(x) tehdä{ 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); \
}kun taas(0) /* Dataportin lähtö */
#määritä DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Tietoportin syöttö */

uint8_t ds18b20_init(mitätön); /* Alusta DS18B20 */
uint8_t ds18b20_check(mitätön); /* Tarkista, onko DS18B20 olemassa */
lyhyt ds18b20_get_temperature(mitätön);/* Ota lämpötila */

#endif

5. Infrapuna-kaukosäädinmoduuli
1) Langattoman moduulin koodausprotokolla

Infrapunakaukosäätimen laajasti käytetyt koodausmenetelmät ovat: PWM:n NEC-protokolla (pulssin leveysmodulaatio) ja Philips PPM:n RC-5-protokolla (pulssiaseman modulaatio). Kehityskortin mukana tuleva kaukosäädin käyttää NEC-protokollaa, jolla on seuraavat ominaisuudet:

1. 8-bittiosoite ja 8-bittinen käskyn pituus;

2. Osoite ja komento lähetetään kahdesti (luotettavuuden varmistamiseksi);

3. PWM pulssipaikan modulaatio, lähetetyn infrapunakantoaallon toimintajakson edustaessa “0” ja “1”;

4. Kantoaaltotaajuus on 38 khz;

5. Bittiaika on 1,125 ms tai 2,25 ms;

NEC-protokollassa, miten protokollan tiedot asetetaan ‘0’ tai "1"? Tässä, infrapunavastaanotin ja infrapunalähetin on erotettu toisistaan.

Infrapunalähetin: Lähetä protokollatiedot '0' = 560 us kantoaaltosignaalin lähetyksestä + 560meille ei ole kantoaaltosignaalin siirtoa

Lähetä protokollatiedot '1' = 560us kantoaaltosignaalin lähetyksestä + 1680meille ei ole kantoaaltosignaalin siirtoa

Infrapunalähettimen bittimääritelmä on esitetty alla olevassa kuvassa

Infrapunavastaanotin: Vastaanota protokollatietoja '0' = 560us alhainen taso + 560meille korkealle tasolle

Vastaanota protokollatietoja ‘1’ = 560us alhainen taso + 1680meille korkealle tasolle

NEC-kaukosäätimen komennon tietomuoto on: synkronointipääte, osoitekoodi, osoitteen käänteinen koodi, ohjauskoodi, ohjaa käänteistä koodia. Synkronointikoodi koostuu 9 ms:n matalasta tasosta ja 4,5 ms:n korkeasta tasosta. Osoitekoodi, osoitteen käänteinen koodi, ohjauskoodi, ja ohjaus käänteiskoodi ovat kaikki 8-bittisiä datamuotoja. Ne lähetetään järjestyksessä matala bitti ensin ja korkea bitti viimeisenä. Käänteistä koodia käytetään lisäämään lähetyksen luotettavuutta.

Siksi, syötteen sieppausta voidaan käyttää korkean tason pulssinleveyden mittaamiseen kaukosäätimen dekoodauksen saavuttamiseksi.
2) Kaaviokaavio ja CUBEMAX-kokoonpano

Kaavakuvasta, voimme nähdä, että langaton moduuli on otettu käyttöön PB9-nastan kautta ja kerää 4 TIM4:n kanavat:

TIM4_CH4:n oletusnasta ei ole PB9, joten se on asetettava manuaalisesti, ja keskeytysasetus kytketään päälle samanaikaisesti

3) Koodi osa
Tallenna nouseva reuna tim-soittotoiminnon avulla

Tällä hetkellä, dekoodattu signaali voidaan saada:

Tällä hetkellä, tiedot ovat monimutkaisempia ja niitä voidaan käsitellä hieman:

Vaikutus on seuraava:
Kaksi viimeistä numeroa ovat dekoodattu ja sen käänteinen koodi. Tällä hetkellä, se voidaan määritellä makroksi lämpötilakynnyksen säätämiseksi:

Vaikutus on seuraava:

Infrapuna osakoodi:

/* KÄYTTÄJÄKOODIN ALOITUSotsikko */
/**
******************************************************************************
* @tiedosto : main.c
* @lyhyt : Ohjelman päärunko
******************************************************************************
* @Huomio
*
* <h2><keskusta>&kopioida; Tekijänoikeus (c) 2024 STMicroelectronics.
* Kaikki oikeudet pidätetään.</keskusta></h2>
*
* ST on lisensoinut tämän ohjelmistokomponentin BSD 3-Clause -lisenssillä,
* the “Lisenssi”; Et saa käyttää tätä tiedostoa muutoin kuin ehtojen mukaisesti
* Lisenssi. Voit saada kopion lisenssistä osoitteessa:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* USER CODE END Otsikko */
/* Sisältää ——————————————————————*/
#sisältää “main.h”
#sisältää “aika tunti”
#sisältää “usart.h”
#sisältää “gpio.h”

/* Yksityinen sisältää ———————————————————-*/
/* KÄYTTÄJÄKOODI ALOITUS Sisältää */
#sisältää “stdio.h”
#sisältää “merkkijono.h”
#määrittele MAXUP 157
#määrittele MAXDOWN 87
#määrittele MINUP 221
#määrittele MINDOWN 61
/* KÄYTTÄJÄKOODIN LOPPU Sisältää */

/* Yksityinen typedef ———————————————————–*/
/* KÄYTTÄJÄKOODI ALOITA PTD */

/* KÄYTTÄJÄKOODIN LOPPU PTD */

/* Yksityinen määritellä ————————————————————*/
/* KÄYTTÄJÄKOODI ALOITA PD */
/* KÄYTTÄJÄKOODIN LOPPU PD */

/* Yksityinen makro ————————————————————-*/
/* KÄYTTÄJÄKOODI ALOITA PM */

/* KÄYTTÄJÄKOODIN LOPPU PM */

/* Yksityiset muuttujat ———————————————————*/

/* KÄYTTÄJÄKOODI ALKAA PV */
uint32_t upCount=0;
uint16_t ValueUp=0;
uint16_t ValueDown=0;
uint8_t isUpCapt=1;
uint16_t leveys=0;
uint16_t puskuri[128]={0};
uint16_t bufferId=0;
uint8_t rcvFalg=0;
/* KÄYTTÄJÄKOODIN LOPPU PV */

/* Yksityisten toimintojen prototyypit ———————————————–*/
void SystemClock_Config(mitätön);
/* KÄYTTÄJÄKOODI ALOITA PFP */

/* KÄYTTÄJÄKOODIN LOPPU PFP */

/* Yksityinen käyttäjäkoodi ———————————————————*/
/* KÄYTTÄJÄKOODI ALOITA 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
upCount++;
}
mitätön HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
jos(isUpCapt)//Jos se on nouseva reuna kaapata
{
ValueUp=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);
upCount=0;
}
muu{
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;
jos(leveys>4400&&leveys<4600)
{
bufferId=0;
puskuri[puskuritunnus++]=leveys;
}
muuten jos(puskuritunnus>0)
{
puskuri[puskuritunnus++]=leveys;
jos(puskuritunnus>32)
{
rcvFalg=1;
bufferId=0;
}
}
}
}
void bitBuffer2num(char num[])
{
nro[0]=0;
nro[1]=0;
nro[2]=0;
nro[3]=0;
varten(int i=0;i<32;i++)
{
jos(puskuri[i+1]<1000)
{
nro[i/8]=nm[i/8]<<1;
}
muu
{
nro[i/8]=nm[i/8]<<1;
nro[i/8]|=0x01;
}
}
}
/* KÄYTTÄJÄKOODIN LOPPU 0 */

/**
* @brief Sovelluksen aloituspiste.
* @retval int
*/
int main(mitätön)
{
/* KÄYTTÄJÄKOODI ALOITA 1 */
char printbuff[128]={0};
char num[4]={0};
char key = 0;
/* KÄYTTÄJÄKOODIN LOPPU 1 */

/* MCU-kokoonpano——————————————————–*/

/* Kaikkien oheislaitteiden nollaus, Alustaa Flash-käyttöliittymän ja Systickin. */
HAL_Init();

/* KÄYTTÄJÄKOODI ALOITUS Init */

/* KÄYTTÄJÄKOODIN LOPPU Init */

/* Määritä järjestelmän kello */
SystemClock_Config();

/* KÄYTTÄJÄKOODI ALOITA SysInit */

/* KÄYTTÄJÄKOODIN LOPPU SysInit */

/* Alusta kaikki määritetyt oheislaitteet */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* KÄYTTÄJÄKOODI ALOITA 2 */

/* KÄYTTÄJÄKOODIN LOPPU 2 */

/* Loputon silmukka */
/* KÄYTTÄJÄKOODI ALOITTAA */
HAL_GPIO_TogglePin(LED0_GPIO_Portti,LED0_Pin);
HAL_TIM_Base_Start_IT(&htim4);//Ajastimen päivitys luo keskeytyksen
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);//
kun taas (1)
{
jos(rcvFalg)
{
varten(int i=0;i<4;i++)
{
bitBuffer2num(nro);
sprintf(printbuff,”0xx “,nro[i]);
HAL_UART_Lähetä(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
}
// sprintf(printbuff,”%u “,puskuri[i]);
// HAL_UART_Lähetä(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
// }
HAL_UART_Lähetä(&huart1,”\r\n”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
printf(“%d\r\n”,nro[3]);
jos(nro[3]==157)
{
printf(“111111\r\n”);
}
HAL_Viive(1000);
/* KÄYTTÄJÄKOODIN LOPPU WHILE */

/* KÄYTTÄJÄKOODI ALOITA 3 */
}
/* KÄYTTÄJÄKOODIN LOPPU 3 */
}

/**
* @lyhyt järjestelmäkellon asetukset
* @retval Ei mitään
*/
void SystemClock_Config(mitätön)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};