Калибровка напряжения при измерении температуры
- Войдите на сайт для отправки комментариев
Добрый день коллеги! Вопрос изъезженный, но полного решения я все так и не нашел. Задача простая - измерять тепературу датчиком LM335. Сам скеч простой:
val = analogRead(lm335); // чтение voltage = val*5.0/1024; // перевод в вольты temp = voltage*100 - 273.15; // в градусы Цельсия
В формуле используется значение опорного напряжения 5.0, но по факту питание может колебаться, +- от 0.1 до 0.5В. А в градусах это порядка 6-8 цельсия. Это большая погрешность, т.к. задача стоит держать температуру 3 градуса и не больше и не меньше. Понимаю что тут нужно еще и мерить входное напряжение на ардуину. Сначала думал - впаять переменный резистор и им юстировать напряжение. Но если оно будет менятся, то этот вариант не пойдет. Смотрю схему с делителем, но не уверен что она даст то значение которе действительно будет, ведь на резисторе будет падать напряжение от исходного... Поэтому думаю над тем как мерить его правильно и подставлять значение в эту формулу. В
используйте вход AREF, в качестве источника резистор и стабилитрон, или кренка.
Сделайте опорное от внешнего источника TL431 вам в помощь
используйте вход AREF, в качестве источника резистор и стабилитрон, или кренка.
Т.е использовать функцию analogReference с параметром EXTERNAL и на aref подать питание?
А почему Вы просто программно не измерите напряжение питания? Если есть подозрение что питание не очень стабильно, то его можно хоть каждую секунду заново мерять. Там это можно сделать достаточно точно, если заранее точно измерить внутреннее опорное (оно от экземрляра микросхемы зависит и может быть 1,0-1,2 вольта).
Вы знаете как это делается или найти ссылку?
да, на aref подать опорное напряжение(которое всегда стабильно), например 4,3(чтобы ниже минимального) и соответрственно датчик не должен будет выдавать напряжение выше опорного
4,3В будут равны 1023
А почему Вы просто программно не измерите напряжение питания? Если есть подозрение что питание не очень стабильно, то его можно хоть каждую секунду заново мерять. Там это можно сделать достаточно точно, если заранее точно измерить внутреннее опорное (оно от экземрляра микросхемы зависит и может быть 1,0-1,2 вольта).
Вы знаете как это делается или найти ссылку?
От ссылки не откажусь конечно )) я попробовал установить Ref в режим Intrnal, но датчик то дает от 0 до 5 вольт, придется что-то еще допилить?
Забыл сказать что у меня Arduino Pro-Mini ))) Смотрю схему и не вижу вывода AREF )) Вижу что контакт процессора 20-й соединен с массой через кондер и все)
Тогда . Либо припаиваться к ноге либо делать стабильное питание ардуины черерез пин +5
да, на aref подать опорное напряжение(которое всегда стабильно), например 4,3(чтобы ниже минимального) и соответрственно датчик не должен будет выдавать напряжение выше опорного
4,3В будут равны 1023
Вы не поняли. Речь идёт не о том, чтобы подать всегда стабильное напряжение на Aref (его ещё надо где-то взять), а о том, чтобы измерить текущее напряжение питания и уже его (какое бы оно ни было) считать за 1023
Техника измерения текущего напряжения питания основана на том, что внутри контроллера есть источник опорного напряжения 1,1В. В реальности он от 1,0В до 1,2В и зависит от экземпляра микросхемы. Это опорное напряжение необходимо измерить для конкретного экземпляра (как это делается описано по ссылкам ниже) и забить константой (назовём Uреал). Оно стабильно по температуре и т.п. Единожды измерив, можно пользоваться. После этого можно измерять напряжение питания таким образом:
1. Используя напряжение питания в качестве Reference, и считая его пока 5В, программно измеряем опорное (это можно делать почти во всех ATMega'х и в большинстве ATTiny). То, что получилось назовём Uоп
2. Поскольку реальное опорное мы знаем, то из нашего измеренного можем посчитать настоящее напряжение питания. Оно будт равно 5В * Uреал / Uоп.
Собственно теперь мы знаем настоящее напряжение питания. Просто подставляем его вместо 5В в известную формулу и все дела.
Техника описана (с примерами кода)
1. Плохо, но по-русски
2. Хорошо, но по-английски. Здесь надо поиском по странице найти "Detecting low voltage"
Вот вам для Нанки (328p) функция getVcc(), старую не нашел, только сейчас новую накатал.
И пример программы для измерения напряжения, с использованием этой функции.
Измеряем на А3, пересчитываем с учетом правильного значения напряжения питания.
В программе все ясно? Все комментарии я писал на аглицком, уж простите. Задержку в 120 мкс только сейчас подобрал, без нее даже два измерения выдают мусор, при первом вызове. Если Вам время не критично, то еще больше можно делать, меньше - нельзя. Или вызывайте фунцию перед измерением своего сигнала - пару-тройку раз, для верности. ;)
калибровке, о которой написал Евгений, подлежит "магическое" число 1126 (==1.1*1024) в функции getVcc();
Если есть хороший прибор - его можно подогнать. Без подгонки у меня отличие от мультиметра в 4-ом знаке. Но и мультиметр надо сказать г... - китаец 838. У Вас датчик давления? Подгоняйте все в целом, по манометру. От колебаний питания мы с вами избавились моей функцией getVcc(). Температурные колебания меньше 0.01% на градус, забудьте.
А объяснить почему именно так:
А объяснить почему именно так:
читаем ОЧЕНЬ длинный диспут в теме "программирование 32-х разрядных..." в разделе "отвлеченные".
Читаем, запоминаем результат и НИЧЕГО из того матерного холивара сюда не несем.
По результату холивара - именно ЭТА формула самая точная. На этом в теме АЦП поставлена точка и возврат к этой теме приравнивается к измене Родине, Партии, Жене и всем любовницам сразу! ;)
===============
За сам вопрос - уже ставим на заметку по подозрению в попытке троллинга. ;) ;) ;)
А объяснить почему именно так:
читаем ОЧЕНЬ длинный диспут в теме "программирование 32-х разрядных..." в разделе "отвлеченные".
Читаем, запоминаем результат и НИЧЕГО из того матерного холивара сюда не несем.
По результату холивара - именно ЭТА формула самая точная. На этом в теме АЦП поставлена точка и возврат к этой теме приравнивается к измене Родине, Партии, Жене и всем любовницам сразу! ;)
===============
За сам вопрос - уже ставим на заметку по подозрению в попытке троллинга. ;) ;) ;)
Потому что отчет идет с 0 а не с 1 т.е 0-1023, а чисел(значений)то 1024
Да пофиг, если на аналоговый вход подать 5В, ацп выдаст 1023 (он никогда больше 1023 не пишет), и по формуле /1023 будет правильный результат, а вот по /1024 заниженый.
туда, туда...в ..... тему с холиваром. Там есть моя программа, моделирующая SAR ADC и делающая 10000 случайных измерений.
Вот ссылка на сообщение, там все есть. это холивар реально задолбал. Проверяйте программу, подбирайте формулы.
=====================
только дерьмо из той темы сюда не тащите, плз.!!!!!!
Воо! Похоже то что надо!)) Вот еще статейку нашел, как раз про 1024 там ))) и более подробно на пальцах расписано что и как )) http://robotclass.ru/tutorials/arduino_adc/
Спасибо всем! Буду пробовать)
А объяснить почему именно так:
читаем ОЧЕНЬ длинный диспут в теме "программирование 32-х разрядных..." в разделе "отвлеченные".
Читаем, запоминаем результат и НИЧЕГО из того матерного холивара сюда не несем.
По результату холивара - именно ЭТА формула самая точная. На этом в теме АЦП поставлена точка и возврат к этой теме приравнивается к измене Родине, Партии, Жене и всем любовницам сразу! ;)
===============
За сам вопрос - уже ставим на заметку по подозрению в попытке троллинга. ;) ;) ;)
Никакого троллинга! В той теме вопрос обсуждения наиболее правильной математики давно перерос в полный срач, так что даже не открываю
Лично мне не важна абсолютная точность, мне важна стабильность относительной точности
Сейчас вот упёрся с датчиком ina219 - выходит в измерениях на 800 попугает, а дальше не меряет, хотя ток растёт до ампера
скетч простой:
Платка с алиэкспресс, на резисторе шунта маркировка - 100
www.st.com/resource/en/application_note/cd00211314.pdf
Приведённая формула взята оттуда. От себя добавлю, что попытки "округлить" величину которая по своей природе всегда целочисленная похожи как если всех баб считать наполовину беременными, а чё по вероятности они же могут забеременить? Так и к результату ацп половину LSB добавлять, по теории вероятности правильно, только не применимо.
Чародей - лучше с датчиком INA219 помоги
На адафрутовском скетче и библиотеке заработало и показания вроде бы соответствующие. только скачут )))
Надо читать доку, а читалка что-то не воспринимает )))
Если питание датчика и AREF - объеденены в одну цепь, то вовсе не важно какое там будет напряжение :) Естественно как опорное использовать AREF, правильнее будет использовать не AnalogRead, а читать данные напрямую из портов ADC.
правильнее будет использовать не AnalogRead, а читать данные напрямую из портов ADC.
А разница в чём?
Делайте несколько измерений, вычисляйте среднее. Во время измерений по возможности ногами МК не трясти, особливо, если на них висит ощутимая нагрузка. По входу АЦП можно прикрутить простейший RC фильтр нижних частот.
Совет хороший, только датчик у него цифровой по I2C...
Совет хороший, только датчик у него цифровой по I2C...
Ага и у него уже встроено усреднение измерений, я о том как этим воспользоваться )))
ua6em У меня складывается впечатление, что вы угоняете чужой топик, и хотя ТС не топает ногами, но на других форумах за это обычно наказывают. Может перенести обсуждение 219-ой в новый трэд?
ua6em У меня складывается впечатление, что вы угоняете чужой топик, и хотя ТС не топает ногами, но на других форумах за это обычно наказывают. Может перенести обсуждение 219-ой в новый трэд?
В какой то мере пожалуй да, новый топик не заводил, спрашивал у DIMAX по этому датчику, ГУРУ молчат
Но по сути это не флуд, это информация расширяющая горизонты, наверняка же есть датчики в которых озвученная проблема уже решена )))