Temperatursensorteknik

Temperatursensorsond (Funktionell kretsdesign för DS18B20 och PT100)

DS18B20-schema och CUBEMAX-konfiguration

Jämförelse mellan PT100 temperaturgivare sond och DS18B20 modul
1) Grundprincipen för signalinsamling
① Motståndet hos PT100 ändras proportionellt med temperaturen (ju högre temperatur, desto större motstånd), men motståndsförändringen är mycket liten, om 0.385 Åh / grad;
② Temperaturmätningsområdet för PT100 är -200℃ -200℃, och vid 0℃, motståndet är exakt lika med 100 Åh;
③ Arbetsströmmen för PT100 bör vara mindre än 5 mA;
④ Även om motståndet hos PT100 ändras proportionellt med temperaturen, dess förändringshastighet (som är, K-värde K-värde K-värde) är olika i olika temperaturområden.

2) PT100 temperaturmotståndsändringstabell

PT100 temperaturmotståndsändringstabell

3. PT100 drivkrets

PT100 drivkrets

PT100 drivkrets

1) Genom spänningsdelningsmetoden, AD samlar in PT100-spänning för att erhålla resistansvärde för att beräkna temperaturen
Resistansvärdet för PT100 i vatten vid rumstemperatur (25℃25℃25℃) handlar om 109.89 Åh.
Mikrokontrollern matar ut 3,3V spänning, och spänningen dividerad med PT100 är ungefär:
109.89 ∗ 0.005 = 0.54945 V

AD-värdet konverterat enligt AD-konverteringsformeln är ungefär:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682

När temperaturen stiger med en grad, antar att motståndet för PT100 bara stiger med 0.385 Åh, ändringsvärdet för den delade spänningen är ungefär lika med:
0.385 ∗ 0.005 = 0.001925 V

AD-värdet konverterat enligt AD-konverteringsformeln är ungefär:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2

I experimentet, det visade sig att på grund av den instabila 3,3V-spänningen hos stm32-strömförsörjningen, ADC:n samlade in PT100-spänningsfluktuationer och spänningsdelningsfelet var stort. Optimeringslösningen är att designa en källkrets med konstant ström. Genom att samla in spänningen för PT100 och strömmen från konstantströmkällan, motståndet för PT100 kan erhållas, och sedan kan temperaturvärdet erhållas.

2) Källkrets för konstant ström baserat på LDO-regulator (MD5333)
Det finns många drivkretsar för att testa PT100 på Internet, såsom DC-bryggkrets, konstantströmkälla krets baserad på operationsförstärkare, etc. Författaren ägnade också mycket tid åt att välja drivkrets, med tanke på svårigheten att tillverka brädet och antalet komponenter, och slutligen valde den konstantströmkälla kretsen baserad på LDO-regulator (MD5333). Kretsschemat är som följer:

Källkrets för konstant ström av LDO-regulator (MD5333)

Källkrets för konstant ström av LDO-regulator (MD5333)

Just nu, hårdvaruvalet har i princip slutförts. Utvecklingskortet som används är Zhengdian Atom F10ZET6 Elite Board

DS18B20 modul
För att testa realtidstemperaturen och PT100 temperaturjämförelse, DS18B20-modulen läggs till för kalibreringsjämförelsetest

1) Introduktion till DS18B20
DS18B20 är en enkelbuss temperatursensor med ett testtemperaturområde på -55~+125 ℃ och en noggrannhet på ±0,5 ℃. Fälttemperaturen överförs direkt på ett digitalt sätt med en buss, vilket avsevärt förbättrar systemets anti-interferensförmåga. Den kan direkt avläsa den uppmätta temperaturen, och kan realisera en 9~12-bitars digital värdeläsningsmetod genom enkel programmering enligt faktiska krav. Dess driftspänningsområde är 3~5,5V, och den använder en mängd olika förpackningsformer, gör systeminställningen flexibel och bekväm. Den inställda upplösningen och larmtemperaturen som ställts in av användaren lagras i EEPROM och sparas fortfarande efter strömavbrott.

DS18B20 kretsdesign

DS18B20 kretsdesign

2) Introduktion till DS18B20 arbetstiming
Alla enkelbussenheter kräver strikt signaltiming för att säkerställa dataintegritet. DS18B20 har 6 signaltyper: återställ pulsen, svarspuls, skriva 0, skriva 1, läsa 0 och läs 1. Alla dessa signaler, förutom svarspulsen, är synkrona signaler som skickas av värden. Och alla kommandon och data skickas med den låga biten av byten först.

DS18B20 återställningspuls och svarspuls

DS18B20 återställningspuls och svarspuls

① Återställ puls och svarspuls
All kommunikation på enkelbussen börjar med en initialiseringssekvens. Värden matar ut en låg nivå och håller den låga nivån i minst 480us för att generera en återställningspuls. Sedan släpper programledaren bussen, och 4,7K pull-up motståndet drar enkelbussen högt, med en fördröjningstid på 15~60us, och går in i mottagningsläge (Rx). Sedan drar DS18B20 bussen lågt i 60~240us för att generera en lågnivåsvarspuls.

DS18B20 skrivtid

DS18B20 skrivtid

② Skriv timing
Skrivtiden inkluderar skrivning 0 tajming och skriva 1 timing. Alla skrivtider kräver minst 60us, och minst 1us återställningstid krävs mellan två oberoende skrivtider. Båda skrivtiderna börjar med att värden drar ner bussen. Skriva 1 timing: värden matar ut en låg nivå, förseningar för 2us, och släpper sedan bussen, försenar 60us. Skriva 0 timing: värden matar ut en låg nivå, förseningar för 60us, och släpper sedan bussen med en fördröjning på 2us.

DS18B20 Lästiming

DS18B20 Lästiming

③ Läs timing
Enkelbussenheter överför data till värden endast när värden utfärdar en lästid. Därför, efter att värden har utfärdat ett läsdatakommando, en lästid måste genereras omedelbart så att slaven kan överföra data. Alla lästider kräver minst 60us, och minst 1us återhämtningstid krävs mellan två oberoende lästider. Varje lästid initieras av värden, som drar ner bussen i minst 1us. Värden måste släppa bussen under lästidtagningen och prova bussstatusen inom 15us efter att tidtagningen startar. Den typiska läs timingprocessen är: värden matar ut en lågnivåfördröjning på 2us, sedan växlar värden till ingångslägesfördröjning på 12us, läser sedan den aktuella nivån för den enskilda bussen, och sedan försenar 50us.

DS18B20 öppnar serieporten för att skriva ut temperaturinformation

DS18B20 öppnar serieporten för att skriva ut temperaturinformation

Efter att ha förstått singelbuss timing, låt oss ta en titt på den typiska temperaturavläsningsprocessen för DS18B20. Den typiska temperaturavläsningsprocessen för DS18B20 är: återställ → skicka SKIPROM (0xCC) → skicka startomvandlingskommando (0x44) → fördröjning → återställ → skicka SKIPROM-kommando (0xCC) → skicka minneskommando (0xBE) → läs två byte data (dvs. dvs. dvs. -n, dvs. -nicken, dvs. -nicken, dvs. -nicken.. temperatur) kontinuerligt → avsluta.

3) Schematiskt diagram och CUBEMAX-konfiguration
Från det schematiska diagrammet, det kan ses att DS18B20 är aktiverad av PG11-porten för att öppna serieporten för att skriva ut temperaturinformation

DS18B20-schema och CUBEMAX-konfiguration

DS18B20-schema och CUBEMAX-konfiguration

DS18B20 temperatur- och fuktighetssensorgränssnitt

DS18B20 temperatur- och fuktighetssensorgränssnitt

4) Koddel
Koddelen transplanterar Zhengdian Atoms ds18b20-bibliotek och gör små modifieringar

#ifndef __DS18B20_H
#definiera __DS18B20_H

#omfatta “tim.h”
/***********************************************************************************/
/* DS18B20 -stiftdefinition */

#definiera DS18B20_DQ_GPIO_PORT GPIOG
#definiera DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#definiera DS18B20_DQ_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOG_CLK_ENABLE(); }medan(0) /* PG port klocka aktivera */

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

/* IO-driftfunktion */
#definiera DS18B20_DQ_OUT(x) do{ 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); \
}medan(0) /* Dataportutgång */
#definiera DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Dataportingång */

uint8_t ds18b20_init(ogiltig); /* Initiera DS18B20 */
uint8_t ds18b20_check(ogiltig); /* Kontrollera om DS18B20 finns */
kort ds18b20_get_temperature(ogiltig);/* Få temperatur */

#endif

5. Infraröd fjärrkontrollmodul
1) Kodningsprotokoll för trådlös modul

De allmänt använda kodningsmetoderna för infraröd fjärrkontroll är: NEC-protokoll för PWM (pulsbreddsmodulering) och RC-5-protokoll för Philips PPM (pulspositionsmodulering). Fjärrkontrollen som följer med utvecklingskortet använder NEC-protokollet, som har följande egenskaper:

1. 8-bitadress och 8-bitars instruktionslängd;

2. Adress och kommando sänds två gånger (för att säkerställa tillförlitlighet);

3. PWM pulspositionsmodulering, varvid arbetscykeln för den sända infraröda bäraren representerar “0” och “1”;

4. Bärvågsfrekvensen är 38Khz;

5. Bittiden är 1,125ms eller 2,25ms;

I NEC-protokollet, hur man ställer in data i protokollet till ‘0’ eller "1"? Här, den infraröda mottagaren och den infraröda sändaren är separerade.

Infraröd sändare: Skicka protokolldata '0' = 560us av bärvågssignalöverföring + 560oss av ingen bärvågssignalöverföring

Skicka protokolldata '1' = 560us av bärvågssignalöverföring + 1680oss av ingen bärvågssignalöverföring

Bitdefinitionen för infraröd sändare visas i figuren nedan

Infraröd mottagare: Ta emot protokolldata '0' = 560us låg nivå + 560oss hög nivå

Ta emot protokolldata '1' = 560us låg nivå + 1680oss hög nivå

Dataformatet för NEC fjärrkontrollkommando är: synkroniseringsterminal, adresskod, adress omvänd kod, kontrollkod, kontrollera invers kod. Synkroniseringskoden består av en 9ms låg nivå och en 4,5ms hög nivå. Adresskoden, adress omvänd kod, kontrollkod, och kontrollinvers kod är alla 8-bitars dataformat. De skickas i ordningen låg bit först och hög bit sist. Den omvända koden används för att öka överföringens tillförlitlighet.

Därför, input capture kan användas för att mäta pulsbredden på den höga nivån för att uppnå fjärrkontrollsavkodning.
2) Schematiskt diagram och CUBEMAX-konfiguration

Från det schematiska diagrammet, vi kan se att den trådlösa modulen är aktiverad genom PB9-stiftet och samlas genom 4 kanaler av TIM4:

Standardstiftet för TIM4_CH4 är inte PB9, så det måste ställas in manuellt, och avbrottsinställningen aktiveras samtidigt

3) Koddel
Fånga den stigande kanten genom Tim-återuppringningsfunktionen

Just nu, den avkodade signalen kan erhållas:

Just nu, uppgifterna är mer komplexa och kan bearbetas något:

Effekten är som följer:
De två sista siffrorna är den avkodade och dess inversa kod. Just nu, det kan definieras som ett makro för att justera temperaturtröskeln:

Effekten är som följer:

Infraröd delkod:

/* ANVÄNDARKOD BEGIN Header */
/**
******************************************************************************
* @fil : main.c
* @kort : Huvuddel av programmet
******************************************************************************
* @uppmärksamhet
*
* <h2><centrum>&kopiera; Upphovsrätt (c) 2024 STMicroelectronics.
* Alla rättigheter reserverade.</centrum></h2>
*
* Denna mjukvarukomponent är licensierad av ST under BSD 3-klausul licens,
* de “Licens”; Du får inte använda den här filen förutom i enlighet med
* Licens. Du kan få en kopia av licensen på:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* ANVÄNDARKOD SLUT Rubrik */
/* Inkluderar ——————————————————————*/
#omfatta “huvud.h”
#omfatta “tim.h”
#omfatta “usart.h”
#omfatta “gpio.h”

/* Privat inkluderar ———————————————————-*/
/* ANVÄNDARKOD BEGIN Inkluderar */
#omfatta “stdio.h”
#omfatta “sträng.h”
#definiera MAXUP 157
#definiera MAXDOWN 87
#definiera MINUP 221
#definiera MINDOWN 61
/* ANVÄNDARKOD SLUT Inkluderar */

/* Privat typdef ———————————————————–*/
/* ANVÄNDARKOD BÖRJA PTD */

/* ANVÄNDARKOD SLUT PTD */

/* Privat definiera ————————————————————*/
/* ANVÄNDARKOD BÖRJA PD */
/* ANVÄNDARKOD SLUT PD */

/* Privat makro ————————————————————-*/
/* ANVÄNDARKOD BÖRJA PM */

/* ANVÄNDARKOD SLUT PM */

/* Privata variabler ———————————————————*/

/* ANVÄNDARKOD BÖRJA PV */
uint32_t upCount=0;
uint16_t ValueUp=0;
uint16_t ValueDown=0;
uint8_t isUpCapt=1;
uint16_t width=0;
uint16_t buffert[128]={0};
uint16_t bufferId=0;
uint8_t rcvFalg=0;
/* ANVÄNDARKOD SLUT PV */

/* Prototyper för privata funktioner ———————————————–*/
ogiltig SystemClock_Config(ogiltig);
/* ANVÄNDARKOD BÖRJA PFP */

/* ANVÄNDARKOD SLUT PFP */

/* Privat användarkod ———————————————————*/
/* ANVÄNDARKOD BÖRJA 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
upCount++;
}
ogiltig HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
om(isUpCapt)//Om det är stigande kant fånga
{
ValueUp=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);
upCount=0;
}
annan{
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;
om(bredd>4400&&bredd<4600)
{
bufferId=0;
buffert[bufferId++]=bredd;
}
annat om(buffert-ID>0)
{
buffert[bufferId++]=bredd;
om(buffert-ID>32)
{
rcvFalg=1;
bufferId=0;
}
}
}
}
ogiltig bitBuffer2num(char num[])
{
num[0]=0;
num[1]=0;
num[2]=0;
num[3]=0;
för(int i=0;i<32;i++)
{
om(buffert[i+1]<1000)
{
num[i/8]=antal[i/8]<<1;
}
annan
{
num[i/8]=antal[i/8]<<1;
num[i/8]|=0x01;
}
}
}
/* ANVÄNDARKOD SLUT 0 */

/**
* @brief Applikationens startpunkt.
* @retval int
*/
int main(ogiltig)
{
/* ANVÄNDARKOD BÖRJA 1 */
röding printbuff[128]={0};
char num[4]={0};
char key=0;
/* ANVÄNDARKOD SLUT 1 */

/* MCU-konfiguration——————————————————–*/

/* Återställning av all kringutrustning, Initierar Flash-gränssnittet och Systick. */
HAL_Init();

/* ANVÄNDARKOD BEGIN Init */

/* ANVÄNDARKOD SLUT Init */

/* Konfigurera systemklockan */
SystemClock_Config();

/* ANVÄNDARKOD BÖRJA SysInit */

/* ANVÄNDARKOD SLUT SysInit */

/* Initiera all konfigurerad kringutrustning */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* ANVÄNDARKOD BÖRJA 2 */

/* ANVÄNDARKOD SLUT 2 */

/* Oändlig slinga */
/* ANVÄNDARKOD BÖRJA UNDER */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
HAL_TIM_Base_Start_IT(&htim4);//Timeruppdatering genererar ett avbrott
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);//
medan (1)
{
om(rcvFalg)
{
för(int i=0;i<4;i++)
{
bitBuffer2num(num);
sprintf(printbuff,”0xx “,num[i]);
HAL_UART_Sänd(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
}
// sprintf(printbuff,”%u “,buffert[i]);
// HAL_UART_Sänd(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
// }
HAL_UART_Sänd(&huart1,”\r\n”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
printf(“%d\r\n”,num[3]);
om(num[3]==157)
{
printf(“111111\r\n”);
}
HAL_Fördröjning(1000);
/* ANVÄNDARKOD SLUTAR MED */

/* ANVÄNDARKOD BÖRJA 3 */
}
/* ANVÄNDARKOD SLUT 3 */
}

/**
* @brief Konfiguration av systemklockan
* @retval Ingen
*/
ogiltig SystemClock_Config(ogiltig)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};