Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:1 Медали: 1
Ну математику то не нае@ёшь Просто приводите целое значение, принятое с датчика, к типу с плавающей точкой и тупо делите на 16.0. И всё. Этот алгоритм не изменится от установленной битности. От неё просто будет зависеть разрешение температуры и время преобразования.
Ну математику то не нае@ёшь Просто приводите целое значение, принятое с датчика, к типу с плавающей точкой и тупо делите на 16.0. И всё.
мда, математику я профукал в свое время... (( Что же выходит, при любом разрешении 9,10,11,12, бит полученное число всего лишь нужно разделить 16.0. В таком случае битность по сути влияет только на время преобразования датчиком данных Т. БОЛЬШОЕ КОТЯЧЬЕ СПАСИБО! , жаль нет смайлика с колбасой ))
и да, заметил, если брать целое значение (без сдвига) и /16,0, то показания постоянно плавают в пределах 0,1 гр. С , это и есть тот 0 разряд который нада игнорить в моем 11 разр. разрешении, что б показания были более стабильны. Выбор за нами!
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
загадочный вопрос... данные вы получаете в виде дополнительного кода в долях градуса, по умолчанию - в 1/16-ых долях градуса. т.е. если вам нужно просто целое число градусов, надо полученный результат поделить на 16. если делить в формате float, то получится правильное дробное число градусов.
какой перевод данных имеете в виду вы?
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Пацаны,кто знает,пожалста подскажите как правильно формировать временные интервалы для чтения температуры с 2-х DS18B20.. У меня иногда проскакивает -99%С ,т.е -9999(функция чтения при ошибке возвращает это значение). Вывожу на 2 4-х разрядных 7-ми сегментника. В Протеусе вроде всё в норме,а в железе -99 вылазит. Я так понимаю,что программа не вовремя читает результаты преобразования. Повозился с этим изрядно. Ранее вывод на индикаторы тактировался от 0-го таймера--выскакивало чаще. Переделал на 1й таймер --выскакивает реже,но... ВЫСКАКИВАЕТ И ВСЁ ТУТ!!!... Прога писана в CV AVR для меги8,калибровка тактовой частоты внутренняя на 8 МГц. Используется библиотека ds18b20.h.
P.S. Для нормального отображения в Протеусе в файле prj. надо РАСкоментировать строки: "для индикаторов без ключей", а строки :"для индикаторов с ключами" наоборот ЗАкоментировать.В железе катоды индикатров подключены через ключи на полевиках ,а в Протеусе транзисторные ключи у меня почему-то не работают.
имхо "виновата" родная библиотека 1wire CV - там сделаны задержки программно, прерывания индикации нарушают длительность этих задержек. Решение проблемы: 1) использовать свою "хитрую" библиотеку 1wire 2) использовать для индикации внешний драйвер, например STLED316
У меня иногда проскакивает -99%С ,т.е -9999(функция чтения при ошибке возвращает это значение)
в этой фразе содержится подсказка, как следует поступать ПРАВИЛЬНО.
следует анализировать результат функции и НЕ ОБНОВЛЯТЬ показания при ошибке, т.е. оставлять старые, корректные показания. это не решит проблему с кривоватым 1-wire, но для термометра полностью решит проблему с индикацией.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
w1_write(0x44);//команда начать преобразование delay_us(800); //задержка для завершения преобразования w1_write(0xbe);//команда чтение памяти датчика temp1=ds18b20_temperature(&rom_code[0][0]); // читаем данные с 1-го датчика temp2=ds18b20_temperature(&rom_code[1][0]); // читаем данные со 2-го датчика
наверное надо вместо delay_us(800) написать delay_ms(800)
Во блин!!...Спасибо за пинок.. И я не увидел Изменил на милисекунды и... ничего не дало А вот возвращать переменным в случае ошибки старое значение--идея замечательная,только как её реализовать--не пойму И ещё одно: когда температура отрицательная,ошибка вылазит чаще..
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
eduardo писал(а):
только как её реализовать--не пойму
А что там может быть непонятного ? Проверяем на ошибку, если есть - игнорируем результат измерения. Для обнаружения ошибки, лучше всего заюзать проверку CRC.
На хабре нашел такой код. То есть если откинуть 4 младших бита из LSB то не имеет разницы 9бит или 12 бит работает датчик? В смысле можно отдельно работать с дробной частью
Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4510 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
В 18B20 младшие 4 бита - дробное значение температуры. И без разницы, какое разрешение установлено. 4 бита - это 16. Отсюда, чтобы получить реальную температуру, значение нужно делить на 16. У 18(S)20 дробное значение - всего один младший бит. По этому мы делим только на 2, что является разрешением в 1/2 градуса.
зачем работать с температурой побайтно? датчик выдает два байта, которые имеют формат стандартного int для микроконтроллеров, т.е. это уже число со знаком. поместить эти 2 байта в int - это и вся проблема! а потом надо вспомнить о том, в каких долях градуса это число показывает температуру: DS18B20 по умолчанию выдает в 16-ых долях градуса, т.е. как бы в 16 раз больше, чем на самом деле (надо поделить на 16), а DS18S20 - в половинках градуса, т.е. в 2 раза больше (поделить на 2).
вот и все!
Код:
unsigned char buf[9]; // в этот буфер надо получить содержимое scratchpad-памяти датчика // обязательно все 9 байт, чтобы подсчитать CRC - далее работать только если CRC корректна! int *temperature = buf; // вот таким нехитрым способом мы имеем доступ к int-значению из буфера
// когда буфер получен и CRC корректна, вот так получаем КОРРЕКТНУЮ температуру в целых градусах: temp = *temperature / 16; // для DS18B20
// а вот так можно получить float с долями градуса: float temp_float = *temperature / 16.0;
и никакой мороки...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения