Comparação entre Sensor de temperatura PT100 sonda e Módulo DS18B20
1) Princípio básico de aquisição de sinal
① A resistência do PT100 muda proporcionalmente com a temperatura (quanto maior a temperatura, quanto maior a resistência), mas a mudança de resistência é muito pequena, sobre 0.385 Oh / grau;
② A faixa de medição de temperatura do PT100 é -200℃ -200℃, e a 0℃, a resistência é exatamente igual a 100 Oh;
③ A corrente de trabalho do PT100 deve ser menor que 5 mA;
④ Embora a resistência do PT100 mude proporcionalmente com a temperatura, sua taxa de mudança (aquilo é, Valor K Valor K Valor K) é diferente em diferentes faixas de temperatura.
2) Tabela de mudança de resistência à temperatura PT100
3. Circuito de acionamento PT100
1) Através do método de divisão de tensão, AD coleta tensão PT100 para obter valor de resistência para calcular temperatura
O valor de resistência do PT100 na água à temperatura ambiente (25℃25℃25℃) é sobre 109.89 Oh.
O microcontrolador produz tensão de 3,3V, e a tensão dividida por PT100 é aproximadamente:
109.89 ∗ 0.005 = 0.54945 V
O valor AD convertido de acordo com a fórmula de conversão AD é aproximadamente:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682
Quando a temperatura sobe um grau, assumindo que a resistência do PT100 apenas aumenta em 0.385 Oh, o valor de mudança da tensão dividida é aproximadamente igual a:
0.385 ∗ 0.005 = 0.001925 V
O valor AD convertido de acordo com a fórmula de conversão AD é aproximadamente:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2
No experimento, descobriu-se que devido à tensão instável de 3,3 V da fonte de alimentação stm32, o ADC coletou flutuações de tensão do PT100 e o erro de divisão de tensão foi grande. A solução de otimização é projetar um circuito fonte de corrente constante. Ao coletar a tensão do PT100 e a corrente da fonte de corrente constante, a resistência do PT100 pode ser obtida, e então o valor da temperatura pode ser obtido.
2) Circuito de fonte de corrente constante baseado em regulador LDO (MD5333)
Existem muitos circuitos de acionamento para testar o PT100 na Internet, como circuito de ponte DC, circuito de fonte de corrente constante baseado em amplificador operacional, etc.. O autor também gastou muito tempo selecionando o circuito de direção, considerando a dificuldade de confecção da placa e a quantidade de componentes, e finalmente escolheu o circuito fonte de corrente constante baseado no regulador LDO (MD5333). O diagrama do circuito é o seguinte:
Neste ponto, a seleção de hardware foi basicamente concluída. A placa de desenvolvimento usada é a Placa Zhengdian Atom F10ZET6 Elite
Módulo DS18B20
Para testar a temperatura em tempo real e a comparação de temperatura PT100, o módulo DS18B20 é adicionado para teste de comparação de calibração
1) Introdução ao DS18B20
DS18B20 é um sensor de temperatura de barramento único com uma faixa de temperatura de teste de -55 ~ + 125 ℃ e uma precisão de ± 0,5 ℃. A temperatura do campo é transmitida diretamente de maneira digital de barramento único, o que melhora muito a capacidade anti-interferência do sistema. Ele pode ler diretamente a temperatura medida, e pode realizar um método de leitura de valor digital de 9 a 12 bits por meio de programação simples de acordo com os requisitos reais. Sua faixa de tensão operacional é de 3 ~ 5,5 V, e usa uma variedade de formas de embalagem, tornando a configuração do sistema flexível e conveniente. A resolução definida e a temperatura do alarme definida pelo usuário são armazenadas na EEPROM e ainda são salvas após falha de energia.
2) Introdução ao tempo de trabalho DS18B20
Todos os dispositivos de barramento único exigem tempo de sinal rigoroso para garantir a integridade dos dados. DS18B20 tem 6 tipos de sinal: redefinir pulso, pulso de resposta, escrever 0, escrever 1, ler 0 e leia 1. Todos esses sinais, exceto o pulso de resposta, são sinais síncronos enviados pelo host. E todos os comandos e dados são enviados primeiro com o bit mais baixo do byte.
① Redefinir pulso e pulso de resposta
Todas as comunicações no barramento único começam com uma sequência de inicialização. O host emite um nível baixo e mantém o nível baixo por pelo menos 480us para gerar um pulso de reinicialização. Então o anfitrião libera o ônibus, e o resistor pull-up de 4,7K puxa o barramento único para cima, com um tempo de atraso de 15 ~ 60us, e entra no modo de recepção (Rx). Em seguida, o DS18B20 puxa o barramento para baixo por 60 ~ 240us para gerar um pulso de resposta de baixo nível.
② Tempo de gravação
O tempo de gravação inclui gravação 0 tempo e escrever 1 tempo. Todos os tempos de gravação requerem pelo menos 60us, e é necessário pelo menos 1us de tempo de recuperação entre dois tempos de gravação independentes. Ambos os tempos de gravação começam com o host desativando o barramento. Escrever 1 tempo: o host gera um nível baixo, atrasos para 2us, e então libera o ônibus, atrasando 60us. Escrever 0 tempo: o host gera um nível baixo, atrasos para 60us, e então libera o barramento com atraso de 2us.
③ Leia o tempo
Dispositivos de barramento único transmitem dados ao host somente quando o host emite um tempo de leitura. Portanto, depois que o host emite um comando de leitura de dados, um tempo de leitura deve ser gerado imediatamente para que o escravo possa transmitir dados. Todos os tempos de leitura requerem pelo menos 60us, e é necessário pelo menos 1us de tempo de recuperação entre dois tempos de leitura independentes. Cada tempo de leitura é iniciado pelo host, que puxa o ônibus para baixo por pelo menos 1us. O host deve liberar o barramento durante a temporização de leitura e testar o status do barramento dentro de 15us após o início da temporização. O processo típico de temporização de leitura é: o host gera um atraso de baixo nível de 2us, então o host muda para o modo de entrada com atraso de 12us, então lê o nível atual do barramento único, e depois atrasa 50us.
Depois de entender o tempo do barramento único, vamos dar uma olhada no processo típico de leitura de temperatura do DS18B20. O processo típico de leitura de temperatura do DS18B20 é: redefinir → enviar SKIPROM (0XCC) → enviar comando de início de conversão (0x44) → atrasar → redefinir → enviar comando SKIPROM (0XCC) → enviar comando de memória (0Xbe) → ler dois bytes de dados (ou seja. temperatura) continuamente → fim.
3) Diagrama esquemático e configuração CUBEMAX
Do diagrama esquemático, pode-se observar que o DS18B20 é habilitado pela porta PG11 para abrir a porta serial para imprimir informações de temperatura
4) Parte do código
A parte do código transplanta a biblioteca ds18b20 do Zhengdian Atom e faz pequenas modificações
#ifndef__DS18B20_H
#definir __DS18B20_H
#incluir “hora.h”
/***********************************************************************************/
/* Definição do pino DS18B20 */
#definir DS18B20_DQ_GPIO_PORT GPIOG
#definir DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#definir DS18B20_DQ_GPIO_CLK_ENABLE() fazer{ __HAL_RCC_GPIOG_CLK_ENABLE(); }enquanto(0) /* Ativação do relógio da porta PG */
/**********************************************************************************************/
/* Função de operação IO */
#definir DS18B20_DQ_OUT(x) fazer{ 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); \
}enquanto(0) /* Saída da porta de dados */
#definir DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Entrada da porta de dados */
uint8_t ds18b20_init(vazio); /* Inicialize DS18B20 */
uint8_t ds18b20_check(vazio); /* Verifique se DS18B20 existe */
curto ds18b20_get_temperature(vazio);/* Obter temperatura */
#final se
5. Módulo de controle remoto infravermelho
1) Protocolo de codificação de módulo sem fio
Os métodos de codificação amplamente utilizados para controle remoto infravermelho são: Protocolo NEC de PWM (modulação por largura de pulso) e protocolo RC-5 da Philips PPM (modulação de posição de pulso). O controle remoto que acompanha a placa de desenvolvimento usa o protocolo NEC, que possui os seguintes recursos:
1. 8-endereço de bit e comprimento de instrução de 8 bits;
2. Endereço e comando são transmitidos duas vezes (para garantir confiabilidade);
3. Modulação de posição de pulso PWM, com o ciclo de trabalho da portadora infravermelha transmitida representando “0” e “1”;
4. A frequência da portadora é 38Khz;
5. O tempo de bit é 1,125 ms ou 2,25 ms;
No protocolo NEC, como definir os dados no protocolo para ‘0’ ou '1'? Aqui, o receptor infravermelho e o transmissor infravermelho são separados.
Transmissor infravermelho: Enviar dados de protocolo ‘0’ = 560us de transmissão de sinal da portadora + 560sem transmissão de sinal de portadora
Enviar dados de protocolo ‘1’ = 560us de transmissão de sinal da portadora + 1680sem transmissão de sinal de portadora
A definição de bit do transmissor infravermelho é mostrada na figura abaixo
Receptor infravermelho: Receber dados de protocolo ‘0’ = 560us nível baixo + 560nós de alto nível
Receber dados de protocolo ‘1’ = 560us de nível baixo + 1680nós de alto nível
O formato de dados do comando de controle remoto NEC é: terminal de sincronização, código de endereço, código inverso de endereço, código de controle, controlar código inverso. O código de sincronização consiste em um nível baixo de 9 ms e um nível alto de 4,5 ms.. O código de endereço, código inverso de endereço, código de controle, e código inverso de controle são todos formatos de dados de 8 bits. Eles são enviados na ordem do bit inferior primeiro e o bit superior por último.. O código inverso é usado para aumentar a confiabilidade da transmissão.
Portanto, captura de entrada pode ser usada para medir a largura de pulso de alto nível para obter decodificação de controle remoto.
2) Diagrama esquemático e configuração CUBEMAX
Do diagrama esquemático, podemos ver que o módulo wireless é habilitado através do pino PB9 e coleta através do 4 canais do TIM4:
O pino padrão do TIM4_CH4 não é PB9, então ele precisa ser definido manualmente, e a configuração de interrupção é ativada ao mesmo tempo
3) Parte do código
Capture a borda ascendente por meio da função de retorno de chamada tim
Neste momento, o sinal decodificado pode ser obtido:
Neste momento, os dados são mais complexos e podem ser ligeiramente processados:
O efeito é o seguinte:
Os dois últimos dígitos são o decodificado e seu código inverso. Neste momento, pode ser definido como uma macro para ajustar o limite de temperatura:
O efeito é o seguinte:
Código de peça infravermelho:
/* CÓDIGO DE USUÁRIO COMEÇAR Cabeçalho */
/**
******************************************************************************
* @arquivo : principal.c
* @apresentação : Corpo principal do programa
******************************************************************************
* @atenção
*
* <h2><centro>&cópia; Direitos autorais (c) 2024 STMicroeletrônica.
* Todos os direitos reservados.</centro></h2>
*
* Este componente de software é licenciado pela ST sob licença BSD de 3 cláusulas,
* o “Licença”; Você não pode usar este arquivo, exceto em conformidade com o
* Licença. Você pode obter uma cópia da Licença em:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* Cabeçalho FIM CÓDIGO DE USUÁRIO */
/* Inclui ——————————————————————*/
#incluir “principal.h”
#incluir “hora.h”
#incluir “usart.h”
#incluir “gpio.h”
/* Privado inclui ———————————————————-*/
/* CÓDIGO DE USUÁRIO COMEÇO Inclui */
#incluir “stdio.h”
#incluir “string.h”
#definir MAXUP 157
#definir MAXDOWN 87
#definir MINUP 221
#definir MINDOWN 61
/* FIM DO CÓDIGO DE USUÁRIO Inclui */
/* Tipo privado ———————————————————–*/
/* CÓDIGO DE USUÁRIO COMEÇAR PTD */
/* CÓDIGO DE USUÁRIO FIM PTD */
/* Definição privada ————————————————————*/
/* CÓDIGO DE USUÁRIO COMEÇAR PD */
/* CÓDIGO DE USUÁRIO FIM PD */
/* Macro privada ————————————————————-*/
/* CÓDIGO DE USUÁRIO INÍCIO PM */
/* CÓDIGO DE USUÁRIO FIM PM */
/* Variáveis privadas ———————————————————*/
/* CÓDIGO DE USUÁRIO COMEÇA PV */
uint32_t contagem crescente = 0;
uint16_t ValorUp=0;
uint16_t ValorDown=0;
uint8_t isUpCapt=1;
largura uint16_t = 0;
buffer uint16_t[128]={0};
uint16_t bufferId=0;
uint8_t rcvFalg=0;
/* CÓDIGO DE USUÁRIO FIM PV */
/* Protótipos de funções privadas ———————————————–*/
vazio SystemClock_Config(vazio);
/* CÓDIGO DE USUÁRIO INÍCIO PFP */
/* CÓDIGO DE USUÁRIO FIM PFP */
/* Código de usuário privado ———————————————————*/
/* CÓDIGO DE USUÁRIO COMEÇO 0 */
vazio HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
contagem crescente++;
}
vazio HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
se(isUpCapt)//Se for captura de borda ascendente
{
ValueUp=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);
contagem crescente = 0;
}
outro{
ValueDown=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=1;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_RISING);
largura=ValueDown+upCount*65536-ValueUp;
se(largura>4400&&largura<4600)
{
bufferId=0;
buffer[bufferId++]=largura;
}
senão se(bufferID>0)
{
buffer[bufferId++]=largura;
se(bufferID>32)
{
rcvFalg=1;
bufferId=0;
}
}
}
}
vazio bitBuffer2num(número de caractere[])
{
número[0]=0;
número[1]=0;
número[2]=0;
número[3]=0;
para(int eu = 0;eu<32;eu++)
{
se(buffer[eu+1]<1000)
{
número[eu/8]=núm[eu/8]<<1;
}
outro
{
número[eu/8]=núm[eu/8]<<1;
número[eu/8]|=0x01;
}
}
}
/* FIM DO CÓDIGO DE USUÁRIO 0 */
/**
* @brief O ponto de entrada do aplicativo.
* @retvalint
*/
int main(vazio)
{
/* CÓDIGO DE USUÁRIO COMEÇO 1 */
char printbuff[128]={0};
número de caractere[4]={0};
chave de caractere = 0;
/* FIM DO CÓDIGO DE USUÁRIO 1 */
/* Configuração do MCU——————————————————–*/
/* Reinicialização de todos os periféricos, Inicializa a interface Flash e o Systick. */
HAL_Init();
/* CÓDIGO DE USUÁRIO COMEÇAR Inicialização */
/* CÓDIGO USUÁRIO FIM Inicialização */
/* Configurar o relógio do sistema */
SystemClock_Config();
/* CÓDIGO DE USUÁRIO COMEÇA SysInit */
/* CÓDIGO DE USUÁRIO FIM SysInit */
/* Inicialize todos os periféricos configurados */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* CÓDIGO DE USUÁRIO COMEÇO 2 */
/* FIM DO CÓDIGO DE USUÁRIO 2 */
/* Ciclo infinito */
/* CÓDIGO DE USUÁRIO COMEÇA ENQUANTO */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pino);
HAL_TIM_Base_Start_IT(&htim4);//A atualização do temporizador gera uma interrupção
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);//
enquanto (1)
{
se(rcvFalg)
{
para(int eu = 0;eu<4;eu++)
{
bitBuffer2num(número);
sprintf(printbuff,”0xx “,número[eu]);
HAL_UART_Transmitir(&huart1,printbuff,tensão(printbuff),HAL_MAX_DELAY);
}
// sprintf(printbuff,”%você “,buffer[eu]);
// HAL_UART_Transmitir(&huart1,printbuff,tensão(printbuff),HAL_MAX_DELAY);
// }
HAL_UART_Transmitir(&huart1,”\r\n”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
printf(“%d\r\n”,número[3]);
se(número[3]==157)
{
printf(“111111\r\n”);
}
HAL_Atraso(1000);
/* CÓDIGO DE USUÁRIO FIM ENQUANTO */
/* CÓDIGO DE USUÁRIO COMEÇO 3 */
}
/* FIM DO CÓDIGO DE USUÁRIO 3 */
}
/**
* Configuração do relógio do sistema @brief
* @retval Nenhum
*/
vazio SystemClock_Config(vazio)
{
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









