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

Нелинейная Характеристика Аналогового Датчика


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

С каких это пор полиномы стали линейной зависимостью? Я про другое. Замеры очень плохо аппроксимируютя. Даже без расчетов видно, что замеры никуда не годятся. При изменении температуры от 97°С до 100°С сопротивление меняется от 5300ом до 3630ом, или на 46%. Слишком грубые замеры. Ничего далее с ними не получится.

А вообще, цель устройства какая? Предположим, температуру измерили. А дальше что?

post-166047-0-17968400-1442948385_thumb.jpg

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов 80
  • Создана
  • Последний ответ

Топ авторов темы

avv_rem, не лень Вам вот это всё делать ? :) Человек, очевидно, снимает замеры с большой погрешностью.

Мало того, ему нужна зависимость не сопротивления от температуры, а значения АЦП от последней, тем самым, за одно, свести к нулю погрешности остального "железа" между датчиком и контроллером.

И по замерам, правильный Вы совет дали - нужно опускать датчик с образцовым термометром в какую-нибудь среду и снимать показания при её медленном охлаждении. А не в горшки тыкать, рядом с китайским термометром :)

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

При изменении температуры от 97°С до 100°С сопротивление меняется от 5300ом до 3630ом,

удалите точку 97! у меня эта точка была на глаз.

не на глаз только вот эти точки:

3.63 kOm - 100гр

33.5 - 36.6

77.3 - 15.8

122 - 3 (и то тут не уверен, ибо поставил холодильник на 3 градуса и лежало всю ночь)

А вообще, цель устройства какая? Предположим, температуру измерили. А дальше что?

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

Вообще я для себя выбрал вот такой вариант: Кусочно-линейная аппроксимация

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

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

Тем те менее, таблицы, полиномы и графики теперь такие.

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

Со временем ты поймешь, что возможен только такой путь:

1. Прочитать код АЦП.

2. Сдвинуть прочитанный код вправо через флаг переноса. Оставить 9 разрядов кода.

3. Глядя на флаг переноса, округлить 9-разрядный код в нужную сторону.

4. Полученный код – это сразу номера строк в таблицах с семисегментными кодами индикаторов. Останется только прочитать три числа из трех таблиц длиной по 512 байтов каждая, и вывести их в порты, – зажечь три цифры на табло.

Таблицы будут подготовлены в Excel. В них будут учтены все нелинейности преобразования.

Теперь полиномы без комментариев.pdf

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

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

я уже это делал. В протеусе ставлю сопротивление датчика и гляжу какое напряжение в зависимости от моего делителя напряжения. Ну и понимаю какая температура какому напряжению а следовательно какому значению АЦП соответствует.

вот

правда это на пикбэйсике и тут линейная характеристика задана.

Со временем ты поймешь, что возможен только такой путь:

возможно, но как ты написал со временем =)))

Я про сдвиг то до сих пор не понимаю. Знаю как он работает и что делает. но не понимаю каково его практическое применение )

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

Сдвиг это быстрое умножение или деление на 2. Используется для быстрого умножения или деления на 2, либо для установки/снятия отдельных битов в числе, например, для настройки переферии: ADCSRA |= (1<<ADSC) выставляет бит с номером ADSC, то есть шестой, и эквивалентна ADCSRA = ADCSRA | 0b01000000;

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

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

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

А ну вот так гораздно понятнее а то урок смотрел так там про сдвиг объяснили минут 10 =))) да все понятно сдвигаем биты а зачем не объяснено =))) А почему биты не выставить вручную? больше 0 писать?

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

можно и вручную. Но кое кому читать удобнее сдвиг. По производительности разницы никакой. Я и так и так пишу. В некоторых случаях нагляднее логическая операция с байтом

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

В основном именно наглядность. Сравните записи ADCSRA |= 0b01000000 и ADCSRA |= (1<<ADSC). В первом случае идет запись какого-то магического чиселка (без даташита не разберешься), а во втором видно, что выставляется бит начала аналого-цифрового преобразования.

Кроме того, это немного лучше в плане переносимости кода, если соответствующий бит в новых контроллерах будет перемещен. То есть сейчас ADSC это 6 бит, а будет 4-м. Хотя это, конечно, маловероятно.

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

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

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

однако есть некоторые товарищи, считающие что запись ADCSRA |= (1<<6) выглядит так же читабельно. Однако от первого варианта она мало отличается, но выглядит по их мнению просто офигенски круто, патамушта сдвик рулит! :new_russian:

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Ну, некоторые могут писать и ADCSRA |= 0x40 или даже ADCSRA |= 64, считая, что исправлять это никогда не придется, а компилятор и так сожрет. Но не стоит брать с них пример!

Впрочем, запись PORTA |= (1<<6) не менее наглядна, чем PORTA |= _BV(PA5), хотя запись PORTA |= (1<<LED_RED) все-таки нагляднее, особенно если соответствует схеме и логике.

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

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

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

А вот так можно было написать программу, используя табличное преобразование. Числа, к стати, поставил реальные. Остается только откалибровать АЦП по двум точкам и скопировать колонки X, Y и Z в блокнот, а из него – в текстовый редактор ассемблера.

Вот интересно, сколько времени займет написание и отладка программы с кусочно-линейной интерполяцией? Какова будет погрешность расчетов? Каким будет в итоге размер программы? Каково время выполнения одного расчетного цикла? Хватит ли у контроллера ресурсов на динамическую индикацию?

В табличном методе время написания – один вечер с перекурами. Размер не более 2кБайт. Время одного цикла «расчета» – около 30 тактов процессора.

post-166047-0-98237100-1443132586_thumb.jpg

Термометр из контроллера.rar

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

Вот интересно, сколько времени займет написание и отладка программы с кусочно-линейной интерполяцией? Какова будет погрешность расчетов? Каким будет в итоге размер программы? Каково время выполнения одного расчетного цикла? Хватит ли у контроллера ресурсов на динамическую индикацию?

Не знаю все работает. скок тактов хз вот моя кусочно линейная интерполяция:

if( adc < 175 || adc > 897 )
					 return adc ;

			 if( adc >= 175 && adc <= 675 )
					 return (-130L*adc+125344)/1024 ; //уравнение от 36.6 до 100
			 if( adc >= 676 && adc <= 836 )
					 return (-132L*adc+126644)/1024; //уравнение от 15.8 до 36.6
			 if( adc >= 837 && adc <= 897 )
					 return (-211L*adc+192704)/1024 ; //уравнение от 15.8 до 3

Погрешность конечно зависит от количества КУСКОВ этой интерполяции=) у меня пока три ) планирую добавить еще два.

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

Я создавал таблицу под такую схему. У тебя насчитал Rд = 17573ом. Не самый оптимальный выбор. Под какой температурный диапазон датчик разгоняешь? От скольки до скольки градусов?

post-166047-0-85280600-1443230135.jpg

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

И вообще. Не следует путать интерполяцию с линеаризацией. Зачем, к примеру, к экспериментальным точкам привязываться? Я уже не первый раз твою таблицу выкладываю. Вот она, теперь для каждого кода АЦП вычислена. Бери, не мучайся. Только исходные данные в зеленых ячейках уточни. Кроме коэффициентов полинома, естественно. Полином заложил до восьмого порядка, если сам коэффициенты подобрать сможешь

И зачем на 1024 делить? Привязан к длине байта - аргумента? Если нет, то дели уж сразу на 65536, изменив коэффициенты. Все равно у тебя по поводу вычислительных ресурсов даже вопросов не возникает.

Интерполятор в помощь.rar

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

...Погрешность конечно зависит от количества КУСКОВ этой интерполяции=) у меня пока три ) планирую добавить еще два.

А чего мелочиться-то? Стандартом де-факто стало разбиение на 32 интервала. Я немного схитрил. За основу взял код 534, т.е. где функция имеет точку перегиба, а вторая производная равна нулю. Остальные точки отсчитал от нее так, чтобы на каждом интервале погрешность линеаризации не превысила 0,5°С. Т.е. сделал кусочно-линейную интерполяцию с переменным шагом.

На краях, все равно, придется использовать табличный метод. Кусочно-линейная интерполяция не прокатит, слишком мала точность АЦП.

В Excel-евском файле обрати внимание на зеленые колонки N и O листа «Таблицы». Для примера показан интервал от 9 до 14 единиц adc с максимальной погрешностью линеаризации 0,416127127°С. Перемещая единицу и двойку по зеленому полю, можно оценить ошибку линеаризации на любом интервале. Ошибка будет в столбце X. Как единица, так и двойка должна быть единственной в своем зеленом столбце.

Остается только составить уравнение для каждого интервала.

post-166047-0-97978600-1443287606_thumb.jpg

post-166047-0-91274300-1443287623_thumb.jpg

Интерполятор С кусочно-линейной аппроксимацией Zombie47.rar

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

Кусочно-линейная интерполяция не прокатит, слишком мала точность АЦП.

Вот ошибка людей во всех областях жизни. Принимают решение основываясь на чем то своем.

Наверно потому что не было показано мое ТЗ

Так в моем тз точность нужна такая: знать когда масло прогрелось свыше 40 градусов. Знать когда масло нагрелось свыше 110 градусов.

ну и вывод промежуточных значений просто информативно. Можно +-5 градусов=) ни на что не влияет.

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

тогда я лично вообще не понимаю - чего тут народ надрывается в попытке выловить каких то блох...

6-8 отрезков и точность превысит 1 градус

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Еще как было ТЗ показано. Могу даже процитировать.

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

Цель, как я понял, – показать расчетные методики. Вот я и показываю мастер-классы. А никто и не обещал, что расчеты будут простыми. Я сам их несколько лет изучал.

Только точность расчетов тут значения уже не имеет. Задача видится примерно следующей:

1. Опросить АЦП.

2. Усреднить показания АЦП.

3. Пересчитать код АЦП в температуру. Кусочно-линейная интерполяция все равно будет писаться врукопашную. Линеаризация - это вообще трудно автоматизируемый процесс.

4. Преобразовать отрицательные значения температуры из дополнительного кода в прямой.

5. Перевести температуру из двоичного кода в двоично-десятичный.

6. Погасить незначащие разряды и сформировать на их месте знак «минус» для отрицательных температур.

7. Перевести двоично-десятичный код каждой цифры в код семисегментного индикатора.

8. Запустить динамическую индикацию.

9. Сравнить температуру с двумя пороговыми значениями.

10. Просигнализировать проход пороговых значений вспышками светодиодов.

Как я понял, тема застряла где-то в районе 2-го и 3-го пунктов. Программирование на языке высокого уровня решает проблему лишь частично.

Я склоняюсь к мысли запустить табличный «пересчет». В этом случае одним махом, примерно за 30 машинных тактов, будут пройдены пункты с 3-го по 8-ой. Затраты памяти от 2кБайт до 4кБайт, в зависимости от требуемой точности, что с точки зрения создания таблиц в Excel-е совершенно непринципиально. Но это уже ассемблер. Вот Zombie47 и буксует, не желая, похоже, изучать ни архитектуру контроллера, ни его систему команд. Мучается с нехваткой вычислительных ресурсов. Как следствие, пытается поднять быстродействие путем снижения точности расчетов. И даже не подозревает, что это тупиковый путь, а контроллеры, вообще говоря, для математических расчетов и не предназначены вовсе.

Самое интересное, я еще в посте #62 пробную версию пересчетных таблиц выложил, нужно было лишь разобраться в алгоритме и уточнить ряд параметров. Под уточненные данные я бы подготовил новые уточненные таблицы менее чем за час. Точность расчетов не хуже ±0,5°С и определяется, в основном, корректностью определения параметров терморезистора.

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

Программирование на языке высокого уровня решает проблему лишь частично

до сих пор оно решало все проблемы полностью. Видимо что-то у вас с оценкой объективной реальности

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

что-то и с понятиями явно какая то путаница

4. Преобразовать отрицательные значения температуры из дополнительного кода в прямой

у АЦП есть дополнительный код? Видимо я хреново читал мануал...

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Как я понял, тема застряла где-то в районе 2-го и 3-го пунктов.

Нет уже все доделано почти. В этой теме я спрашивал только как быть с нелинейной характеристикой и как её описывать. И для себя я выбрал кусочно линейную (или попроще для других это просто кривой график рубим топором и получаем график из нескольких прямых грубо обрисовывающий плавный график.)

Сейчас допишу комментарии к программе и выложу чтобы кто нибудь в будущем смог внимательно изучить её. мне как дилетанту проще описать программу чтобы неопытные люди поняли. Так как когда я находил какие то программы я кучу всего не понимал а для них это были очевидные вещи=)

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

На участке от 36,6°С до 100°С погрешность вычислений достигнет 4,4°С при температуре 74,98°С. Свыше 100°С погрешность вообще выйдет за разумные пределы.

111°С ошибка 5°С

120°С ошибка 10°С

128°С ошибка 15°С

135°С ошибка 20°С

141°С ошибка 25°С

Вот, что такое кусочно-линейная аппроксимация. Выкладывай программу, оценим.

Имеющийся терморезистор и АЦП вполне могут охватить диапазон от -99°С до +200°С с погрешностью около 1°С в середине и 2…3°С на краях диапазона, стоит лишь сменить метод расчета.

Просто имей это в виду.

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

там линия будет не одна (ну если рассуждать здраво), и они не одинаковой длинны, откуда такие страшные погрешности то?

я личто от обычного килоомного резюка из ATX получал на участке 20...100 градусов погрешность не более 1 градуса (расчетную, там еще есть параллельная девиация, но это отдельная тема) всего на 8-ми отрезках с разными углами наклона

тут либо я дурак, либо у вас что-то не в порядке с расчетами

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Да скоро выложу программу и вы мне скажите где будет макс погрешность и я её проверю. Кстати кусок линейного графика для температуры свыше 100 градусов я еще не написал. ибо мне нужно знать какое сопротивление у датчика при температуре 140. поэтому я планирую запихнуть два датчика в кипящую соленую воду =) один откалиброванный.

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

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

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

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

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

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

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

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

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

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

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

×
×
  • Создать...