Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Программная инженерия > Микроконтроллеры, робототехника, схемотехника, 3D принтеры
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2021, 20:36   #1
Roberttt
Пользователь
 
Регистрация: 30.05.2018
Сообщений: 56
По умолчанию DS18B20 показывает неправильную температуру

Здравствуйте! Датчик ds18b20 почему-то показывает комнатную температуру 273 °С. Кто-то может сказать, в чем может быть причина?
Roberttt вне форума Ответить с цитированием
Старый 10.09.2021, 22:28   #2
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Если +273,15 Кельвина, то понятно, что это 0 градусов Цельсия.
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Старый 10.09.2021, 22:32   #3
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

В общем случае причин может быть масса. От "левого" датчика до ошибок в программе и т.д. Нужны подробности.
Streletz вне форума Ответить с цитированием
Старый 10.09.2021, 23:25   #4
Roberttt
Пользователь
 
Регистрация: 30.05.2018
Сообщений: 56
По умолчанию

Вот исходник. Вроде, все понятно до функции с переводом температуры Read_Temperature(), а ее я просто скопировал. Поэтому, наверно, все деле в переводе температуры.

Код:
#include "stm32f4xx.h"
#include "DS18B20.h"

void Init_TIM2(void);
void Delay(uint32_t delay);
void DS18B20_Init_GPIO(void);
void DS18B20_Reset(void);
uint16_t Get_Temperature(void);
void Write_Byte(uint8_t data);
void Write_Bit(uint8_t data);
uint8_t Read_Bit(void);
uint16_t Read_Temperature(void);


char string1[] = "DS18B20 Init";
char string2[] = "DS18B20 Not Init";


/*************************** Initialization TIM3 **********************************/
void Init_TIM2(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	TIM_TimeBaseInitTypeDef TIM2_Delay;

	TIM2_Delay.TIM_Prescaler 				= 16 - 1;
	TIM2_Delay.TIM_CounterMode			= TIM_CounterMode_Up;
	TIM2_Delay.TIM_Period 				= ZERO;
	TIM2_Delay.TIM_ClockDivision 			= TIM_CKD_DIV1;
	
	TIM_TimeBaseInit(TIM2, &TIM2_Delay);
	TIM_Cmd(TIM2, ENABLE);
}

/****************************** Delay in us ***************************************/
void Delay(uint32_t delay)
{
	TIM2->ARR = delay;
	TIM2->CNT = ZERO;
	while ( TIM2->CNT < delay ) {}
	TIM2->ARR = ZERO;
}

/************************** Initialization sensor *********************************/
void DS18B20_Init_GPIO(void)
{
	GPIO_InitTypeDef GPIO_Init_DS18B20;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
	
	// 50MHz output open-drain
	GPIO_Init_DS18B20.GPIO_Pin 		= GPIO_Pin_9;
	GPIO_Init_DS18B20.GPIO_Mode 	=GPIO_Mode_OUT;
	GPIO_Init_DS18B20.GPIO_Speed 	= GPIO_Speed_50MHz;
	GPIO_Init_DS18B20.GPIO_OType 	= GPIO_OType_OD;
	GPIO_Init_DS18B20.GPIO_PuPd  	= GPIO_PuPd_UP;
	
	GPIO_Init(GPIOB, &GPIO_Init_DS18B20);
}

 /***************************** Set resolution ************************************/
void DS18B20_Reset(void)
{
	GPIO_ResetBits(GPIOB, GPIO_Pin_9);
	Delay(DELAY_RESET);
	GPIO_SetBits(GPIOB, GPIO_Pin_9);
	Delay(DELAY_RESET);
}

/*
void DS18B20_Set_Resolution(void)
 {
	 DS18B20_Reset();
	 Write_Byte(SKIP_ROM);
	 Write_Byte(WRITE_SCRATCHPAD);
	 Write_Byte(TH_REGISTER);
	 Write_Byte(TL_REGISTER);
	 Write_Byte(DS18B20_Resolution_12_bit);
 }	
 */
 
/******************************* Get devider *************************************/
/*uint8_t Get_Devider(const DS18B20_RESOLUTION_t resolution)
{
	uint8_t devider;
	
	if (resolution == DS18B20_Resolution_9_bit) 
	{
		devider = 8;
	}
	else if (resolution == DS18B20_Resolution_10_bit)
	{
		devider = 4;
	}
	else if (resolution == DS18B20_Resolution_11_bit)
	{
		devider = 2;
	}
	else 
	{
		devider = 1;
	}
	
	return devider;
}
*/
/************************* Function get temprature ********************************/
uint16_t Get_Temperature(void)
{
	DS18B20_Reset();
	Write_Byte(SKIP_ROM);
	Write_Byte(CONVERT_T);
	Delay(DELAY_T_CONVERT);
	
	DS18B20_Reset();
	Write_Byte(SKIP_ROM);
	Write_Byte(READ_SCRATCHPAD);
	
	return Read_Temperature();
}

/*************************** Write bit/ Write byte **********************************/
void Write_Bit(uint8_t data)
{
	GPIO_ResetBits(GPIOB, GPIO_Pin_9);
	Delay(data ? DELAY_WRITE_1 : DELAY_WRITE_0);
	GPIO_SetBits(GPIOB, GPIO_Pin_9);
	Delay(data ? DELAY_WRITE_1_PAUSE : DELAY_WRITE_0_PAUSE);
}

void Write_Byte(uint8_t data)
{
	for (uint8_t i = 0; i < 8; i++)
	{
		Write_Bit(data >> i & 1);
		Delay(DELAY_RELAXTION); 
	}
}

/********************************** Read bit *****************************************/
uint8_t Read_Bit(void)
{
	uint8_t bit = 0;
	GPIO_ResetBits(GPIOB, GPIO_Pin_9);
	Delay(DELAY_READ_SLOT);
	GPIO_SetBits(GPIOB, GPIO_Pin_9);
	Delay(DELAY_BUS_RELAX);
	bit = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9);
	Delay(DELAY_READ_PAUSE);
	
	return bit;
}


/********************************** Read temperature *****************************************/
uint16_t Read_Temperature(void)
{
	uint16_t data = 0;
	
	for (uint8_t i = 0; i < 64; i++)
	{
		data += (uint16_t) Read_Bit() << i;
		Delay(DELAY_BUS_RELAX);
	}
	
	return data;
}
Roberttt вне форума Ответить с цитированием
Старый 11.09.2021, 02:44   #5
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Не нашел в Вашем коде опроса количества сенсоров на шине OneWire. Может быть я не заметил этот момент?
Но при этом пытаетесь прочитать температуру от 65-ти сенсоров.
И если верно понял, указываете Resolution 12 bits, соответственно при чтении где-то нужно указать задержку Conversion time равную 750ms.

P. S.
Посмотрите не плохой ман:
Link: Library 13- Reading temperature with Dallas DS18B20 on STM32F4
Возможно поможет разобраться.
I am not a wizard, I am just learning.

Последний раз редактировалось Desc; 11.09.2021 в 02:59. Причина: Добавил P. S.
Desc вне форума Ответить с цитированием
Старый 11.09.2021, 03:08   #6
Roberttt
Пользователь
 
Регистрация: 30.05.2018
Сообщений: 56
По умолчанию

Спасибо большое за ссылку! Не знал, что примеры от STM существуют.
Roberttt вне форума Ответить с цитированием
Старый 11.09.2021, 03:29   #7
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Так OneWire и DS18B20 разжеваная тема. Примеров море под различные МК.
И если столкнетесь, не путайте сенсоры DS18B20 с (DS1820 \ DS18S20).
Последний работает только в режиме разрядности 9 бит и погрешность ±0.5% соответственно.
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Греются ds18b20, нет ответа. Atmega328p NikEvgMaster Микроконтроллеры, робототехника, схемотехника, 3D принтеры 12 20.07.2021 15:20
Delphi7 и DS18B20 vodovoz Общие вопросы Delphi 1 09.04.2020 18:21
pager формирует неправильную ссылку адреса Schmidt_ich PHP 2 05.12.2013 18:02
НЕ показывает температуру жесткого диска zigiundovich Компьютерное железо 8 27.12.2012 09:09
Неправильную строки программы Vladi_88 Помощь студентам 0 23.04.2011 20:56