Comparació entre Sensor de temperatura PT100 sonda i Mòdul DS18B20
1) Principi bàsic de l'adquisició del senyal
① La resistència de PT100 canvia proporcionalment amb la temperatura (més alta és la temperatura, com més gran és la resistència), però el canvi de resistència és molt petit, sobre 0.385 O / grau;
② El rang de mesura de temperatura de PT100 és -200 ℃ -200 ℃, i a 0℃, la resistència és exactament igual a 100 O;
③ El corrent de treball de PT100 hauria de ser inferior a 5 mA;
④ Encara que la resistència de PT100 canvia proporcionalment amb la temperatura, la seva taxa de canvi (és a dir, Valor K Valor K Valor K) és diferent en diferents intervals de temperatura.
2) Taula de canvi de resistència a la temperatura PT100
3. Circuit d'accionament PT100
1) Mitjançant el mètode de divisió de tensió, AD recull la tensió PT100 per obtenir el valor de la resistència per calcular la temperatura
El valor de resistència de PT100 en aigua a temperatura ambient (25℃ 25 ℃ 25 ℃) es tracta de 109.89 O.
El microcontrolador emet una tensió de 3,3 V, i la tensió dividida per PT100 és aproximadament:
109.89 ∗ 0.005 = 0.54945 V
El valor AD convertit segons la fórmula de conversió AD és aproximadament:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682
Quan la temperatura puja un grau, suposant que la resistència de PT100 només augmenta 0.385 O, el valor de canvi de la tensió dividida és aproximadament igual a:
0.385 ∗ 0.005 = 0.001925 V
El valor AD convertit segons la fórmula de conversió AD és aproximadament:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2
A l'experiment, es va trobar que a causa de la tensió inestable de 3,3 V de la font d'alimentació stm32, l'ADC va recollir les fluctuacions de tensió PT100 i l'error de divisió de tensió va ser gran. La solució d'optimització és dissenyar un circuit de font de corrent constant. Recollint la tensió de PT100 i el corrent de la font de corrent constant, es pot obtenir la resistència de PT100, i llavors es pot obtenir el valor de la temperatura.
2) Circuit de font de corrent constant basat en regulador LDO (MD5333)
Hi ha molts circuits de conducció per provar PT100 a Internet, com el circuit de pont de CC, circuit de font de corrent constant basat en un amplificador operacional, etc. L'autor també va dedicar molt de temps a la selecció del circuit de conducció, tenint en compte la dificultat de fer el tauler i el nombre de components, i finalment va triar el circuit de font de corrent constant basat en el regulador LDO (MD5333). L'esquema del circuit és el següent:
En aquest punt, la selecció de maquinari s'ha completat bàsicament. La placa de desenvolupament utilitzada és la placa d'elit Zhengdian Atom F10ZET6
Mòdul DS18B20
Per tal de provar la temperatura en temps real i la comparació de la temperatura PT100, s'afegeix el mòdul DS18B20 per a la prova de comparació de calibratge
1) Introducció a DS18B20
DS18B20 és un sensor de temperatura d'un sol bus amb un rang de temperatura de prova de -55 ~ + 125 ℃ i una precisió de ± 0,5 ℃. La temperatura del camp es transmet directament d'una manera digital d'un sol bus, que millora molt la capacitat anti-interferència del sistema. Pot llegir directament la temperatura mesurada, i pot realitzar un mètode de lectura de valors digitals de 9 ~ 12 bits mitjançant una programació senzilla segons els requisits reals. El seu rang de tensió de funcionament és de 3 ~ 5,5 V, i utilitza una varietat de formes d'embalatge, fent que la configuració del sistema sigui flexible i còmoda. La resolució establerta i la temperatura d'alarma establerta per l'usuari s'emmagatzemen a l'EEPROM i encara es guarden després d'una fallada de corrent.
2) Introducció al temps de treball DS18B20
Tots els dispositius d'un sol bus requereixen un temps de senyal estricte per garantir la integritat de les dades. DS18B20 té 6 tipus de senyal: reiniciar el pols, pols de resposta, escriure 0, escriure 1, llegir 0 i llegir 1. Tots aquests senyals, excepte el pols de resposta, són senyals sincrònics enviats per l'amfitrió. I totes les ordres i dades s'envien primer amb el bit baix del byte.
① Restableix el pols i el pols de resposta
Totes les comunicacions del bus únic comencen amb una seqüència d'inicialització. L'amfitrió emet un nivell baix i manté el nivell baix durant almenys 480 us per generar un pols de restabliment. Llavors l'amfitrió deixa anar l'autobús, i la resistència pull-up de 4,7K fa que l'únic bus sigui alt, amb un temps de retard de 15 ~ 60 us, i entra al mode de recepció (Rx). A continuació, DS18B20 baixa el bus durant 60 ~ 240 us per generar un pols de resposta de baix nivell.
② Escriu el temps
El temps d'escriptura inclou l'escriptura 0 cronometrar i escriure 1 temporització. Tots els temps d'escriptura requereixen almenys 60 us, i es requereix almenys 1 us de temps de recuperació entre dos temps d'escriptura independents. Tots dos temps d'escriptura comencen amb l'amfitrió baixant l'autobús. Escriu 1 temporització: l'amfitrió produeix un nivell baix, retards per 2us, i després deixa anar l'autobús, retardant 60 us. Escriu 0 temporització: l'amfitrió produeix un nivell baix, retards de 60 us, i després deixa l'autobús amb un retard de 2 us.
③ Llegir el temps
Els dispositius d'un sol bus transmeten dades a l'amfitrió només quan aquest emet un temps de lectura. Per tant, després que l'amfitrió emeti una ordre de lectura de dades, s'ha de generar immediatament un temps de lectura perquè l'esclau pugui transmetre dades. Tots els temps de lectura requereixen almenys 60 us, i es requereix almenys 1 us de temps de recuperació entre dos temps de lectura independents. Cada temps de lectura l'inicia l'amfitrió, que baixa l'autobús durant almenys 1 us. L'amfitrió ha d'alliberar l'autobús durant el temps de lectura i mostra l'estat de l'autobús en un termini de 15 us després que s'iniciï el cronometratge. El procés típic de temps de lectura és: l'amfitrió genera un retard de baix nivell de 2 us, llavors l'amfitrió canvia al mode d'entrada de retard de 12 us, després llegeix el nivell actual del bus únic, i després retarda 50 us.
Després d'entendre el temps d'autobús únic, fem una ullada al procés típic de lectura de temperatura del DS18B20. El procés típic de lectura de temperatura del DS18B20 és: restablir → enviar SKIPROM (0xCC) → envia l'ordre d'inici de conversió (0x44) → retardar → reiniciar → enviar l'ordre SKIPROM (0xCC) → enviar comanda de memòria (0xBE) → llegir dos bytes de dades (és a dir. temperatura) contínuament → acabar.
3) Diagrama esquemàtic i configuració CUBEMAX
A partir del diagrama esquemàtic, es pot veure que DS18B20 està habilitat pel port PG11 per obrir el port sèrie per imprimir informació de temperatura
4) Part del codi
La part del codi trasplanta la biblioteca ds18b20 de Zhengdian Atom i fa lleugeres modificacions
#ifndef __DS18B20_H
#defineix __DS18B20_H
#incloure “tim.h”
/***********************************************************************************/
/* Definició de PIN DS18B20 */
#defineix DS18B20_DQ_GPIO_PORT GPIOG
#defineix DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#defineix DS18B20_DQ_GPIO_CLK_ENABLE() fer{ __HAL_RCC_GPIOG_CLK_ENABLE(); }mentre(0) /* Activació del rellotge del port PG */
/**********************************************************************************************/
/* Funció d'operació IO */
#defineix DS18B20_DQ_OUT(x) fer{ 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); \
}mentre(0) /* Sortida del port de dades */
#definir DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Entrada del port de dades */
uint8_t ds18b20_init(buit); /* Inicialitzar DS18B20 */
uint8_t ds18b20_check(buit); /* Comproveu si existeix DS18B20 */
curt ds18b20_get_temperature(buit);/* Obtenir temperatura */
#endif
5. Mòdul de control remot per infrarojos
1) Protocol de codificació de mòduls sense fil
Els mètodes de codificació àmpliament utilitzats per al control remot d'infrarojos són: Protocol NEC de PWM (modulació d'amplada de pols) i protocol RC-5 de Philips PPM (modulació de la posició del pols). El comandament a distància que ve amb la placa de desenvolupament utilitza el protocol NEC, que té les següents característiques:
1. 8-adreça de bits i longitud d'instrucció de 8 bits;
2. L'adreça i la comanda es transmeten dues vegades (per garantir la fiabilitat);
3. Modulació de posició de pols PWM, amb el cicle de treball de la portadora infraroja transmesa que representa “0” i “1”;
4. La freqüència de la portadora és de 38Khz;
5. El temps de bit és de 1,125 ms o 2,25 ms;
En el protocol NEC, com configurar les dades del protocol ‘0’ o '1'? Aquí, el receptor d'infrarojos i el transmissor d'infrarojos estan separats.
Transmissor d'infrarojos: Enviar dades de protocol "0" = 560 us de transmissió del senyal de la portadora + 560us de cap transmissió de senyal de portadora
Enviar dades de protocol "1" = 560 us de transmissió del senyal de la portadora + 1680us de cap transmissió de senyal de portadora
La definició de bits del transmissor d'infrarojos es mostra a la figura següent
Receptor d'infrarojos: Rebre dades de protocol "0" = 560us de nivell baix + 560nosaltres d'alt nivell
Rebre dades de protocol "1" = nivell baix de 560 us + 1680nosaltres d'alt nivell
El format de dades de la comanda de control remot NEC és: terminal de sincronització, codi d'adreça, codi invers de l'adreça, codi de control, control de codi invers. El codi de sincronització consta d'un nivell baix de 9 ms i un nivell alt de 4,5 ms. El codi d'adreça, codi invers de l'adreça, codi de control, i el codi invers de control són tots formats de dades de 8 bits. S'envien en l'ordre del primer bit baix i el darrer bit alt. El codi invers s'utilitza per augmentar la fiabilitat de la transmissió.
Per tant, La captura d'entrada es pot utilitzar per mesurar l'amplada del pols de l'alt nivell per aconseguir la descodificació del control remot.
2) Diagrama esquemàtic i configuració CUBEMAX
A partir del diagrama esquemàtic, podem veure que el mòdul sense fil s'habilita a través del pin PB9 i es recull a través del 4 canals de TIM4:
El pin predeterminat de TIM4_CH4 no és PB9, per tant, s'ha de configurar manualment, i la configuració d'interrupció s'activa al mateix temps
3) Part del codi
Captureu el front ascendent mitjançant la funció de devolució de trucada tim
En aquest moment, es pot obtenir el senyal descodificat:
En aquest moment, les dades són més complexes i es poden processar lleugerament:
L'efecte és el següent:
Els dos últims dígits són el codi descodificat i el seu codi invers. En aquest moment, es pot definir com una macro per ajustar el llindar de temperatura:
L'efecte és el següent:
Codi de part infraroja:
/* CODI D'USUARI BEGIN Capçalera */
/**
******************************************************************************
* @fitxer : principal.c
* @breu : Cos principal del programa
******************************************************************************
* @atenció
*
* <h2><centre>&còpia; Copyright (c) 2024 STMicroelectronics.
* Tots els drets reservats.</centre></h2>
*
* Aquest component de programari té la llicència de ST sota llicència BSD 3-Clause,
* el “llicència”; No podeu utilitzar aquest fitxer excepte en compliment de la
* llicència. Podeu obtenir una còpia de la llicència a:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* CODI D'USUARI FINAL Capçalera */
/* Inclou ——————————————————————*/
#incloure “principal.h”
#incloure “tim.h”
#incloure “usart.h”
#incloure “gpio.h”
/* Privat inclou ———————————————————-*/
/* CODI D'USUARI BEGIN Inclou */
#incloure “stdio.h”
#incloure “corda.h”
#definir MAXUP 157
#defineix MAXDOWN 87
#definir MINUP 221
#definir MINDOWN 61
/* CODI D'USUARI FIN Inclou */
/* Tipus privat def ———————————————————–*/
/* CODI D'USUARI BEGIN PTD */
/* CODI D'USUARI END PTD */
/* Definició privada ————————————————————*/
/* CODI D'USUARI COMENÇAR PD */
/* CODI USUARI FINAL PD */
/* Macro privada ————————————————————-*/
/* CODI D'USUARI COMENÇAR PM */
/* CODI D'USUARI FIN PM */
/* Variables privades ———————————————————*/
/* CODI D'USUARI COMENÇAR PV */
uint32_t upCount=0;
uint16_t ValueUp=0;
uint16_t ValueDown=0;
uint8_t isUpCapt=1;
uint16_t amplada=0;
uint16_t buffer[128]={0};
uint16_t bufferId=0;
uint8_t rcvFalg=0;
/* CODI USUARI FINAL PV */
/* Prototips de funció privada ———————————————–*/
void SystemClock_Config(buit);
/* CODI D'USUARI COMENÇAR PFP */
/* CODI D'USUARI FINAL PFP */
/* Codi d'usuari privat ———————————————————*/
/* CODI D'USUARI COMENÇAR 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
upCount++;
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
si(isUpCapt)//Si es tracta d'una captura de front ascendent
{
ValueUp=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);
upCount=0;
}
altra cosa{
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;
si(amplada>4400&&lada<4600)
{
bufferId=0;
tampó[bufferId++]= amplada;
}
altrament si(bufferId>0)
{
tampó[bufferId++]= amplada;
si(bufferId>32)
{
rcvFalg=1;
bufferId=0;
}
}
}
}
void bitBuffer2num(char num[])
{
núm[0]=0;
núm[1]=0;
núm[2]=0;
núm[3]=0;
per(int i=0;i<32;i++)
{
si(tampó[i+1]<1000)
{
núm[i/8]=núm[i/8]<<1;
}
altra cosa
{
núm[i/8]=núm[i/8]<<1;
núm[i/8]|=0x01;
}
}
}
/* CODI D'USUARI FINAL 0 */
/**
* @brief El punt d'entrada de l'aplicació.
* @retval int
*/
int principal(buit)
{
/* CODI D'USUARI COMENÇAR 1 */
char printbuff[128]={0};
char num[4]={0};
clau de caràcters = 0;
/* CODI D'USUARI FINAL 1 */
/* Configuració MCU——————————————————–*/
/* Reinicialització de tots els perifèrics, Inicialitza la interfície Flash i el Systick. */
HAL_Init();
/* CODI D'USUARI COMENÇAR Init */
/* CODI D'USUARI FIN Init */
/* Configura el rellotge del sistema */
SystemClock_Config();
/* CODI D'USUARI COMENÇAR SysInit */
/* CODI D'USUARI FIN SysInit */
/* Inicialitzeu tots els perifèrics configurats */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* CODI D'USUARI COMENÇAR 2 */
/* CODI D'USUARI FINAL 2 */
/* Bucle infinit */
/* CODI D'USUARI COMENÇA MENTRE */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
HAL_TIM_Base_Start_IT(&htim4);//L'actualització del temporitzador genera una interrupció
HAL_TIM_IC_Inici_IT(&htim4,TIM_CHANNEL_4);//
mentre (1)
{
si(rcvFalg)
{
per(int i=0;i<4;i++)
{
bitBuffer2num(núm);
sprintf(printbuff,”0xx “,núm[i]);
HAL_UART_Transmet(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
}
// sprintf(printbuff,”%u “,tampó[i]);
// HAL_UART_Transmet(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
// }
HAL_UART_Transmet(&huart1,”\r\n”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
imprimirf(“%d\r\n”,núm[3]);
si(núm[3]==157)
{
imprimirf(“111111\r\n”);
}
HAL_Retard(1000);
/* CODI D'USUARI FINALITZA QUANT */
/* CODI D'USUARI COMENÇAR 3 */
}
/* CODI D'USUARI FINAL 3 */
}
/**
* @brief Configuració del rellotge del sistema
* @retval Cap
*/
void SystemClock_Config(buit)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
English
Afrikaans
العربية
বাংলা
bosanski jezik
Български
Català
粤语
中文(简体)
中文(漢字)
Hrvatski
Čeština
Nederlands
Eesti keel
Suomi
Français
Deutsch
Ελληνικά
हिन्दी; हिंदी
Magyar
Bahasa Indonesia
Italiano
日本語
한국어
Latviešu valoda
Lietuvių kalba
македонски јазик
Bahasa Melayu
Norsk
پارسی
Polski
Português
Română
Русский
Cрпски језик
Slovenčina
Slovenščina
Español
Svenska
ภาษาไทย
Türkçe
Українська
اردو
Tiếng Việt









