• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!
Andrey_Ch8

Алгоритм Измерения Температуры

40 сообщений в этой теме

Andrey_Ch8    1

Увидел, темку в услугах и решил заняться чисто ради спортивного интереса. Но , то-ли наугад не получается то-ли тямы не хватает.

мои алгоритм такои.

1 Измерим сохраним результат Т1

3 измерим сохраним Т2

4 если Т1>T2, то max_t = Т1

если Т2>T1, то max_t = T2

Вобщем максимальня температура фиксируется , но внутри цикла, и если температура пошла на убыль то максимальное значение заменяется на новое, которое соответсвенно меньше. короче, посоветуите что-нибудь по теме.

void main (void)
{
init();
while(1)
{
t1 = GetTemp();
Secunda;
t2 = GetTemp();

if(t1 > t2)
{ if(max_t < t1)
	{max_t = t1;}
   else
	break;
}
else
{ if(max_t < t2)
	{max_t = t2;}
   else
	break
}

while(knop)
{Bcd3Lcd(max_t);}



}//ewhile
}// emain

кое какои набросочек....

Изменено пользователем Andrey_Ch8

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
Alex    494
#define	max(A,	(((A) > () ? (A) : ()
#define	min(A,	(((A) < () ? (A) : ()

...................
...................

max_t = max(t1, t2);

...................
...................

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Andrey_Ch8    1

Алекс, это все хорошо, но если мы в этом цикле нашли максимальную, а вследующем цикле измерения разность Т1 и Т2 будет меньше чем в предыдущем измерении, то-есть max_t следующая < max_t предыдущая, то сохранив max_t следующую получим значение не самои максимальнои температуры:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    494

Ничего не понял... :unsure:

Как я понял, Вам нужно найти максимальное из двух значений. Я и привёл пример.

то сохранив max_t следующую получим значение не самои максимальнои температуры
А перед этим другое написАли:
и если температура пошла на убыль то максимальное значение заменяется на новое, которое соответсвенно меньше
:unsure:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Andrey_Ch8    1

Да, я сразу не обьяснил тоже.Вобщем, нужно измерять температуру, а при нажатии на кнопку выводить самое максимальное значение, какое только было. После нажатия кнопки значение можно сбрасывать и начинать сначала фиксацию максимума.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Andrey_Ch8    1

Разобрался, и зачем я только себе голову пудрил с нахождение двух температур?

Вот что получилось

void main (void)
{
init();
while(1)
{
t1 = GetTemp();
if(t1 > max_t)
{max_t = t1;}

while(KNOP)
{
LcdClear;
Bcd3Lcd(max_t);
DelayMs(250);DelayMs(250);
}
}//ewhile
}// emain

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    494

Да, всё верно. 2 температуры тут не нужно. Сравниваешь с максимальной и перезаписываешь её.

Ещё осталось добавить обработку кнопки для сброса максимума.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Andrey_Ch8    1

Да у меня сеичас максимум не сбрасывается, есть идеи?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    494

Обработать нажатие кнопки и сбросить переменную max_t. Думаю этого будет достаточно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Andrey_Ch8    1

ну ладно, я хотел чтоб показывал пока нажата кнопка:) Спасибо, всем тему можно закрыть, если кому нужна схема спрошивкои абсолютно ненужного устроисва измерения температуры с выводом максимального значения пишите в личку:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    494

Вы его выложите сюда. Вдруг кому пригодится...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Andrey_Ch8    1

Устроисво измерения температуры,с датчиком ds18b20, PIC контроллером с выводом на ЖК 16х2 и сохранением максимального результата. Максимальное значение температуры за время работы устроиства можно посмотреть нажав на кнопку, при этом максимальное значение сбросится и фиксация его начнется снова.Небольшие поправки и предложения принимаются.

1870702m.png

протеус max_temp.rar

Изменено пользователем Andrey_Ch8

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    494

Можно сделать при коротком нажатии выводится максимум, а при долгом удержании (например 2-3 сек.) - сброс. Ну или двойное нажатие подряд - сброс.

Это на засыпку, для развития серенького вещества :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Andrey_Ch8    1

Таки сделал. спешу поделиться положительным результатом.устроиство измерения температуры с сохранением и отображением максимального значения и минимального, при коротком и длинном (более 1сек)нажатии кнопки. Сброс записанных значений возложил на внешний сброс контроллера.

1507643m.png

16f73+1990+ds.rarhex для загрузки в мк.

Еще на схеме pic16f873, а в реале в железе pic16f73 но они идентичны должно работать и с тем и тем.

Изменено пользователем Andrey_Ch8

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    494

Андрей, искрене поздравляю !

Помнится совсем не давно, месяцев несколько назад Вы только начинали программировать :)

Так держать ! ;)

Успехов Вам ! :beach:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Andrey_Ch8    1

Не без помощи вас и других участников форума, которые мне помогали)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Привет всем. Подскажите плис имеется дело с подлюченым терморезистором к мк Атмега8, нужно както с него выводить показания температуры. Нашел сайт то что нужно http://aterlux.ru/index.php?page=article&art=ntcresistor#FORMULA1 НО тот готовый код не подходит к компилятолру Кодевисион АВР. Сам я не могу перевести/переписать тот код под АВРку, нехватает знаний, помогите чем сможите заточить тот код под АВРку и если хто сможет, объясните принцип вычисления температуры с той таблици, желательно на примере или подскажите свой вариант вывода температуры, выводится будет на семисегментник. Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    494
помогите чем сможите заточить тот код под АВРку
А там под что написано, не под АВР'ку разве ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Извините, может не так написал. Там под WinAVR или AVR Studio точно не знаю, а мне под CVAVR. Объясните принцип преобразования хотябы, дальше я уж как то тогда сам буду писать. Как та температура высчитывается из той таблици , если можно то просто на примере, как для чайника на пальцах.

Я б и сам все сделал бы, но у меня прога AVR Studio не работает, ошибку выбивает и теперь приходится работать с CVAVR-ом.

Изменено пользователем Павел Царь

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
COKPOWEHEU    248

Вроде в cvavr заголовочные файлы по-другому называются, для расположения данных в ПЗУ не PROGMEM а flash (может с подчеркиваниями) что ли и процедура чтения оттуда не pgm_read_*() а чуть ли не напрямую присвоением можно (с cvavr дела не имел, это лишь то, что отложилось после чтения форума).

Может, ошибаюсь, конечно, но алгоритм там довольно странный - строят таблицу зависимости значения АЦП от температуры, потом ищут в ней наиболее близкое значение и соответствующая температура выводится наружу. Логичнее строить таблицу температуры от АЦП, в ней и поиск быстрее, и аппроксимация проще. Только что таблицу придется по-своему рассчитывать. Или подобрать формулу, чтобы без таблиц обойтись, чуть точнее будет за счет потери скорости.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если можно, расскажите об этом подробнее ""Логичнее строить таблицу температуры от АЦП, в ней и поиск быстрее, и аппроксимация проще. Только что таблицу придется по-своему рассчитывать. Или подобрать формулу, чтобы без таблиц обойтись, чуть точнее будет за счет потери скорости.""

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
COKPOWEHEU    248

Что именно подробнее? Есть схема (термистор, стабилизатор тока, может, усилитель), преобразующая температуру в напряжение. Напряжение измеряется встроенным АЦП контроллера. Поскольку термистор используется полупроводниковый, да и схема преобразования не идеальна, график значений АЦП от температуры не будет линейным. Соответственно, строится таблица температур, соответствующих значениям АЦП 10, 20, 30, ... Таблицу придется либо строить, либо рассчитывать вручную. Зато потом берутся значения точек, наиболее близких к АЦП и усредняются. Например, значению 120 соответствует 30 градусов, значению 130 - 50 градусов, а 140 - 60 градусов. Реально же намеряно значение 121. Ближайшие значения - 120 и 130, которым соответствуют температуры 30 и 50 градусов. Тогда линейное приближение даст температуру ((121-120)*50+(130-121)*30)/(130-120) = 32 градусов. Разумеется, для контроллера проще делать шаг по значениям АЦП не 10, а степень двойки: 2, 4, 8, 16... но на суть это не влияет. Преимущество тут в том, что не надо искать наиболее похожее значение в таблице, достаточно одной операции целочисленного деления (лучше - сдвига, он быстрее). В примере, x=121, тогда x1=x/10 a x2=x1+1, то есть x1=12, x2=13, это и есть номера ячеек таблицы. В общем виде формула будет выглядеть как x1=x/N; x2=x1+1; T=((x-x1*N)*T2+(x2*N-x)*T1))/N; где N - шаг по значениям АЦП (в примере - 10), Т1,Т2 - температуры, соответствующие соседним ячейкам (в примере - 30 и 50 градусов).

Если же можно выделить красивую зависимость температуры от измеренного напряжения (или наоборот, что сложнее математически), например, T=x^2+sin(x)+5, то, зная измеренное значение АЦП(х), можно вычислить соответствующее значение температуры просто подставив в формулу. Вопрос, потянет ли контроллер такие вычисления за разумное время.

  • Одобряю 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо большое за разъяснение.У меня термистор подключен к АЦП микроконтроллера, преобразуя изменение сопротивление в напряжение по такой схеме :

ntc_a.png где Rа у меня 100кОм, а сам термистор при температуре 26 оС = 7кОм. Измерял сопротивление термистора при температуре 100 оС = 2кОм.

""Вопрос, потянет ли контроллер такие вычисления за разумное время. "" Время здесь не очень главное, так что можно попробовать сделать красивую зависимость температуры от измеренного напряжения.

Если есть какие еще мысли по поводу этого всего буду очень признателен, спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
COKPOWEHEU    248

Раз в схеме предусмотрен вывод температуры, возможно имеет смысл временно вывести туда просто значения АЦП для построения графика хотя бы при нескольких температурах.

Уверены, что такое соотношение резисторов идеально? То есть ток оно стабилизировать будет, спору нет, но ведь напряжение на входе АЦП всего 0,2-0,3 В (при Uo=5В), точность потеряете. Если уж все равно термистор компенсировать, можно и стабилизатор заодно. С другой стороны зависит от того, какая точность нужна.

сам термистор при температуре 26 оС = 7кОм. Измерял сопротивление термистора при температуре 100 оС = 2кОм
Ну для линейного приближения этого хватит: T=131.7-0.808*x, если Uo=5В, Uref=2.56В, 10-разрядный АЦП. Но, учитывая, что АЦП работает в диапазоне 40-130 из 1024 (это 9% шкалы) и нелинейности самого измерителя, особой точности это не даст.

В Вашей статье таблицу строили исходя из известной зависимости сопротивления термистора от температуры.

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Соотношение резисторов я выбрал случайным образом, если надо то переделаем.Какое на ваше мнение будет идеальное соотношение резисторов и делать ли опорное напряжение? Как скажите так и сделаю.

Точность желательно 0.1 измерения температуры.Если это возможно.

Еще не сказал о датчике, он у меня с отрицательным температурным коэффициентом. Может лучше будет такая схема подключения:

ntc_c.png

или оно не очень значимо?

Сейчас у меня по этой схеме подключено. Ra=3.3 кОм Выбрал внутренний ион от мк Uref=2.56В.

Вот пока что весь такой мой код, пробую выводить хоть какую нибуть температуру.

[size=5]#include <mega8.h>
#include <delay.h>
#define ADC_VREF_TYPE 0xC0

int v, m;
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);									 // опорное напряжение внутрение
// Delay needed for the stabilization of the ADC input voltage				 // 2.5в
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
//return ADCW;
return v=ADCW;
}
static flash unsigned char digit [ ] = {
 (0b11000000),										 // 0
 (0b11111001),										 // 1
 (0b10100100),										 //	 2
 (0b10110000),										 //	 3
 (0b10011001),										 //	 4										 //масив неизменный, записан во флеш память мк
 (0b10010010),										 //	 5
 (0b10000010),										 //	 6
 (0b11111000),										 //	 7
 (0b10000000),									 //	 8
 (0b10010000),										 //	 9
};

void ind_volt (unsigned int volt)	 {								 // функция вывода цифр на 7сегмент, 4разряда
unsigned char desatki=0, sotni=0, tysjachni=0;
while(volt>=1000) {
volt-=1000;
tysjachni++;
}
while(volt>=100) {
volt-=100;
sotni++;
}
while(volt>=10) {
volt-=10;
desatki++;
}

PORTC.2=1;
PORTB= digit [tysjachni];														 //функция 2
delay_us(1000);
PORTC.2=0;
]PORTC.3=1;
PORTB= digit [sotni];														 //функция 2

delay_us(1000);
PORTC.3=0;
PORTC.4=1;
PORTB= digit [desatki];
PORTB.7=0;
delay_us(1000);
PORTC.4=0;
PORTC.5=1;
PORTB= digit [volt];
//PORTD.7=c;
delay_us(1000);
PORTC.5=0;

void main(void)
{
PORTB=0xFF;
DDRB=0xFF;
PORTC=0b00000000;
DDRC=0b00111100;


// ADC Clock frequency: 125.000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x86;

while (1)
 {
 read_adc(0); // читаем напряжение с ножки ПЦ.0
m=((v-500)*30/10); // высчитываем температуру от 30 до 40 градусов
ind_volt (m); // выводим на семисегментник

}
}[/size]
Изменено пользователем Павел Царь

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас