Споредба помеѓу PT100 Сензор за температура сонда и Модул DS18B20
1) Основен принцип на добивање сигнал
① Отпорот на PT100 се менува пропорционално со температурата (колку е повисока температурата, толку е поголем отпорот), но промената на отпорот е многу мала, за 0.385 Ох / степен;
② Опсегот на мерење на температурата на PT100 е -200℃ -200℃, и на 0℃, отпорот е точно еднаков на 100 Ох;
③ Работната струја на PT100 треба да биде помала од 5 Ма;
④ Иако отпорот на PT100 се менува пропорционално со температурата, неговата стапка на промена (односно, K вредност K вредност K вредност) се разликува во различни температурни опсези.
2) Табела за промена на отпорност на температура PT100
3. PT100 погонско коло
1) Преку методот на поделба на напонот, АД собира PT100 напон за да добие вредност на отпорот за да ја пресмета температурата
Вредноста на отпорот на PT100 во вода на собна температура (25℃25℃25℃) е за 109.89 Ох.
Микроконтролерот излегува напон од 3,3V, а напонот поделен со PT100 е приближно:
109.89 ∗ 0.005 = 0.54945 V
Вредноста на АД конвертирана според формулата за конверзија на АД е приближно:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682
Кога температурата ќе се зголеми за еден степен, под претпоставка дека отпорот на PT100 само се зголемува за 0.385 Ох, вредноста на промената на поделениот напон е приближно еднаква на:
0.385 ∗ 0.005 = 0.001925 V
Вредноста на АД конвертирана според формулата за конверзија на АД е приближно:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2
Во експериментот, констатирано е дека поради нестабилниот напон од 3,3V на напојувањето stm32, ADC собра 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,5V, и користи различни форми на пакување, правејќи го системското поставување флексибилно и практично. Поставената резолуција и температурата на алармот поставени од корисникот се зачувани во EEPROM и сè уште се зачувуваат по прекин на струја.
2) Вовед во работниот тајминг DS18B20
Сите уреди со една магистрала бараат строго време на сигналот за да се обезбеди интегритет на податоците. DS18B20 има 6 типови на сигнали: ресетирање на пулсот, пулс на одговор, пишуваат 0, пишуваат 1, прочитајте 0 и читај 1. Сите овие сигнали, освен пулсот на одговор, се синхрони сигнали испратени од домаќинот. И сите команди и податоци се испраќаат прво со нискиот бит од бајтот.
① Ресетирајте го пулсот и пулсот на одговор
Сите комуникации на единствената магистрала започнуваат со низа за иницијализација. Домаќинот емитува ниско ниво и го задржува ниското ниво најмалку 480 us за да генерира пулс за ресетирање. Потоа домаќинот го ослободува автобусот, а отпорникот за повлекување од 4,7K ја повлекува единечната магистрала високо, со време на доцнење од 15~60 us, и влегува во режим на примање (Rx). Потоа DS18B20 ја повлекува магистралата ниско за 60~240 us за да генерира пулс на одговор на ниско ниво.
② Запишете го времето
Времето за пишување вклучува пишување 0 тајмингот и пишувај 1 тајмингот. Сите тајминзи за пишување бараат најмалку 60 us, и потребно е најмалку 1 us време за обновување помеѓу две независни тајминзи за пишување. И двата тајминзи за пишување започнуваат со симнување на автобусот од домаќинот. Напиши 1 тајмингот: домаќинот излегува на ниско ниво, одложувања за 2 нас, а потоа го ослободува автобусот, одложување 60 us. Напиши 0 тајмингот: домаќинот излегува на ниско ниво, одложувања за 60 us, а потоа го ослободува автобусот со задоцнување од 2 нас.
③ Читање на времето
Уредите со една магистрала пренесуваат податоци до домаќинот само кога домаќинот издава тајминг за читање. Затоа, откако домаќинот ќе издаде команда за читање податоци, мора веднаш да се генерира тајминг за читање за да може робот да пренесува податоци. Сите тајминзи за читање бараат најмалку 60 us, и потребно е најмалку 1 us време за обновување помеѓу две независни тајминзи за читање. Секое време за читање е иницирано од домаќинот, што го спушта автобусот најмалку 1 ус. Домаќинот мора да ја ослободи магистралата за време на тајмингот за читање и да го проба статусот на автобусот во рок од 15 us по започнувањето на тајмингот. Типичниот процес на читање на времето е: домаќинот емитува доцнење на ниско ниво од 2 us, тогаш домаќинот се префрла на доцнење на режимот на внесување од 12 us, потоа го чита моменталното ниво на единечната магистрала, а потоа одложува 50 us.
По разбирањето на тајмингот на еден автобус, ајде да го разгледаме типичниот процес на отчитување на температурата на DS18B20. Типичниот процес на отчитување на температурата на DS18B20 е: ресетирање → испрати SKIPROM (0xCC) → испрати команда за конверзија (0x44) → одложување → ресетирање → испрати команда SKIPROM (0xCC) → команда за испраќање меморија (0xBE) → прочитајте два бајти податоци (т.е. температура) континуирано → крај.
3) Шематски дијаграм и CUBEMAX конфигурација
Од шематски дијаграм, може да се види дека DS18B20 е овозможено со PG11 портот да ја отвори сериската порта за да печати информации за температурата
4) Код дел
Кодниот дел ја трансплантира библиотеката ds18b20 на Zhengdian Atom и прави мали модификации
#ifndef __DS18B20_H
#дефинирајте __DS18B20_H
#вклучуваат “tim.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-портата */
/**********************************************************************************************/
/* Функција за работа на IO */
#дефинира DS18B20_DQ_OUT(x) направи{ 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); \
}додека(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(празнина);/* Добијте температура */
#endif
5. Инфрацрвен модул за далечински управувач
1) Протокол за кодирање на безжичен модул
Широко користените методи за кодирање за инфрацрвениот далечински управувач се: NEC протокол на PWM (модулација на ширина на пулсот) и RC-5 протокол на Philips PPM (модулација на позицијата на пулсот). Далечинскиот управувач што доаѓа со развојната табла го користи протоколот NEC, кој ги има следните карактеристики:
1. 8-битна адреса и 8-битна должина на инструкција;
2. Адресата и командата се пренесуваат двапати (за да се обезбеди сигурност);
3. Модулација на позицијата на пулсот PWM, при што работниот циклус на пренесениот инфрацрвен носач претставува “0” и “1”;
4. Фреквенцијата на носачот е 38 Khz;
5. Времето на бит е 1,125 ms или 2,25 ms;
Во протоколот NEC, како да ги поставите податоците во протоколот на ‘0’ или „1“? Еве, инфрацрвениот приемник и инфрацрвениот предавател се одвоени.
Инфрацрвен предавател: Испратете податоци од протоколот „0“ = 560 us на пренос на сигнал од носач + 560ние без пренос на сигнал од носител
Испратете податоци од протоколот „1“ = 560 us на пренос на сигнал од превозникот + 1680ние без пренос на сигнал од носител
Дефиницијата на битови на инфрацрвениот предавател е прикажана на сликата подолу
Инфрацрвен приемник: Примајте податоци за протоколот „0“ = ниско ниво од 560 us + 560ни на високо ниво
Примајте податоци за протоколот „1“ = 560 us ниско ниво + 1680ни на високо ниво
Форматот на податоци на командата за далечински управувач NEC е: терминал за синхронизација, код за адреса, обратен код на адресата, контролен код, контрола на инверзен код. Кодот за синхронизација се состои од ниско ниво од 9 ms и високо ниво од 4,5 ms. Кодот на адресата, обратен код на адресата, контролен код, и контролниот инверзен код се сите 8-битни формати на податоци. Тие се испраќаат по редослед на ниски бит прв и висок бит последен. Инверзната шифра се користи за да се зголеми веродостојноста на преносот.
Затоа, Влезното снимање може да се користи за мерење на ширината на пулсот на високо ниво за да се постигне декодирање на далечинскиот управувач.
2) Шематски дијаграм и CUBEMAX конфигурација
Од шематски дијаграм, можеме да видиме дека безжичниот модул е овозможен преку пинот PB9 и се собира преку 4 канали на TIM4:
Стандардниот пин на TIM4_CH4 не е PB9, затоа треба да се постави рачно, а истовремено се вклучува и поставката за прекин
3) Код дел
Снимајте го растечкиот раб преку функцијата за повратен повик tim
Во ова време, може да се добие декодираниот сигнал:
Во ова време, податоците се посложени и можат малку да се обработат:
Ефектот е како што следува:
Последните две цифри се декодираниот и неговиот инверзен код. Во ова време, може да се дефинира како макро за прилагодување на температурниот праг:
Ефектот е како што следува:
Код на инфрацрвен дел:
/* КОРИСНИЧКИ КОД BEGIN Заглавие */
/**
******************************************************************************
* @датотека : главен.в
* @кратко : Главното тело на програмата
******************************************************************************
* @внимание
*
* <h2><центар>&копирајте; Авторски права (в) 2024 STMicroelectronics.
* Сите права се задржани.</центар></h2>
*
* Оваа софтверска компонента е лиценцирана од ST под лиценца BSD 3-клаузула,
* на “Лиценца”; Не можете да ја користите оваа датотека освен во согласност со
* Лиценца. Може да добиете копија од лиценцата на:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* КОРИСНИЧКИ КОД КРАЈ Заглавие */
/* Вклучува ——————————————————————*/
#вклучуваат “главен.ч”
#вклучуваат “tim.h”
#вклучуваат “usart.h”
#вклучуваат “gpio.h”
/* Приватно вклучува ———————————————————-*/
/* КОРИСНИЧКИ КОД BEGIN Вклучува */
#вклучуваат “stdio.h”
#вклучуваат “низа.ч”
#дефинирајте MAXUP 157
#дефинирајте MAXDOWN 87
#дефинирајте MINUP 221
#дефинирај MINDOWN 61
/* КОРИСНИЧКИ КОД КРАЈ Вклучува */
/* Приватен типдеф ———————————————————–*/
/* КОРИСНИЧКИ КОД BEGIN PTD */
/* КОРИСНИЧКИ КОД КРАЈ PTD */
/* Приватно дефинирање ————————————————————*/
/* КОРИСНИК ЗА ПОЧЕТОК PD */
/* КОРИСНИЧКИ КОД КРАЈ PD */
/* Приватно макро ————————————————————-*/
/* КОРИСНИЧКИ КОД ПОЧНУВА PM */
/* КОРИСНИЧКИ КОД КРАЈ PM */
/* Приватни променливи ———————————————————*/
/* КОРИСНИЧКИ КОД BEGIN 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 */
/* Прототипови за приватна функција ———————————————–*/
неважечки SystemClock_Config(празнина);
/* КОРИСНИК ЗА ПОЧНУВАЊЕ PFP */
/* КОРИСНИЧКИ КОД КРАЈ PFP */
/* Приватен кориснички код ———————————————————*/
/* КОРИСНИЧКИ КОД ПОЧНУВА 0 */
неважечки HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
upCount++;
}
неважечки 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)
{
bufferId=0;
тампон[bufferId++]= ширина;
}
друго ако(bufferId>0)
{
тампон[bufferId++]= ширина;
ако(bufferId>32)
{
rcvFalg=1;
bufferId=0;
}
}
}
}
неважечки bitBuffer2num(знак бр[])
{
број[0]=0;
број[1]=0;
број[2]=0;
број[3]=0;
за(int i=0;јас<32;јас++)
{
ако(тампон[јас+1]<1000)
{
број[i/8]= број[i/8]<<1;
}
друго
{
број[i/8]= број[i/8]<<1;
број[i/8]|=0x01;
}
}
}
/* КОРИСНИЧКИ КОД КРАЈ 0 */
/**
* @brief Влезна точка на апликацијата.
* @retval инт
*/
int main(празнина)
{
/* КОРИСНИЧКИ КОД ПОЧНУВА 1 */
char printbuff[128]={0};
знак бр[4]={0};
клуч char=0;
/* КОРИСНИЧКИ КОД КРАЈ 1 */
/* Конфигурација на MCU——————————————————–*/
/* Ресетирање на сите периферни уреди, Ги иницијализира Flash интерфејсот и Systick. */
HAL_Init();
/* КОРИСНИЧКИ КОД ПОЧЕТОК Init */
/* КОРИСНИЧКИ КОД КРАЈ Инит */
/* Конфигурирајте го системскиот часовник */
SystemClock_Config();
/* КОРИСНИЧКИ КОД ЗАПОЧНУВА SysInit */
/* КОРИСНИЧКИ КОД КРАЈ SysInit */
/* Иницијализирајте ги сите конфигурирани периферни уреди */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* КОРИСНИЧКИ КОД ПОЧНУВА 2 */
/* КОРИСНИЧКИ КОД КРАЈ 2 */
/* Бесконечна јамка */
/* КОРИСНИЧКИ КОД ЗАПОЧНУВА ДОДЕКА */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
HAL_TIM_Base_Start_IT(&htim4);//Ажурирањето на тајмерот генерира прекин
HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_4);//
додека (1)
{
ако(rcvFalg)
{
за(int i=0;јас<4;јас++)
{
bitBuffer2num(број);
спринтф(отпечаток,”0xx “,број[јас]);
HAL_UART_Transmit(&huart1, отпечаток,стрин(отпечаток),HAL_MAX_DELAY);
}
// спринтф(отпечаток,”%u “,тампон[јас]);
// HAL_UART_Transmit(&huart1, отпечаток,стрин(отпечаток),HAL_MAX_DELAY);
// }
HAL_UART_Transmit(&huart1,”\rn”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
printf(“%drn”,број[3]);
ако(број[3]==157)
{
printf(“111111\rn”);
}
HAL_Доцнење(1000);
/* КОРИСНИЧКИ КОД ЗАВРШУВА ДОДЕКА */
/* КОРИСНИЧКИ КОД ПОЧНУВА 3 */
}
/* КОРИСНИЧКИ КОД КРАЈ 3 */
}
/**
* @brief Конфигурација на системски часовник
* @retval Никој
*/
неважечки 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









