Понедельник, 21.09.2020, 19:07
Микроконтроллерная техника AVR
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
Меню сайта
Помоги сайту
Поддержи наш сайт
Через WebMoney
U222865683087
R391933670808
Z877043628365
E649133782052

или пополни нашу SMS копилку
SMS.копилка

Ссылки

 Каталог статей
Главная » Статьи » Учимся работать с AVR

Получение от датчика DS18B20 точности в 0.1 градус.
Здраствуйте!
На радиотехничиских форумах я встречал много вопросов о том как заставить датчик DS18B20 выдавать температуру с точностью в 0.1 градус.
Предлагаю вашему вниманию пример термометра который позволяет показывать эту точность. Если немного посидеть над исходником можно еще и сделать терморегулятор, ну а пока схема и исходник:)


Нужно еще в параметрах датчика изменить шаг увеличения температуры с 1, на 0.1



Исходник:

#include <mega8.h>
// 1 Wire Bus functions
#asm
.equ __w1_port=0x15 ;PORTC
.equ __w1_bit=0
#endasm
#include <1wire.h>
// DS1820 Temperature Sensor functions
#include <ds18b20.h>
#include <delay.h>
// maximum number of DS1820 devices
// connected to the 1 Wire bus
#define MAX_DS18B20 8
// number of DS1820 devices
// connected to the 1 Wire bus
unsigned char ds18b20_devices;
// DS1820 devices ROM code storage area,
// 9 bytes are used for each device
// (see the w1_search function description in the help)
unsigned char ds18b20_rom_codes[MAX_DS18B20][9];

// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
#include <stdio.h>

// Declare your global variables here
float temper;
int temper_int,temper_fl,min=0;
unsigned long int temper_t;
char lcd_buffer[33];


void temperature(void) // функция по работе с термо-датчиком
{
temper=ds18b20_temperature(&ds18b20_rom_codes[0][0]);
temper_int=temper;
if(temper_int>1000) // при отрицательной температуре
{
temper_fl=(temper-temper_int)*10;
temper_t=(long)temper_int*10;
temper_t=temper_t+temper_fl;
temper_int=40960-temper_t;
min=1;
}else // при положительной
{
min=0;
temper_fl=(temper-temper_int)*10;
temper_int=(temper_int*10)+temper_fl;
}
}


void main(void)
{
// Determine the number of DS1820 devices
// connected to the 1 Wire bus
ds18b20_devices=w1_search(0xf0,ds18b20_rom_codes);
ds18b20_init(0,-35,35,DS18B20_12BIT_RES); // переключения термометра в 12 битный режим
// LCD module initialization
lcd_init(16);
while (1)
{
// Place your code here
delay_ms(500);
temperature(); // вызываем функцию температуры
lcd_clear(); // очищаем LCD
if(min==1)
{
sprintf(lcd_buffer,"t=-%i.%d\xdfC",temper_int/10,temper_int%10); //вывод отрицательной температуры
}else
{
sprintf(lcd_buffer,"t=+%i.%d\xdfC",temper_int/10,temper_int%10); // вывод положительной
}
lcd_puts(lcd_buffer); // вывод на дисплей
};
}


Категория: Учимся работать с AVR | Добавил: my-avr (28.05.2009)
Просмотров: 27094 | Комментарии: 10 | Рейтинг: 5.0/3 |
Всего комментариев: 10
0
10 Leon   [Материал]
Можно улучшить точность датчика, но только на определенном диапазоне ...как в данной статье http://www.adventx.com.ua/automation/article/ds18b20_precision/

0
9 Leon   [Материал]
Можно улучшить точность датчика, но только на определенном диапазоне ...как данной статье http://www.adventx.com.ua/automation/article/ds18b20_precision/

0
8 Alex   [Материал]
Драсте. Нельзя сделать точность 0.1 градус, потому как заявленная точность производителя этого датчика 0.5 градуса в диапазоне -10+85, за пределами этого диапазона еще хуже. А вот дискретность можно увеличить за счет увеличения разрешения конвертации, но увеличивается время конвертации. Максимальная дискретность 0.0625 при 12-битном разрешении. Так что не путайте понятия.

0
7 lameruga   [Материал]
Здесь неправильно написано для отрицательной температуры. Я сделал так

.......
// Declare your global variables here
float temper;
int temper_int,temper_fl,min=0;
unsigned long int temper_t;

void temperature(void) // функция по работе с термо-датчиком
{
temper=ds18b20_temperature(&ds18b20_rom_codes[0][0]);
temper_int=temper; // отбор целой части от температуры
if(temper<0) // при отрицательной температуре
{
temper_fl=(temper-temper_int-0.0625)*10; // дробная часть
temper_int=-((temper_int*10)+temper_fl); // температура*10
min=1; // минус
}else // при положительной
{
temper_fl=(temper-temper_int)*10; // дробная часть
temper_int=(temper_int*10)+temper_fl;// температура*10
min=0; // плюс
}

}
void main(void)
{
// Determine the number of DS1820 devices
// connected to the 1 Wire bus
ds18b20_devices=w1_search(0xf0,ds18b20_rom_codes);
ds18b20_init(0,-35,35,DS18B20_12BIT_RES); // переключения термометра в 12 битный режим

LcdInit(); // LCD module initialization

while (ds18b20_devices>0 )
{
// Place your code here
delay_ms(500);
temperature(); // вызываем функцию температуры
LcdClear(); // очищаем LCD
if(min==1) // если минус
{
sprintf(lcd_buf,"-%u.%u\x80C",temper_int/10,temper_int%10); //вывод отрицательной температуры
}else
{
sprintf(lcd_buf,"+%i.%d\x80C",temper_int/10,temper_int%10); // вывод положительной
}
LcdStringBold(1,2);// вывод на 3310Lcd
......
На Протеусе все нормально показывает.


0
6 ARD   [Материал]
А можно было сделать так?????????
long int temp;
temp=(ds18b20_temperature(&rom_code[i][0]))*10; //читаем температуру с выбранного датчика и умножаем на 10
if (temp>10000){ //если датчик выдаёт больше 10000
temp=40960-temp; //отнимаем от данных 40960
temp=-temp; //и ставим знак "минус"
}

lcd_clear(); //чистим дисплей перед выводом
sprintf(lcd_buffer,"t=%i.%u\xdfC",temp/10,(temp)%10); //пишем масив для экрана температуру
lcd_puts(lcd_buffer); //выводим масив на LCD
delay_ms(100);

0
5 Bogdan   [Материал]
Приветствую, есть вопрос, как ведет себя данный термометр "в железе"?
При симуляции в протеусе отрицательная температура отображается с "минусом" как перед целой частью, так и перед дробной.
http://sinerson.narod.ru/proteus_temp.JPG

0
4 страйкер   [Материал]
А, туплю. у них разные типы данных

0
3 страйкер   [Материал]
temper_int = temper;
if (temper_int > 1000) {
temper_fl = (temper - temper_int) * 10;

temper_fl будет всегда равна нулю? в чем смысл?


0
2 my-avr   [Материал]
да smile

1
1 Roma   [Материал]
Привет
// maximum number of DS1820 devices
// connected to the 1 Wire bus
#define MAX_DS18B20 8
это чё, возможность подключения 8 датчиков

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Copyright My-AVR © 2020
Наша кнопка
У нас появилась кнопка, код кнопки:

Лаборатория самоделок на микроконтроллерах AVR

Форма входа
Наш опрос
Какой МК вы используете?
Всего ответов: 3213
Статистика/Друзья
CY-PR.com



Онлайн всего: 1
Гостей: 1
Пользователей: 0

РадиоКОТ - популярно об электронике. Авторские схемы, новые разработки. Обучение по электронике, микроконтроллерам, ПЛИС. Форум Сайт по радиоэлектронике. У нас все просто и интересно… ARV Reserch: Электроника — просто, полезно, увлекательно. Электронные устройства и программные средства для радиолюбителей и профессионалов, только авторские разработки, плагиата нет! Разработки на заказ. AVR projects Создание электронных роботов своими руками Схемы и программы на AVR http://ur5yfv.ucoz.ua/BANNER.gif Блог начинающего эмбеддера. Дай волю паяльнику! Самоделки на all-make.ru Принципиальные схемы Модулі автозапуску бензогенератора та системи АВР, електромонтажні роботи
Хостинг от uCoz