Andrey_Ch8 Опубликовано 14 июня, 2011 Поделиться Опубликовано 14 июня, 2011 (изменено) Увидел, темку в услугах и решил заняться чисто ради спортивного интереса. Но , то-ли наугад не получается то-ли тямы не хватает. мои алгоритм такои. 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 кое какои набросочек.... Изменено 14 июня, 2011 пользователем Andrey_Ch8 0 Не цитируите полностью предыдущее сообщение!!! Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 14 июня, 2011 Поделиться Опубликовано 14 июня, 2011 #define max(A, (((A) > () ? (A) : () #define min(A, (((A) < () ? (A) : () ................... ................... max_t = max(t1, t2); ................... ................... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Andrey_Ch8 Опубликовано 15 июня, 2011 Автор Поделиться Опубликовано 15 июня, 2011 Алекс, это все хорошо, но если мы в этом цикле нашли максимальную, а вследующем цикле измерения разность Т1 и Т2 будет меньше чем в предыдущем измерении, то-есть max_t следующая < max_t предыдущая, то сохранив max_t следующую получим значение не самои максимальнои температуры 0 Не цитируите полностью предыдущее сообщение!!! Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Alex Опубликовано 15 июня, 2011 Поделиться Опубликовано 15 июня, 2011 Ничего не понял... Как я понял, Вам нужно найти максимальное из двух значений. Я и привёл пример. то сохранив max_t следующую получим значение не самои максимальнои температурыА перед этим другое написАли:и если температура пошла на убыль то максимальное значение заменяется на новое, которое соответсвенно меньше 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Andrey_Ch8 Опубликовано 15 июня, 2011 Автор Поделиться Опубликовано 15 июня, 2011 Да, я сразу не обьяснил тоже.Вобщем, нужно измерять температуру, а при нажатии на кнопку выводить самое максимальное значение, какое только было. После нажатия кнопки значение можно сбрасывать и начинать сначала фиксацию максимума. 0 Не цитируите полностью предыдущее сообщение!!! Ссылка на комментарий Поделиться на другие сайты Поделиться
Andrey_Ch8 Опубликовано 15 июня, 2011 Автор Поделиться Опубликовано 15 июня, 2011 Разобрался, и зачем я только себе голову пудрил с нахождение двух температур? Вот что получилось 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 0 Не цитируите полностью предыдущее сообщение!!! Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 15 июня, 2011 Поделиться Опубликовано 15 июня, 2011 Да, всё верно. 2 температуры тут не нужно. Сравниваешь с максимальной и перезаписываешь её. Ещё осталось добавить обработку кнопки для сброса максимума. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Andrey_Ch8 Опубликовано 15 июня, 2011 Автор Поделиться Опубликовано 15 июня, 2011 Да у меня сеичас максимум не сбрасывается, есть идеи? 0 Не цитируите полностью предыдущее сообщение!!! Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 15 июня, 2011 Поделиться Опубликовано 15 июня, 2011 Обработать нажатие кнопки и сбросить переменную max_t. Думаю этого будет достаточно. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Andrey_Ch8 Опубликовано 15 июня, 2011 Автор Поделиться Опубликовано 15 июня, 2011 ну ладно, я хотел чтоб показывал пока нажата кнопка Спасибо, всем тему можно закрыть, если кому нужна схема спрошивкои абсолютно ненужного устроисва измерения температуры с выводом максимального значения пишите в личку 0 Не цитируите полностью предыдущее сообщение!!! Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 15 июня, 2011 Поделиться Опубликовано 15 июня, 2011 Вы его выложите сюда. Вдруг кому пригодится... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Andrey_Ch8 Опубликовано 15 июня, 2011 Автор Поделиться Опубликовано 15 июня, 2011 (изменено) Устроисво измерения температуры,с датчиком ds18b20, PIC контроллером с выводом на ЖК 16х2 и сохранением максимального результата. Максимальное значение температуры за время работы устроиства можно посмотреть нажав на кнопку, при этом максимальное значение сбросится и фиксация его начнется снова.Небольшие поправки и предложения принимаются. протеус max_temp.rar Изменено 15 июня, 2011 пользователем Andrey_Ch8 0 Не цитируите полностью предыдущее сообщение!!! Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 15 июня, 2011 Поделиться Опубликовано 15 июня, 2011 Можно сделать при коротком нажатии выводится максимум, а при долгом удержании (например 2-3 сек.) - сброс. Ну или двойное нажатие подряд - сброс. Это на засыпку, для развития серенького вещества 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Andrey_Ch8 Опубликовано 22 июня, 2011 Автор Поделиться Опубликовано 22 июня, 2011 (изменено) Таки сделал. спешу поделиться положительным результатом.устроиство измерения температуры с сохранением и отображением максимального значения и минимального, при коротком и длинном (более 1сек)нажатии кнопки. Сброс записанных значений возложил на внешний сброс контроллера. 16f73+1990+ds.rarhex для загрузки в мк. Еще на схеме pic16f873, а в реале в железе pic16f73 но они идентичны должно работать и с тем и тем. Изменено 22 июня, 2011 пользователем Andrey_Ch8 0 Не цитируите полностью предыдущее сообщение!!! Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 22 июня, 2011 Поделиться Опубликовано 22 июня, 2011 Андрей, искрене поздравляю ! Помнится совсем не давно, месяцев несколько назад Вы только начинали программировать Так держать ! Успехов Вам ! 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Andrey_Ch8 Опубликовано 22 июня, 2011 Автор Поделиться Опубликовано 22 июня, 2011 Не без помощи вас и других участников форума, которые мне помогали) 0 Не цитируите полностью предыдущее сообщение!!! Ссылка на комментарий Поделиться на другие сайты Поделиться
Павел Царь Опубликовано 19 июня, 2014 Поделиться Опубликовано 19 июня, 2014 Привет всем. Подскажите плис имеется дело с подлюченым терморезистором к мк Атмега8, нужно както с него выводить показания температуры. Нашел сайт то что нужно http://aterlux.ru/index.php?page=article&art=ntcresistor#FORMULA1 НО тот готовый код не подходит к компилятолру Кодевисион АВР. Сам я не могу перевести/переписать тот код под АВРку, нехватает знаний, помогите чем сможите заточить тот код под АВРку и если хто сможет, объясните принцип вычисления температуры с той таблици, желательно на примере или подскажите свой вариант вывода температуры, выводится будет на семисегментник. Заранее спасибо. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 20 июня, 2014 Поделиться Опубликовано 20 июня, 2014 помогите чем сможите заточить тот код под АВРкуА там под что написано, не под АВР'ку разве ? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Павел Царь Опубликовано 20 июня, 2014 Поделиться Опубликовано 20 июня, 2014 (изменено) Извините, может не так написал. Там под WinAVR или AVR Studio точно не знаю, а мне под CVAVR. Объясните принцип преобразования хотябы, дальше я уж как то тогда сам буду писать. Как та температура высчитывается из той таблици , если можно то просто на примере, как для чайника на пальцах. Я б и сам все сделал бы, но у меня прога AVR Studio не работает, ошибку выбивает и теперь приходится работать с CVAVR-ом. Изменено 20 июня, 2014 пользователем Павел Царь 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 20 июня, 2014 Поделиться Опубликовано 20 июня, 2014 Вроде в cvavr заголовочные файлы по-другому называются, для расположения данных в ПЗУ не PROGMEM а flash (может с подчеркиваниями) что ли и процедура чтения оттуда не pgm_read_*() а чуть ли не напрямую присвоением можно (с cvavr дела не имел, это лишь то, что отложилось после чтения форума). Может, ошибаюсь, конечно, но алгоритм там довольно странный - строят таблицу зависимости значения АЦП от температуры, потом ищут в ней наиболее близкое значение и соответствующая температура выводится наружу. Логичнее строить таблицу температуры от АЦП, в ней и поиск быстрее, и аппроксимация проще. Только что таблицу придется по-своему рассчитывать. Или подобрать формулу, чтобы без таблиц обойтись, чуть точнее будет за счет потери скорости. 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
Павел Царь Опубликовано 20 июня, 2014 Поделиться Опубликовано 20 июня, 2014 Если можно, расскажите об этом подробнее ""Логичнее строить таблицу температуры от АЦП, в ней и поиск быстрее, и аппроксимация проще. Только что таблицу придется по-своему рассчитывать. Или подобрать формулу, чтобы без таблиц обойтись, чуть точнее будет за счет потери скорости."" 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 20 июня, 2014 Поделиться Опубликовано 20 июня, 2014 Что именно подробнее? Есть схема (термистор, стабилизатор тока, может, усилитель), преобразующая температуру в напряжение. Напряжение измеряется встроенным АЦП контроллера. Поскольку термистор используется полупроводниковый, да и схема преобразования не идеальна, график значений АЦП от температуры не будет линейным. Соответственно, строится таблица температур, соответствующих значениям АЦП 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 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
Павел Царь Опубликовано 20 июня, 2014 Поделиться Опубликовано 20 июня, 2014 Спасибо большое за разъяснение.У меня термистор подключен к АЦП микроконтроллера, преобразуя изменение сопротивление в напряжение по такой схеме : где Rа у меня 100кОм, а сам термистор при температуре 26 оС = 7кОм. Измерял сопротивление термистора при температуре 100 оС = 2кОм. ""Вопрос, потянет ли контроллер такие вычисления за разумное время. "" Время здесь не очень главное, так что можно попробовать сделать красивую зависимость температуры от измеренного напряжения. Если есть какие еще мысли по поводу этого всего буду очень признателен, спасибо. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 21 июня, 2014 Поделиться Опубликовано 21 июня, 2014 Раз в схеме предусмотрен вывод температуры, возможно имеет смысл временно вывести туда просто значения АЦП для построения графика хотя бы при нескольких температурах. Уверены, что такое соотношение резисторов идеально? То есть ток оно стабилизировать будет, спору нет, но ведь напряжение на входе АЦП всего 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 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
Павел Царь Опубликовано 21 июня, 2014 Поделиться Опубликовано 21 июня, 2014 (изменено) Соотношение резисторов я выбрал случайным образом, если надо то переделаем.Какое на ваше мнение будет идеальное соотношение резисторов и делать ли опорное напряжение? Как скажите так и сделаю. Точность желательно 0.1 измерения температуры.Если это возможно. Еще не сказал о датчике, он у меня с отрицательным температурным коэффициентом. Может лучше будет такая схема подключения: или оно не очень значимо? Сейчас у меня по этой схеме подключено. 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] Изменено 21 июня, 2014 пользователем Павел Царь 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.