Altinkaya: турецкие корпуса для РЭА

Микроконтроллер решает сложные полиномиальные уравнения

LM103 PIC16F887

,

С помощью выполняющейся за короткое время программы и простой схемы микроконтроллер PIC может линеаризовать характеристику термистора, чтобы точно измерить температуру и отобразить результат на дисплее.

Измеряя температуру с помощью термистора, вы сталкиваетесь с проблемой линеаризации его отклика, необходимой для получения результатов требуемой точности. Одним из лучших методов линеаризации термистора является использование полиномиального уравнения Стейнхарта-Харта, дающего ошибку в 0.1 °C. Описываемая ниже конструкция рассчитана на диапазон температур от 0 °C до 100 °C.

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

Для того чтобы составить уравнение, потребуются три коэффициента термистора – A, B и C. Если изготовитель не предоставил такую информацию, вы можете найти коэффициенты, решив уравнения Стейнхарта-Харта (1…3) для трех различных температурных точек. В нашей схеме микроконтроллер PIC с необходимой точностью решает эти уравнения за 40 мс (Рисунок 1).

 Микроконтроллер решает сложные полиномиальные уравнения
Рисунок 1. В этой простой схеме высокоточного термометра используется микроконтроллер PIC16F887 и ЖК индикатор.

Для иллюстрации воспользуемся термистором LM103 с отрицательным температурным коэффициентом (NTC), сопротивление которого при трех различных температурах имеет значения, показанные в Таблице 1.

Таблица 1. Сопротивление термистора.
Температура
(°C)
Сопротивление
(кОм)
2.7
23
27.5
8.8
66
2.7

Полученная в этих трех измерениях температура преобразовывается в градусы Кельвина и подставляется в три уравнения Стейнхарта-Харта:

   (1)
   (2)
   (3)

Решая эту систему из трех уравнений, получаем коэффициенты A, B и C (Таблица 2).

Таблица 2. Коэффициенты термистора.
Коэффициент
Значение
A
2.501 × 10–4
B
3.505 × 10–4
C
–1.415 × 10–7

Подставляя найденные коэффициенты в уравнение Стейнхарта-Харта, получаем выражение для термистора:

   (4)

или:

     (5)

Задача микроконтроллера PIC16F887 заключается в том, чтобы, используя Уравнение 4, получить истинные показания температуры. Для этого потребуется 1227 слов памяти микроконтроллера. Вывод AN0 объявлен аналоговым входом, а остальные линии порта – цифровыми входами. Аналого-цифровой преобразователь (АЦП) сконфигурирован для 10-битного разрешения с временем выборки 50 мкс.

Напряжение термистора в двоичном формате заносится в переменную volt инструкцией ADCIN 0, volt. Затем для преобразования в двоично-десятичную форму это значение умножается на 48,828 и сохраняется в переменной v1. Чтобы из v1 получить отдельные десятичные цифры, каждая из них с помощью команд DIG3, DIG2 и DIG1 записывается в переменные dig3, dig2 и dig, соответственно.

Исходный код программы термометра доступен для скачивания в разделе Загрузки. В программе объявляются и обрабатываются следующие переменные: B, A, C, L, volt, v1, v2, pattern, pattern2, pattern3, I, digit3, digit2 и digit. Кроме того, в процессе преобразования двоичного кода в двоично-десятичный используются переменные conv1 и conv2. В них содержатся младшие биты результата преобразования 10-разрядного АЦП, значение которых равно 4.8828 мВ.

Алгоритм, разработанный для получения показаний температуры на основе уравнения Стейнхарта-Харта, требует выполнения нескольких шагов.

Прежде всего, вычисляется напряжение источника питания (v1), равное 48828 × volt2. Переменная volt2 считывается с помощью АЦП микроконтроллера. Если напряжение источника соответствует требуемому значению, то volt2 = %1111111111, и тогда v1 = 49,951,044. Далее с помощью инструкции DIV32 переменная volt2 делится на 10,000, давая в результате величину 4995, приблизительно соответствующую напряжению источника питания 5 В.

На втором этапе вычисляется падение напряжения на термисторе. При этом полностью повторяются все действия первого шага, за исключением того, что теперь используется другой канал АЦП. Предположим, мы имеем в АЦП результат считывания напряжения 2.5 В (код АЦП равен 1000000000). После выполнения описанных в предыдущем абзаце манипуляций, получаем число 24,999,936, которое делится на 10 инструкцией DIV32 для получения результата 2499, примерно соответствующего напряжению 2.500 В.

Третьим шагом находим величину сопротивления с помощью следующей формулы:

   (6)

Для этого мы запоминаем в переменной dif напряжение источника питания за вычетом напряжения термистора. А затем умножаем напряжение термистора на фиксированное сопротивление 10 кОм, и с помощью DIV32 делим последнее произведение на dif, получая величину сопротивления термистора.

На четвертом шаге, используя Уравнения (7…9), вычисляем логарифм по основанию 2 от сопротивления термистора:

   (7)
   (8)
   (9)

где a0, a1 и a2 – последовательные цифры двоичной мантиссы.

Затем с помощью функции NCD мы находим параметр a0, или целую часть логарифма, представляющую старший значащий бит числа (MSB). Декрементировав его на 1, получим двоичный логарифм параметра. Например, мы хотим использовать четыре значащих цифры двоичного логарифма 47, равного 5.554. NCD(47) = 6, где 47 в двоичном представлении записывается как 00101111, и MSB находится в шестой позиции справа. Если декрементировать его на 1, получим число 5, являющееся целой части логарифма.

Для завершения вычисления логарифма необходимо найти его мантиссу (дробную часть). Для этого потребуется результат последовательных делений w на 2. Однако выполнить такую операцию напрямую невозможно, так как в результате деления 47 на 2 получается 23.5, и мы потеряем дробную часть. (PIC Basic Pro не работает с дробями). По этой причине для нахождения мантиссы мы используем специальную подпрограмму, выполняющую следующую последовательность действий:

47/2 = 23.5,
23.5/2 = 11.75,
11.75/2 = 5.875,
5.875/2 = 2.9375,
2.9375/2 = 1.46875.

При делении 47/2 = 23 с остатком 1, эта «1» появляется в результате первой операции деления из пяти, которые потребуется выполнить. Соответственно, дробь 1/25 = 0.03125. Работать с дробями мы не можем, поэтому вместо того, чтобы делить 1 на 2n, мы берем число 10,000 в качестве числителя и вызываем подпрограмму, вычисляющую знаменатель в зависимости от номера операции деления, в которой появляется остаток 1.

Затем мы суммируем результаты всех делений. Продолжая приведенный ниже пример, мы должны выполнить для этого следующие пять шагов:

  • 47/2 = 23 с остатком 1 – это первая операция деления из пяти: 10,000/25 = 312.5 = 312;
  • 23/2 = 11 с остатком 1 – это вторая операция деления из пяти: 10,000/24 = 625;
  • 11/2 = 5 с остатком 1: 10,000/23 = 1250;
  • 5/2 = 2 с остатком 1: 10,000/22 = 2500;
  • 2/2 = 1 с остатком 0: прибавлять нечего.

В данном случае переменная ja равна 4687, и теперь только остается инкрементировать ее на 1. Поэтому мы делим ja на 1000, а затем складываем с 1000. Таким образом, ja = 1468, давая нам приблизительно упоминавшуюся выше исходную величину, умноженную на 1000 с четырьмя значащими цифрами.

Определив все M, мы должны найти мантиссу, используя описанные ранее процедуры. Деление на 2an не представляет сложности, поскольку работаем мы в двоичном базисе, и деление выполняется на 20 или 21. Возводя в квадрат, мы должны подумать, куда поместим произведение Ma на Ma, а затем разделить его на 1000, поскольку результат выходит за пределы 16 бит.

После того, как этот процесс будет выполнен необходимое число раз, мы должны привести an к десятичному основанию. Для этого последовательно умножаем его на соответствующие весовые коэффициенты 5, 25, 125, и т.д. И, поскольку работать с дробями мы не можем, умножаем еще на 5000, 2500, и так далее.

И, наконец, мы суммируем все члены мантиссы в десятичной форме, а затем делим сумму на 10. Далее прибавляем a0 × 1000 и записываем результат в переменную l2, в которой теперь будет храниться значение двоичного логарифма сопротивления термистора. На последнем шаге вычислим натуральный логарифм, который будет использован в уравнении. База логарифма изменяется следующим образом:

 

Поскольку ln(2) = 0.6931, нам достаточно просто умножить l2 на 6931, а затем, используя команду DIV32, разделить это число на 10,000 и сохранить результат в переменной lm, которая будет содержать натуральный логарифм сопротивления резистора, умноженный на 1000.

Для управления общим выводом ЖКИ в цикле for-next на вывод RD1 выводится «1» (Рисунок 2).

Микроконтроллер решает сложные полиномиальные уравнения 
Рисунок 2. Подаваемый с вывода RD1 на общий вход ЖКИ сигнал частотой 40 Гц управляет регенерацией дисплея.

Затем вызывается подпрограмма D, преобразующая двоично-десятичные данные в коды 7-сегментного индикатора. Функция LOOKUP конвертирует двоично-десятичное число digit3 в 7-сегментный формат, сохраняемый в pattern3. После чего для синхронизации с ЖКИ выполняется операция «исключающее ИЛИ» над pattern3 и значением RD1, хранящемся в виде байта в переменной L.

 Микроконтроллер решает сложные полиномиальные уравнения
Рисунок 3. Оранжевая осциллограмма соответствует интервалу времени 33 мс, в течение которого выполняется вычисление логарифма. Еще 7 мс (синяя осциллограмма) требуются для получения достоверного отсчета. Таким образом, общее время обработки данных составляет 40 мс.

Этот процесс повторяется для двух оставшихся цифр, во время дополнительной 10-миллесекундной паузы. Затем RD1 выключается, а его состояние сохраняется в байтовой переменной L. Вновь вызывается подпрограмма D, и синхровыход RD1 вновь активизируется на следующие 10 мс. После каждого выполнения функции LOOKUP каждому выводу индикатора соответствует вывод порта, управляющий определенным сегментом ЖКИ. Общее время обработки данных составляет 40 мс (Рисунок 3).

Ссылки

  1. Computing Logarithms Digit-by-Digit, Mayer Goldberg, BRICS RS-04-17. ISSN: 0909-0878

Загрузки

Исходный код программы термометра для микроконтроллера PIC16F887

Electronic Design

Перевод: AlexAAN по заказу РадиоЛоцман

На английском языке: Microcontroller Solves Complex Temperature Polynomial Equations

21 предложений от 18 поставщиков
Льдогенератор Hoshizaki IM65NE-HC-LM103 вырабатывает высококачественный кубиковый лед продолговатой формы , являющийся идеальным выбором для охлаждения напитков. Большая поверхность теплообмена обеспечивает быстрое...
ChipWorker
Весь мир
LM103H-3.3
National Semiconductor
8 379 ₽
Utmel
Весь мир
LM103H-3.0/883
Rochester Electronics
от 10 311 ₽
Acme Chip
Весь мир
LM103H-5.1
National Semiconductor
по запросу
ТаймЧипс
Россия
LM103H-3.9/883-1
Cynergy3
по запросу
Электронные компоненты. Бесплатная доставка по России
Для комментирования материалов с сайта и получения полного доступа к нашему форуму Вам необходимо зарегистрироваться.
Имя
Фрагменты обсуждения:Полный вариант обсуждения »
  • Отличный материал. В одной [URL="http://www.rlocman.ru/shem/schematics.html?di=151518"]с[/URL]татье, я тоже хотел подобное сделать. Но меня испугало сложность решения уравнения Стейнхарта-Харта на ATmega8. И я пошел по простому пути, в результате получил приличную погрешность в диапазоне 0-250С. Как не крути, но термосопротивление всеже имеет нелинейность, которую нужно пересчитывать в линейность.... Коэф. abc посчитать в маткаде можно. Скорее всего на Си нужно делать, хоть я не любитель этого языка, но на асм сложноватые моменты есть при расчете.. ___________ Но опять таки в каждом случае можно найти выходы из положения. Если память МК позволяет, то можно скажем создать калибровочную таблицу. Взять тот самый DS18B20 с точностью 0,1С и термосопротивление. Поместить в одну среду, нагревать, и сравнивать показания. Калибровочные данные с выбранным шагом заносить в таблицу Flash. Точность плавать будет, ибо калибровку через каждый 0,5-1 гр наверно никто не будет делать, но все-же..
  • о кошках... DS1820 - точность 0,5. Дискретность 0,0625 DS1821 - точность 0,5. Дискретность 0,01
  • Спасибо за замечание. Действительно я загнул немного, что-то в голове запомнилась такая точность. Ну суть общий смысл от этого не меняется
  • Я видел эту статью, и признаться не впечатлился выбранным способом аппроксимации искомой кривой. А равно поставленной и решённой в статье задачей, хотя написано хорошо и подробно. Ведь каким математическим аппаратом аппроксимировать – сегодня этот вопрос второстепенный: полином или тригонометрический многочлен, табличный поиск и интерполяция, аппроксимация Паде, да что угодно. По-моему, гораздо полезнее было бы создание прибора, снимающего характеристики различных датчиков в самом широком диапазоне температур в автоматическом режиме. Цифровые датчики конечно очень удобны. Но, к сожалению, я не видел ничего цифрового на температуры выше 150 градусов. А равно ничего аналогового с линейным выходом, подобного LM35, LM135, LM45, LM235, LM335, TMP35 и т.п. В прошлом году пришлось заниматься термостатированием пресс форм, диапазон температур 150-300 градусов. Естественным было бы использование регуляторов 2ТРМ1, ТРМ202 и т.п., но ввиду ограниченного бюджета пришлось делать терморегуляторы "с нуля", за редким исключением из подручных материалов. В первую очередь я попробовал полупроводниковые датчики с положительным ТКС серий KTY83 и KTY84. Их рассматривали по ссылке, приведённой в первом посте [url]http://www.rlocman.ru/shem/schematics.html?di=151518[/url]. Это дешёвые, доступные и достаточно миниатюрные приборы, пригодные для создания компактных малоинерционных термозондов (KTY84 в корпусе). Ведь вопрос размеров порой выходит на первое место. По KTY я собрал небольшую статистику и пришёл к выводу, что они не годятся для промышленных приложений. Так, после 1-2х месяцев непрерывной работы (в горячем состоянии) некоторые начинали сбоить. Судя по данным самописцев – это хаотическое изменение сопротивления, похожее на внутренний обрыв. Хотя до возникновения этих неприятностей точность показаний была удовлетворительной, т.е. долговременная стабильность параметров у этих стекляшек всё же есть. Я имею ввиду повторяемость показаний от измерения к измерению по данным контрольного термометра, в пределах заявленной производителем точности конечно. Среди прочих недостатков – достаточно быстрый рост абсолютной ошибки определения температуры после некоторого порога. Эти характеристики есть в даташитах, но они больше ориентировочные, потому что многое зависит о способа возбуждения датчика (ток, напряжение), а также от партии приборов. Поскольку построение вручную "градировочных таблиц" для датчиков KTY, купленных в разных местах, обнаружило несовпадение наклонов и смещение характеристик по горизонтали. Т.е. наблюдаются большой разброс номинальных сопротивлений и вариация нелинейности характеристик. Хотя и незначительные по сравнению с низкой точностью датчиков. Поэтому я весьма скептически отношусь к намерениям Схемопая поднять точность таких конструкций [url]http://www.rlocman.ru/forum/showthread.php?t=18957[/url] до 1 градуса. Ведь автор этого цифрового термометра немного лукавил, когда говорил о точности в несколько градусов. Возможно и так, но в узком диапазоне для конкретного датчика при условии калибровки по эталонному термометру достаточной точности. Поэтому на производстве (и не только) единственным выходом и стандартом де-факто, по сути, нужно считать термопары и платиновые термометры сопротивления. Можно сказать и по-другому: всё то, на что есть ГОСТы, международные и отраслевые стандарты. На медные и никелевые термометры сопротивления международные стандарты вроде бы отсутствуют, но они и у нас не слишком распространены. Выбор между термопарами и платиновыми термометрами не всегда очевиден. И тем и другим присущи достоинства и недостатки, описанные в массе литературы. Из своего опыта скажу только, что использование термопар ХА и ХК не всегда оправдывает надежды на получение высокой точности измерений во всём диапазоне. Ошибки начинают появляться ещё при их изготовлении - сварке из разнородных проводов. Ведь независимо от диаметра провода некоторый разброс характеристик готовых термопар гарантирован. И это не учитывая причуды металлургии, т.к. химический состав проводов, изготовленных на разных заводах, может отличаться. Но допустимые отклонения готовых термопар для разных температурных диапазонов и исходных материалов классифицированы. В свою очередь, необходимость компенсации холодного спая усложняет схему измерения и вносит дополнительную ошибку. Если же нужно измерять температуру на приличном удалении, возникает необходимость использования специального термокомпенсационного провода, что повышает стоимость измерительной системы и опять же, вносит погрешности. Так что даже простая задача измерения температуры до 300 градусов термопарой с известной градировочной таблицей может оказаться непростой. С платиновыми термометрами сопротивления (проволочными и плёночными) немного проще. Тут, так же как и в случае термопар, всё классифицировано, со своими допусками. Для каждого датчика (температурного коэффициента сопротивления материала) есть полиномиальные зависимости со своими коэффициентами A, B и C. С малошумящим усилителем или же прямой оцифровкой на АЦП разрядностью 20 бит и выше вполне достижима высокая точность измерений в широком диапазоне температур даже без предварительной градуировки датчика (за исключением калибровки термометра по нулю градусов). Так, миниатюрные платиновые термодатчики на керамических подложках типа M-FK 1020 и PT106051 хоть и уступают полноразмерным проволочным аналогам, показали себя очень хорошо в плане точности и стабильности. Питание таких датчиков лучше организовать от источника тока в несколько мА, подпёртым прецизионным ИОН. После наработки около 1600 часов только один термозонд отказал, но причина была механическая – лопнула керамическая подложка из-за деформации стального корпуса. Дрейфа параметров этих платиновых терморезисторов не обнаружилось. В пристёжке несколько апноутов Microchip, некогда привлекших моё внимание.
  • Конечно, Вы правы. Уже точно не помню, в каких пределах я сравнивал показания температуры, ну уж точно не до 250С, так как у меня не было термометра с таким диапазоном. Этот прибор мне заказывали для измерения температуры двигателя. Там такой допуск в измерении допускался. Отсюдова, схема практически не имеет дополнительной обвязки. И на счет KTY84 правы. При долгой работе у меня этот датчик тоже вышел из строя.
  • И ещё 5 копеек: Не всегда, а точнее достаточно редко, требуется действительно знать температуру точно. Обычно это связано с человеческим фактором: повторение условий ранее полученных, взаимодействие с другими людьми или системами. Для большинства встречающихся задач это "избыточно" (точнее сказать - можно обойтись мЕньшей точностью). (круглый)
  • Возможно я со своим свиным рылом в калашный ряд. Но почитал статью, основной посыл - всякими хитростями избегать использования чисел с плавающей запятой. Для 8-ми разрядного МК это критично. Но зачем сейчас держаться за устаревшее железо и тратить свое время на выкрутасы с псевдо float - непонятно. Есть STM32, на нём можно решить задачу в "лоб". По цене - не дороже. Если только спортивный интерес. Но так можно вспомнить как в 60-х систему линейных уравнений с 1000 переменных решал целый отдел в течении полугода, сейчас такую задачу каждый может решить в одиночку на ПК в Matlab реально за секунду.
Полный вариант обсуждения »