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

Алгоритм отображения температуры

Неверно посчитали, получаться 1 разряд АЦП равен 0,15 град. С .

Это если бы характеристика датчика была бы линейной, а она не линейная

см. вложение в 11 посте

или используя встроенное АЦП алгоритмом повысить разрядность с 10 бит до 12 бит (необходим запас).

можно подробнее про этот алгоритм

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

Поделиться сообщением


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

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

Все делаете правильно, и постановка задачи стандартная - сделать вид, что прибор работает хорошо.

Одно непонятно - почему точность всего лишь 1 градус. Даже с фиговым датчиком и встроенным АЦП должно получиться лучше. Огласите схему подключения, диапазон температуры и прочее. Что-то тут не так.

Поделиться сообщением


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

Все делаете правильно, и постановка задачи стандартная - сделать вид, что прибор работает хорошо.

Одно непонятно - почему точность всего лишь 1 градус. Даже с фиговым датчиком и встроенным АЦП должно получиться лучше. Огласите схему подключения, диапазон температуры и прочее. Что-то тут не так.

Я рассуждал так

Сопротивление латчика при -50С 329200 Ом, при +110С 757Ом, надо работать во всем диапазоне температур.

Весь диапазон измерений 329200-757=328443 Ом

10 разрядный АЦП может замерить 1024 значения, значит на значение АЦП приходится 328443/1024=320,75 Ом

 

Значит изменение температуры с -45 до -50 включает в себя (329200-247500)/320,75=254 измерения АЦП т.е. дискретность даже выше чем 0,1 градус

Зато изменение температуры с +105 по +110 вызовет изменение сопротивления датчика на 857-757= 100 Ом, а так как "чувствительность" АЦП - 320 ом, то здесь десятыми долями градуса даже и не пахнет

Если я ошибся просьба указать где

Поделиться сообщением


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

Я рассуждал так

Вы не все рассказали. Вы используете делитель или генератор тока?

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

Поделиться сообщением


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

Можно применить усилитель с управляемым коэфициентом усиления. На отрицательных температурах, один коэф. усиления, на положительных - другой.

Поделиться сообщением


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

(кросс-пост в http://www.microchip.su/)

 

При измерении температуры, поскольку она меняется медленно, возможны всякие красивые трюки и фокусы.

 

Во-первых, можно легко и просто увеличить эквивалентную разрядность АЦП, тем самым увеличив разрешение. В "общем виде" для этого ко входному сигналу надо подмешать ма-аленькую долю сигнала от некого ЦАП-чика, а потом проделать серию A/D преобразований, последовательно увеличивая сигнал на выходе ЦАП-а и суммируя результат. Например, если АЦП 8-битный, и в наличии есть 3-битный ЦАП, то разрядность АЦП можно увеличить до 11 бит, если сигнал с выхода ЦАПа подмешать на вход АЦП с такой пропорции, чтобы 1 шаг ЦАП-а соответствовал 1/8 от одного шага АЦП.

 

В случае с NTC этот фокус производится при помощи 3 резисторов с дискретных выходов мелкоконтроллера на вход АЦП. Вернее, при помощи 5 высокоомных резисторов одного номинала: старший разряд - два резистора в параллель, средний разряд - один резистор, младший разряд - два резистора последовательно. Конечно, величина пропорции подмешивания в каждый момент отчасти зависит от величины сопротивления NTC, т.е. от температуры. Поэтому разогнать до 11 бит во всем диапазоне не получится, но примерно 10-битное разрешение вытягивается без проблем. У меня такой "разогнанный" термометр чувствувал, когда я подносил к термистору руку на расстояние ~20 см.

 

Во-вторых, после того, как разрядность АЦП разогнана до такого уровня, что младшие разряды становятся просто шумом (это важно, чтобы они шумели, иначе не выйдет), дальнейшее увеличение разрядности практически бесплатно получается за счет использования предельно упрощенного варианта фильтра Калмана, т.е. рекурсивного фильтра, который при смешном минимуме задействованных ресурсов обеспечит такой же результат, как метод наименьших квадратов.

 

Если "на пальцах", то сделать можно так (как вариант).

- Измеряете температуру "разогнанным" (шумным) АЦП, получившееся значение обозначим X (что есть сумма 8 последовательных измерений при пошаговом нарастании кода на выходе 3-битного псевдо-ЦАПа)

- Измеренному значению X верите не безоговорочно, а чуть-чуть, скажем всего на 1/16. То есть, текущее значение температуры вычисляете так:

 

T = T - T/16 + X

 

Понятно, что самое первое значение 11-битной температуры загоняете в 16-битную переменную напрямую:

 

T = X*16, или, если на си, то T = (X << 4);

 

А все последующие уже вычисляете по "недоверчивой" формуле

 

T = T - (T >> 4) + X;

 

В сумме у вас получится примерно 14-битное разрешение на 8-битном АЦП. Вуаля!

Поделиться сообщением


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

(кросс-пост в http://www.microchip.su/)
Это надо уметь написать так, чтобы не было ничего понятно, но зато создавалась иллюзия простоты реализации. :(

Поделиться сообщением


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

Это надо уметь написать так, чтобы не было ничего понятно, но зато создавалась иллюзия простоты реализации.

 

1. Схема подключения датчика понятна? Если не сильно углубляться в нюансы: NTC термистор одним концом подключен к питанию, вторым - к эталонному резистору Rref. Эталонный резистор вторым концом подключен к земле. АЦП в качестве опорного напряжения использует питание. Точка соединения термистора и эталонного резистора заведена на вход АЦП, но не напрямую, а через резистор Rs величиной в несколько кОм. Этот дополнительный резистор не обязателен, но он полезен для того, чтобы сгладить вариации сопротивления источника сигнала. Зачем это нужно - см. п.2.

 

2. Устройство псевдо-ЦАПа понятно? 3 разряда любого порта ввода-вывода микроконтроллера настроены на вывод. Обозначим их DAC0 (младший бит ЦАПа), DAC1 и DAC2 (старший бит).

- Между DAC0 и входом АЦП стоит цепочка из двух последовательно включенных высокоомных резисторов номинала Rx, в сумме 2*Rx.

- Между DAC1 и входом АЦП включен один резистор номинала Rx.

- Между DAC2 и входом АЦП включены два резистора номинала Rx в параллель, в сумме Rx/2.

Номинал Rx соотносится с Rref и Rs таким образом, чтобы при изменении сигнала на выходе DAC0 из 0 в 1 (или из 1 в 0) сигнал на входе АЦП менялся чуть больше, чем на 1/8 от его дискретности. Например, при питании в 5 В и разрядности АЦП 10 бит дискретность АЦП составляет примерно 4.9 мВ. Значит, резисторы надо выбрать так, чтобы при изменении DAC0 сигнал на входе АЦП сдвинyлся примерно на 0.62 мВ.

 

3. Как получить результат от "разогнанного АЦП" - понятно? По шагам:

3.1. Устанавливаем DAC2=0, DAC1=0, DAC0=0. Делаем АЦП преобразование, результат заносим в 16-битную переменную Х.

3.2. Устанавливаем DAC2=0, DAC1=0, DAC0=1. Делаем АЦП преобразование, результат прибавляем к 16-битной переменной Х.

3.3. Устанавливаем DAC2=0, DAC1=1, DAC0=0. Делаем АЦП преобразование, результат прибавляем к 16-битной переменной Х.

...

3.8. Устанавливаем DAC2=1, DAC1=1, DAC0=1. Делаем АЦП преобразование, результат прибавляем к 16-битной переменной Х.

Если АЦП 10-битный, в переменной Х получился 13-битный результат.

 

4. Как сделать псевдо-фильтр Калмана (или максимально упрощенный tracking g-h filter, если угодно) - понятно?

4.1. При инициализации делаем первое АЦП-преобразование (как в п.3), умножаем результат X на 8 (т.е. сдвигаем 13-битный результат X на 3 разряда влево (X << 3)) и запоминаем в 16-битной переменной Т. То есть, "вес" переменной Т в восемь раз больше, чем "вес" одного измерения X.

4.2. Все последующие результаты X, полученные от АЦП п.3, добавляем к Т без сдвига, предварительно вычтя из T одну восьмую. Одна восьмaя получается, если T сдвинуть вправо на 3 разряда. На cи это выглядит так:

 

T = T - (T >> 3) + X;

 

Естественно, чтобы успевать отследить колебания температуры, измерения надо теперь делать в несколько раз чаще.

Поделиться сообщением


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

=AK=, вы меня не поняли. :( Я имел в виду, что описание вашего алгоритма нужно было бы предварить методологической частью. Т.е. описанием "откуда что берется", "что от чего зависит" и "почему делаем именно так, как делаем". Топикстартер в начале темы просил функцию визуализации промежуточных (дробных) "виртуальных" значений измеряемой величины. А сейчас речь пошла о математических приемах при реализации увеличения разрядности АЦП для получения этих недостающих дробных значений. Но вы описываете алгоритм без пояснения критериев его применимости (частота оцифровки/оверсэмплинга, частота генерируемого "шума", время измерения, период фильтрации, время готовности результата и т.п.). Вот это и было сутью моего замечания к вашему посту #21.

Поделиться сообщением


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

вы описываете алгоритм без пояснения критериев его применимости (частота оцифровки/оверсэмплинга, частота генерируемого "шума", время измерения, период фильтрации, время готовности результата и т.п.).

Эти вопросы были в достаточной, на мой взгляд, степени были освещены в данной теме ранее, в том числе вами. Что касается следящих фильтров, упомянутых в п.4, то я дал ссылку на книгу (она, кстати, есть на ftp), кому интересно - прочтет.

 

После ваших разъяснений мне стало непонятным: что вы имели ввиду, говоря об "иллюзии простоты реализации"? Это стало звучать так, будто вы знаете еще более простые, но эффективные методы. Интересно было бы ознакомиться, если это не секрет.

Поделиться сообщением


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

10 разрядный АЦП может замерить 1024 значения, значит на значение АЦП приходится 328443/1024=320,75 Ом
Обычно это называется цена/значение единицы младшего разряда.

 

Значит изменение температуры с -45 до -50

Зато изменение температуры с +105 по +110 вызовет изменение сопротивления датчика на 857-757= 100 Ом,

В обоих случаях разница dC = 5. И разница в Омах, тоже должна быть одинаковой. У Вас значения температуры это числа со знаком.

Поделиться сообщением


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

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

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

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

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

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