Перейти к содержанию

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


Рекомендуемые сообщения

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

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

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

Не цитируите полностью предыдущее сообщение!!!

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

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

Не цитируите полностью предыдущее сообщение!!!

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

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

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

Не цитируите полностью предыдущее сообщение!!!

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

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

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

Не цитируите полностью предыдущее сообщение!!!

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

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

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

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

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

Не цитируите полностью предыдущее сообщение!!!

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

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

1870702m.png

протеус max_temp.rar

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

Не цитируите полностью предыдущее сообщение!!!

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

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

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

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

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

1507643m.png

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

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

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

Не цитируите полностью предыдущее сообщение!!!

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

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

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

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

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

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

  • 2 года спустя...

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

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

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

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

Изменено пользователем Павел Царь
Ссылка на комментарий
Поделиться на другие сайты

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

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

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

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

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

Что именно подробнее? Есть схема (термистор, стабилизатор тока, может, усилитель), преобразующая температуру в напряжение. Напряжение измеряется встроенным АЦП контроллера. Поскольку термистор используется полупроводниковый, да и схема преобразования не идеальна, график значений АЦП от температуры не будет линейным. Соответственно, строится таблица температур, соответствующих значениям АЦП 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, то, зная измеренное значение АЦП(х), можно вычислить соответствующее значение температуры просто подставив в формулу. Вопрос, потянет ли контроллер такие вычисления за разумное время.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

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

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

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

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

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

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

Уверены, что такое соотношение резисторов идеально? То есть ток оно стабилизировать будет, спору нет, но ведь напряжение на входе АЦП всего 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% шкалы) и нелинейности самого измерителя, особой точности это не даст.

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

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

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

Точность желательно 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]
Изменено пользователем Павел Царь
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Я в ходе отладки выяснил, что сбоит в функции:  void w25qWritingByUSB(uint32_t dpagenum, uint8_t *bufByUSB) При чем поведение очень странное. Отладочные сообщения даже не выводятся в начале функции. В ходе экспериментов понял что связано это с объявлением массивов и решил объявить большие буферы которые на 4КБ и 0.25КБ: uint8_t current_sector_buf[4096]; uint8_t buf[256]; глобально. В оригинале, буферы объявлялись локально в функции. После изменения буквально двух строчек кода, все заработало. Также, в оригинальном проекте было сильно напутано из функциями. Я решил функции выкинуть из main.c и вставить в w25q.c Эти функции: void w25qEraseSector(uint16_t sector) void w25qWritingByUSB(uint32_t dpagenum, uint8_t *bufByUSB) Поиск данной проблемы реально отобрало кучу времени. На будущее буду знать что и такое бывает...
    • есть готовый  драйвер BTS7960 до 43А (долговременно до 10) с шим и все, что нужно и стоит недорого. И не надо изобретать  велосипед. Даже с учетом завышения параметров  уж 5А свободно.
    • А есть внятное описание этого M18? По моему он не очень "интегирируется" с микроконтроллером, да и нужно ли? По схеме выше - подключить его к U1C, выход U1C кинуть на +С12, U1D вообще выкинуть вместе с D1,D2 и R13.
    • Прежде чем сломя голову что-либо менять, следует задуматься о причинах выхода этого "чего-либо" из строя. В противном случае замененное отправится протоптанной тропой своих предшественников. Защитной лампой пользоваться умеете? Вот на нее и заменяйте для начала.
    • Это обрывные резисторы в роли предохранителей. Номинал на последнем фото похож на 470 Ом (желтый-фиолетовый-коричневый-золотой, если цвета правильно разглядел), но это многовато, вот 47 Ом - похоже на правду. Можно ставить в достаточно широком диапазоне, другое дело, что горят они не просто так. Скорее всего дальше где-то косяк. А мультиметром измеряли сопротивление? Что показывает?
    • Откуда радиолюбителям знать, что такое ошибка 56 беговой дорожки Kettler S6.
    • Для такого патчер - слишком круто.
×
×
  • Создать...