Сравнение между Датчик температуры PT100 зонд и Модуль DS18B20
1) Основной принцип получения сигнала
① Сопротивление PT100 изменяется пропорционально с температурой (Чем выше температура, Чем больше сопротивление), Но изменение сопротивления очень мало, о 0.385 Ой / степень;
② Диапазон измерения температуры PT100 составляет -200 ℃ -200 ℃., и при 0℃, сопротивление в точности равно 100 Ой;
③ Рабочий ток PT100 должен быть меньше 5 мА;
④ Хотя сопротивление PT100 изменяется пропорционально температуре, скорость его изменения (то есть, Значение K Значение K Значение K) отличается в разных температурных диапазонах.
2) Таблица изменения температурной сопротивления PT100
3. Схема привода PT100
1) По методу деления напряжения, AD собирает напряжение PT100, чтобы получить значение сопротивления для расчета температуры.
Значение сопротивления PT100 в воде при комнатной температуре (25℃25℃25℃) речь идет о 109.89 Ой.
Микроконтроллер выдает напряжение 3,3 В., а напряжение, деленное на PT100, составляет примерно:
109.89 ∗ 0.005 = 0.54945 В
Значение AD, преобразованное по формуле преобразования AD, составляет приблизительно:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682
Когда температура поднимется на один градус, предполагая, что сопротивление PT100 просто возрастает на 0.385 Ой, величина изменения разделенного напряжения примерно равна:
0.385 ∗ 0.005 = 0.001925 В
Значение AD, преобразованное по формуле преобразования AD, составляет приблизительно:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2
В эксперименте, выяснилось, что из-за нестабильного напряжения 3,3В блока питания stm32, АЦП собирал колебания напряжения PT100, и ошибка деления напряжения была большой. Оптимизирующее решение заключается в разработке схемы источника постоянного тока.. Путем сбора напряжения PT100 и тока источника постоянного тока, сопротивление PT100 можно получить, и тогда можно получить значение температуры.
2) Схема источника постоянного тока на основе LDO-регулятора (MD5333)
В Интернете есть множество схем управления для тестирования PT100., например, мостовая схема постоянного тока, Схема источника постоянного тока на базе операционного усилителя, и т. д.. Автор также потратил немало времени на подбор схемы управления., учитывая сложность изготовления платы и количество компонентов, и, наконец, выбрал схему источника постоянного тока на основе LDO-регулятора. (MD5333). Принципиальная схема выглядит следующим образом:
В этот момент, выбор оборудования в основном завершен. В качестве платы разработки используется плата Zhengdian Atom F10ZET6 Elite Board.
Модуль DS18B20
Для проверки температуры в реальном времени и сравнения температур PT100., добавлен модуль DS18B20 для сравнительного теста калибровки
1) Знакомство с DS18B20
DS18B20 — это одношинный датчик температуры с диапазоном испытательных температур от -55 до +125 ℃ и точностью ± 0,5 ℃.. Полевая температура передается напрямую по одной цифровой шине., что значительно улучшает помехоустойчивость системы. Он может напрямую считывать измеренную температуру, и может реализовать метод считывания 9–12-битных цифровых значений посредством простого программирования в соответствии с фактическими требованиями.. Диапазон рабочего напряжения составляет 3 ~ 5,5 В., и использует различные формы упаковки, сделать настройку системы гибкой и удобной. Установленное разрешение и температура сигнализации, установленные пользователем, сохраняются в EEPROM и сохраняются даже после сбоя питания..
2) Введение в рабочее время DS18B20
Все устройства с одной шиной требуют строгой синхронизации сигнала для обеспечения целостности данных.. DS18B20 имеет 6 типы сигналов: импульс сброса, ответный импульс, писать 0, писать 1, читать 0 и читать 1. Все эти сигналы, кроме ответного импульса, являются синхронными сигналами, отправленными хостом. И все команды и данные отправляются сначала с младшим битом байта..
① Импульс сброса и импульс ответа
Все коммуникации по одной шине начинаются с последовательности инициализации.. Хост выводит низкий уровень и поддерживает низкий уровень в течение как минимум 480 мкс для генерации импульса сброса.. Затем ведущий отпускает автобус, а подтягивающий резистор 4,7 кОм поднимает одиночную шину на высокий уровень., с задержкой 15~60 мкс, и переходит в режим приема (прием). Затем DS18B20 понижает уровень шины на 60–240 мкс, чтобы сгенерировать ответный импульс низкого уровня..
② Время записи
Время записи включает запись 0 время и напиши 1 время. Для всех таймингов записи требуется не менее 60 мкс., и между двумя независимыми таймингами записи требуется не менее 1 мкс времени восстановления.. Оба тайминга записи начинаются с того, что хост отключает шину.. Писать 1 время: хост выдает низкий уровень, задержки на двоих, а затем отпускает автобус, задержка 60 мкс. Писать 0 время: хост выдает низкий уровень, задержки на 60 мкс, а затем отпускает шину с задержкой в 2us.
③ Чтение времени
Устройства с одной шиной передают данные хосту только тогда, когда хост выдает время чтения.. Поэтому, после того, как хост выдает команду чтения данных, время чтения должно быть сгенерировано немедленно, чтобы ведомое устройство могло передавать данные. Для всех таймингов чтения требуется не менее 60 мкс., и между двумя независимыми таймингами чтения требуется не менее 1 мкс времени восстановления.. Время каждого чтения инициируется хостом., который останавливает автобус как минимум на 1 мкс. Хост должен освободить шину во время отсчета времени чтения и проверить состояние шины в течение 15 мкс после начала отсчета времени.. Типичный процесс синхронизации чтения:: хост выводит задержку низкого уровня 2 мкс, затем хост переключается в режим ввода с задержкой 12 мкс., затем считывает текущий уровень одной шины, а затем задерживает 50 мкс.
После понимания времени одиночного автобуса, давайте посмотрим на типичный процесс считывания температуры DS18B20.. Типичный процесс считывания температуры DS18B20:: сброс → отправить СКИПРОМ (0хСС) → отправить команду начала преобразования (0х44) → задержка → сброс → отправить команду SKIPROM (0хСС) → отправить команду памяти (0xBE) → прочитать два байта данных (т.е.. температура) непрерывно → конец.
3) Принципиальная схема и конфигурация CUBEMAX
Из принципиальной схемы, видно, что DS18B20 включается портом PG11, чтобы открыть последовательный порт для печати информации о температуре.
4) Часть кода
Часть кода трансплантирует библиотеку ds18b20 Zhengdian Atom и вносит небольшие изменения.
#еслиndef __DS18B20_H
#определить __DS18B20_H
#включать “время.ч”
/***********************************************************************************/
/* Определение контакта DS18B20 */
#определить DS18B20_DQ_GPIO_PORT GPIOG
#определить DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#определить DS18B20_DQ_GPIO_CLK_ENABLE() делать{ __HAL_RCC_GPIOG_CLK_ENABLE(); }пока(0) /* Включение часов порта PG */
/**********************************************************************************************/
/* Функция операции ввода-вывода */
#определить DS18B20_DQ_OUT(х) делать{ х ? \
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); \
}пока(0) /* Выход порта данных */
#определить DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Входной порт данных */
uint8_t ds18b20_init(пустота); /* Инициализируйте DS18B20 */
uint8_t ds18b20_check(пустота); /* Проверьте, существует ли DS18B20 */
короткий ds18b20_get_temperature(пустота);/* Получить температуру */
#конец
5. Инфракрасный модуль дистанционного управления
1) Протокол кодирования беспроводного модуля
Широко используемые методы кодирования для инфракрасного дистанционного управления:: Протокол NEC ШИМ (широтно-импульсная модуляция) и протокол RC-5 Philips PPM (импульсно-позиционная модуляция). Пульт дистанционного управления, поставляемый в комплекте с платой разработки, использует протокол NEC., который имеет следующие особенности:
1. 8-битовый адрес и 8-битная длина инструкции;
2. Адрес и команда передаются дважды (для обеспечения надежности);
3. ШИМ-импульсная позиционная модуляция, при этом рабочий цикл передаваемой инфракрасной несущей представляет собой “0” и “1”;
4. Несущая частота 38 кГц.;
5. Битовое время составляет 1,125 мс или 2,25 мс.;
В протоколе NEC, как настроить данные в протоколе ‘0’ или «1»? Здесь, инфракрасный приемник и инфракрасный передатчик разделены.
Инфракрасный передатчик: Отправка данных протокола «0» = 560 мкс передачи несущего сигнала + 560у нас нет передачи сигнала несущей
Данные протокола отправки «1» = 560 мкс передачи несущего сигнала + 1680у нас нет передачи сигнала несущей
Разрядное определение инфракрасного передатчика показано на рисунке ниже.
Инфракрасный приемник: Получение данных протокола «0» = 560 мкс низкого уровня + 560мы на высоком уровне
Получение данных протокола «1» = низкий уровень 560 мкс. + 1680мы на высоком уровне
Формат данных команды дистанционного управления NEC:: терминал синхронизации, адресный код, обратный код адреса, контрольный код, управляющий обратный код. Код синхронизации состоит из низкого уровня 9 мс и высокого уровня 4,5 мс.. Код адреса, обратный код адреса, контрольный код, и обратный код управления — все 8-битные форматы данных.. Они отправляются в порядке младшего бита первым и старшего бита последним.. Обратный код используется для повышения надежности передачи..
Поэтому, захват входного сигнала может использоваться для измерения ширины импульса высокого уровня для обеспечения декодирования дистанционного управления..
2) Принципиальная схема и конфигурация CUBEMAX
Из принципиальной схемы, мы видим, что беспроводной модуль включается через контакт PB9 и собирает данные через контакт 4 каналы ТИМ4:
Вывод по умолчанию TIM4_CH4 не PB9., поэтому его нужно настроить вручную, и настройка прерывания включается одновременно
3) Часть кода
Захват нарастающего фронта с помощью функции обратного вызова tim
В это время, декодированный сигнал может быть получен:
В это время, данные более сложны и могут быть незначительно обработаны:
Эффект следующий:
Последние две цифры — это декодированный и его обратный код.. В это время, его можно определить как макрос для регулировки порога температуры:
Эффект следующий:
Код инфракрасной детали:
/* КОД ПОЛЬЗОВАТЕЛЯ BEGIN Заголовок */
/**
******************************************************************************
* @файл : main.c
* @краткий : Основное тело программы
******************************************************************************
* @внимание
*
* <ч2><центр>&копировать; Авторское право (с) 2024 СТМикроэлектроника.
* Все права защищены.</центр></ч2>
*
* Этот программный компонент лицензируется ST по лицензии BSD 3-Clause.,
* тот “Лицензия”; Вы не можете использовать этот файл, кроме как в соответствии с
* Лицензия. Вы можете получить копию Лицензии по адресу:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* КОД ПОЛЬЗОВАТЕЛЯ КОНЕЦ Заголовок */
/* Включает ——————————————————————*/
#включать “main.h”
#включать “время.ч”
#включать “usart.h”
#включать “gpio.h”
/* Частное включает в себя ———————————————————-*/
/* КОД ПОЛЬЗОВАТЕЛЯ BEGIN Включает */
#включать “stdio.h”
#включать “строка.h”
#определить MAXUP 157
#определить MAXDOWN 87
#определить MINUP 221
#определить РАЗУМ 61
/* КОНЕЦ КОДА ПОЛЬЗОВАТЕЛЯ Включает */
/* Частное определение типа ———————————————————–*/
/* КОД ПОЛЬЗОВАТЕЛЯ НАЧАТЬ PTD */
/* КОНЕЦ КОДА ПОЛЬЗОВАТЕЛЯ PTD */
/* Частное определение ————————————————————*/
/* КОД ПОЛЬЗОВАТЕЛЯ НАЧАТЬ PD */
/* КОД ПОЛЬЗОВАТЕЛЯ КОНЕЦ PD */
/* Частный макрос ————————————————————-*/
/* КОД ПОЛЬЗОВАТЕЛЯ НАЧАЛО PM */
/* КОД ПОЛЬЗОВАТЕЛЯ КОНЕЦ ПМ */
/* Частные переменные ———————————————————*/
/* КОД ПОЛЬЗОВАТЕЛЯ НАЧАТЬ PV */
uint32_t upCount=0;
uint16_t ValueUp=0;
uint16_t ValueDown=0;
uint8_t isUpCapt=1;
uint16_t ширина = 0;
буфер uint16_t[128]={0};
uint16_t bufferId=0;
uint8_t rcvFalg=0;
/* КОД ПОЛЬЗОВАТЕЛЯ КОНЕЦ PV */
/* Прототипы частных функций ———————————————–*/
void SystemClock_Config(пустота);
/* КОД ПОЛЬЗОВАТЕЛЯ НАЧАТЬ PFP */
/* КОД ПОЛЬЗОВАТЕЛЯ КОНЕЦ PFP */
/* Частный код пользователя ———————————————————*/
/* КОД ПОЛЬЗОВАТЕЛЯ НАЧАТЬ 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
upCount++;
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
если(isUpCapt)//Если это захват нарастающего фронта
{
ValueUp=HAL_TIM_ReadCapturedValue(хтим,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(хтим,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);
upCount=0;
}
еще{
ValueDown=HAL_TIM_ReadCapturedValue(хтим,TIM_CHANNEL_4);
isUpCapt=1;
__HAL_TIM_SET_CAPTUREPOLARITY(хтим,TIM_CHANNEL_4,TIM_ICPOLARITY_RISING);
ширина=ValueDown+upCount*65536-ValueUp;
если(ширина>4400&&ширина<4600)
{
идентификатор буфера=0;
буфер[идентификатор буфера++]= ширина;
}
еще если(идентификатор буфера>0)
{
буфер[идентификатор буфера++]= ширина;
если(идентификатор буфера>32)
{
rcvFalg=1;
идентификатор буфера=0;
}
}
}
}
недействительный битBuffer2num(номер символа[])
{
число[0]=0;
число[1]=0;
число[2]=0;
число[3]=0;
для(интервал я = 0;я<32;я++)
{
если(буфер[я +1]<1000)
{
число[я/8]=число[я/8]<<1;
}
еще
{
число[я/8]=число[я/8]<<1;
число[я/8]|=0x01;
}
}
}
/* КОНЕЦ КОДА ПОЛЬЗОВАТЕЛЯ 0 */
/**
* @brief Точка входа в приложение.
* @retval интервал
*/
int главный(пустота)
{
/* КОД ПОЛЬЗОВАТЕЛЯ НАЧАТЬ 1 */
char printbuff[128]={0};
номер символа[4]={0};
символьный ключ = 0;
/* КОНЕЦ КОДА ПОЛЬЗОВАТЕЛЯ 1 */
/* Конфигурация микроконтроллера——————————————————–*/
/* Сброс всех периферийных устройств, Инициализирует интерфейс Flash и Systick.. */
HAL_Init();
/* КОД ПОЛЬЗОВАТЕЛЯ НАЧАТЬ Инициировать */
/* КОД ПОЛЬЗОВАТЕЛЯ КОНЕЦ Инициал. */
/* Настройте системные часы */
SystemClock_Config();
/* КОД ПОЛЬЗОВАТЕЛЯ НАЧАТЬ SysInit */
/* КОД ПОЛЬЗОВАТЕЛЯ КОНЕЦ SysInit */
/* Инициализируйте все настроенные периферийные устройства */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* КОД ПОЛЬЗОВАТЕЛЯ НАЧАТЬ 2 */
/* КОНЕЦ КОДА ПОЛЬЗОВАТЕЛЯ 2 */
/* Бесконечный цикл */
/* КОД ПОЛЬЗОВАТЕЛЯ НАЧИНАЕТСЯ */
HAL_GPIO_TogglePin(LED0_GPIO_Порт,LED0_Pin);
HAL_TIM_Base_Start_IT(&htim4);//Обновление таймера генерирует прерывание
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);//
пока (1)
{
если(rcvFalg)
{
для(интервал я = 0;я<4;я++)
{
битбуфер2нум(число);
спринтф(Буфер печати,”0хx “,число[я]);
HAL_UART_Передача(&huart1,принтбуфф,стресс(Буфер печати),HAL_MAX_DELAY);
}
// спринтф(Буфер печати,”%ты “,буфер[я]);
// HAL_UART_Передача(&huart1,принтбуфф,стресс(Буфер печати),HAL_MAX_DELAY);
// }
HAL_UART_Передача(&хуарт1,”\рп”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
printf(“%дрп”,число[3]);
если(число[3]==157)
{
printf(“111111\рп”);
}
HAL_Delay(1000);
/* КОД ПОЛЬЗОВАТЕЛЯ ЗАВЕРШАЕТСЯ */
/* КОД ПОЛЬЗОВАТЕЛЯ НАЧАТЬ 3 */
}
/* КОНЕЦ КОДА ПОЛЬЗОВАТЕЛЯ 3 */
}
/**
* @brief Конфигурация системных часов
* @retval Нет
*/
void SystemClock_Config(пустота)
{
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









