Измеритель температуры и давления на AVR – Часть 2

June 27, 2010 by admin Комментировать »

Использование встроенного АЦП

Встроенный АЦП последовательного приближения входит в состав почти всех МК семейства Mega и большинства МК семейства Tiny, кроме простей­ших младших моделей и увы, знакомого нам Tiny2313. Мы не будем жаться (от батареек термометру-барометру работать не придется, и экономить тут нечего) и выберем ATniega8535 в корпусе с 40 выводами, у которого имеют­ся четыре порта А, В, С и D полностью (каждый по 8 выводов) и некоторая часть выводов задействована только под альтернативные функции.

Сначала несколько общих слов о встроенных АЦП. Во всех моделях AVR общего назначения они многоканальные и 10-разрядные (за некоторым ис­ключением, например, в ATmega8 из 6 каналов только четыре имеют разре­шение 10 разрядов, а оставшиеся два— 8, а в новейшем семействе Xmega АЦП имеет 12 разрядов). Многоканальность означает, что имеется только одно ядро преобразователя, которое по желанию программиста может под­ключаться к одному из входов через аналоговый мультиплексор, наподобие 561КП2, разобранного в главе 15. Если вы, как чаще всего и бывает, задейст­вуете лишь часть входов, то остальные могут использоваться, как обычные порты ввода-вывода.

Точность АЦП номинально составляет ±2 LSB, плюс еще 0,5 LSB за счет не­линейности по всей шкале. То есть фактически такой АЦП с точки зрения абсолютной точности соответствует 8-разрядному. При соблюдении всех ус­ловий эту точность, впрочем, можно повысить, правда, условия довольно же­сткие и включают в себя как «правильную» разводку выводов АЦП, так и, например, требование остановки цифровых узлов на время измерения, чтобы исключить наводки (специальный режим ADC Noise Reduction, которого мы здесь касаться не будем).

Чтобы не углубляться в детали этого процесса и не усложнять задачу, мы в дальнейшем поступим проще — предпримем ряд мер, чтобы обеспечить ста­бильность результата, а абсолютную ошибку скомпенсируем за счет калиб­ровки, которая все равно потребуется. Для этой цели погрешности встроен­ного АЦП нам хватит и без особых ухищрений, важно только, чтобы показа­ния не «дребезжали». Уменьшение дребезга почти до нуля у нас будет достигаться тем, что, во-первых, на входе канала поставим конденсатор для фильтрации неизбежных в совмещенных аналогово-цифровых схемах наво­док на внешние цепи (фирменное руководство рекомендует еще последова­тельно с ним включать индуктивность порядка ЮмкГн, но мы без этого обойдемся). Во-вторых, мы будем измерять несколько раз и усреднять значе­ния отдельных измерений.

АЦП в МК AVR могут использовать три источника опорного напряжения на выбор — внешний, встроенный и напряжение питания аналоговой части. По­следний вариант, как самый простой, мы и применим: все равно подгонкой масштабов мы заниматься не будем, а все рассчитаем в цифровом виде. От­метим, что выводы аналогового питания сделаны отдельно от цифрового (хо­тя в простейших случаях это может быть и одно и то же питание, но мы их также разделим).

Пару слов о самой организации измерений. АЦП последовательного прибли­жения должен управляться определенной тактовой частотой, для чего в его со­став входит делитель тактовой частоты самого МК, подобный предделителю у таймеров. Рекомендуется подбирать этот коэффициент деления так, чтобы так­товая частота АЦП укладывалась в промежуток от 50 до 200 кГц. Например, для тактовой частоты МК 4 МГц подойдет коэффициент деления 32, тогда час­тота АЦП составит 125 кГц. Преобразование может идти в непрерывном ре­жиме (после окончания преобразования сразу начинается следующее), запус­каться автоматически по некоторым прерываниям (не для всех типов AVR) или каждый раз запускаться по команде. Мы будем использовать только последний «ручной» режим, так как нам для осреднения результатов тогда удобно точно отсчитывать число преобразований. В таком режиме на одно преобразование уходит 14 тактов, потому для приведенного примера с частотой 125 кГц время преобразования составит приблизительно 9 мс.

По окончании процесса преобразования возникает прерывание АЦП, в обра­ботчике которого результат измерения читается из соответствующих регист­ров. Так как число 10-разрядное, то оно займет два байта, у которых старшие 6 разрядов равны нулю. Это удобно, так как мы можем без опасений сумми­ровать до 64 (2^) результатов в рамках двухбайтового числа, не привлекая дополнительных регистров, и затем простым сдвигом, как мы обсуждали ра­нее, вычислять среднее.

Датчики температуры и давления

Аналоговая часть схемы измерения температуры совпадает с примененной в главе 17, за исключением диапазона выходных сигналов, и потому с несколь­ко иными параметрами. Чтобы использовать диапазон встроенного АЦП полностью, здесь надо подавать сигнал от О до 5 В (точнее, до значения опорного напряжения, которое здесь совпадает с аналоговым питанием), причем с отрицательными напряжениями на входе в данном случае АЦП ра­ботать «не умеет» (в некоторых моделях AVR есть АЦП с дифференциаль­ным режимом, и даже с предварительными усилителями, но точность при этом значительно снижается). При указанных на схеме (см. рис. 20.4) номи­налах резисторов диапазон выходных напряжений всей схемы составит около 4,9 В, то есть мы будем использовать весь диапазон АЦП с некоторым запа­сом. Резистор R4, который устанавливает нижнюю границу диапазона, нужно выбирать равным не сопротивлению датчика при 0°, как в схеме по рис. 17.9, а равным сопротивлению его при нижней требуемой температуре.

С датчиком атмосферного давления все еще проще — ряд фирм выпускают готовые датчики давления. Мы используем барометрический датчик МРХ4115 фирмы Motorola, питающийся от напряжения 5В и имеющий удобный диапазон выхода примерно от 0,2 до 4,6 В. При этом учтем, что большая абсолютная точность нам не требуется, только стабильность: для небольших высот над уровнем моря можно считать, что при изменении высо­ты на каждые 10—12 м давление меняется примерно на 1 мм рт. ст. Так что в пределах такого города, как Москва, с естественными перепадами высот до 100 и более метров^, оно само по себе будет «гулять» в пределах как мини­мум 10 мм рт. ст., даже без учета этажности зданий. И нам все равно целесо­образно будет подогнать результат «по месту» так, чтобы не иметь крупных расхождений с прогнозом погоды по телевидению — иначе показания при­бора окажутся никому не нужны.

Схема

с учетом всего сказанного схема термометра-барометра будет выглядеть так, как показано на рис. 20.4 (напомним, что ОУ МАХ478 можно заменить, на­пример, на ОР293, см. главу 12). Чтобы не загромождать схему, здесь не по­казан узел индикации, так как он аналогичен тому, что используется в часах из предыдущего раздела, за исключением того, что должен содержать не че­тыре, а шесть разрядов (показания в формате «33,3»° и «760» мм рт. ст.). К ним можно добавить постоянно горящие индикаторы, показывающие единицы измерения, подобно тому, как это делалось в главе 77 (рис. 17.9). На рис. 20.5 показан внешний вид табло такого измерителя, где дополнительные индикаторы изготовлены на основе шестнадцатисегментных PSA-05 красно­го свечения, в то время как основные семисегментные цифры — зеленого свечения. Минус, как и в главе 17, изготовлен из плоского светодиода.

Так как здесь выводов портов хватает, то можно назначить для управления сегментами разряды подряд, для чего выбран порт С (семь его битов из вось­ми). Тогда для упрощения программы можно применить следующий прием: где-то в программе определяются константы, соответствующие маске сег­ментов для рисунка цифр (зажженному сегменту соответствует единица, младший бит соответствует сегменту а, далее по порядку):

OUT_N: ;маски цифр

.db ObOOllllll,ObOOOOOllO,ObOlOllOll,ObOlOOllll,ObOllOOllO .db ObOllOllOl,ObOlllllOl,ObOOOOOlll,ObOlllllll,ObOllOllll

Затем в процедуре индикации мы читаем эти константы с помощью инструк­ции ipm, которая специально предназначена для чтения констант из памяти программ. Инструкция находит их по адресу, в данном случае по метке outn \ (так как адресация в памяти производится байтами, а нумерация команд вы­полняется словами, то адрес метки приходится умножать на два). После чего выводим в порт С непосредственно маску цифр:

ldi ZH,HIGH{0UT_N*2) ;адрес констант в памяти – в Z ldi ZL,L0W(0UT_N*2)

add ZL,temp ;адрес маски цифры, равной temp

1pm ;в гО – маска

out Porte,гО ;установили сегменты

Маски расположены по порядку цифр от О до 9. Поэтому перед выполнением этой последовательности команд у нас в рабочем регистре temp должно со­держаться значение, соответствующее цифре, выводимой в текущем такте индикации. Так мы избавляемся от процедур рисования знаков. Разряды РВО—РВ5 назначаем для управления разрядами индикации, а вывод PD7 — для управления знаком температуры.

Не показан на схеме и программирующий разъем, который одинаков для лю­бой схемы на AVR и показан на рис. 19.2 (соответствующие выводы для ATmega8535 названы на схеме рис. 20.4).

clip_image002

clip_image004

Рис. 20.5. Размещение индикаторов измерителя температуры и давления

То, что вывод MOSI (вывод 6) совпадает с выводом индикации единиц дав­ления, вас смущать уже не должно. Однако незадействованные в других функциях выводы программирования (в данном случае MISO и SLK, выводы 7 и 8) следует не забыть подсоединить к цифровому питанию +5 Вц «подтя­гивающими» резисторами номиналом от 1 до ЮкОм, как и показано на рис. 19.2.

clip_image006

Рис. 20.6. Схема источника питания для измерителя температуры и давления

Схема источника питания показана на рис. 20.6. Измеритель имеет четыре питания (+5 Вц, +5 Ва, ~5 Ва и +12 В для индикации) и три «земли», причем обычным значком «±» здесь обозначена аналоговая «земля» CNDa. Линия цифровой «земли» обозначена ОМВц, кроме этого, имеется еще общий про­вод индикаторов GNDh. Все три «земли» соединяются только на плате ис­точника питания. Отмечу, что готовый трансформатор с характеристиками, указанными на схеме, вы можете не найти. Поэтому смело выбирайте торои­дальный трансформатор мощностью порядка 10—15 Вт на напряжение вто­ричной обмотки 10—12 В (которое будет использоваться для индикаторов и стабилизатора +5 Вц), измерьте на нем количество витков на вольт (как опи­сано в главе 9) и домотайте три одинаковых обмотки на 7—8 В, каждая по­верх существующих, проводом не тоньше 0,3 мм в диаметре. Удобнее всего их мотать одновременно сложенным втрое проводом заранее рассчитанной длины.

Программа

Чтобы перейти к обсуждению непосредственно программы измерителя, нам нужно решить еще один принципиальный вопрос. Передаточная характери­стика любого измерителя температуры, показывающего ее в градусах Цель­сия, должна «ломаться» в нуле — ниже и выше абсолютные значения пока­заний возрастают. Так как мы тут действуем в области положительных напряжений, то этот вопрос придется решать самостоятельно (в АЦП типа 572ПВ2, напомним, определение абсолютной величины и индикация знака производились автоматически).

Это несложно сделать, если представить формулу пересчета значений темпе­ратуры в виде уравнения N = K’\x ~ Z|, где N— число на индикаторе, jc — те­кущий код АЦП, Z— код АЦП, соответствующий нулю градусов Цельсия (при наших установках он должен соответствовать примерно середине диа­пазона). Чтобы вычислить значение модуля, нам придется сначала опреде­лять, что больше — X или Z, и вычитать из большего меньшее. Заодно при этой операции сравнения мы определяем значение знака. Если в регистрах AregHrAregL содержится значение текущего кода АЦП дс, а в регистрах KoeffH:KoeffL значение коэффициента Z, то алгоритм выглядит примерно вот так:

/•вычисление знака: ср AregL,KoeffL ;сравниваем х и Z срс AregH,KoeffH brsh bO

;если X меньше Z

sub KoeffL,AregL sbc KoeffH,AregH

mov AregL, KoeffL /меняем местами, чтобы температура

mov AregH,KoeffH ;оказалась опять в AregH:AregL

sbi PortD,7 ; знак –

rjmp mO bO: /если x больше Z

sub AregL,KoeffL

sbc AregH,KoeffH

cbi PortD,7 ;знак + mO:

<умножение на коэфф К>

Здесь разряд 7 порта D (вывод 21 контроллера) управляет плоским светодио­дом, который горит, если температура ниже нуля, и погашен, если выше.

Давление занимает только положительную область значений, поэтому там такой сложной процедуры не понадобится. Если вы посмотрите на характе­ристику датчика в фирменном описании, то выясните, что он работает не с начала шкалы — нулевому напряжению на выходе (и, соответственно, нуле­вому коду АЦП) будет соответствовать некоторое значение давления. В ре­зультате можно ожидать, что в формуле пересчета значений давления, пред­ставленной в вт& N = K(x + Z), все величины будут в положительной области.

Физический смысл коэффициента К— крутизна характеристики датчиков в координатах входной код АЦП— число на индикаторах. Умножение на ко­эффициент К мы будем производить описанным ранее методом— через представление его в виде двоичной дроби (за основу берется 2’^ = 1024, этого будет достаточно). Вычисление ориентировочных значений коэффициентов KhZпоясняется далее, при описании процедуры калибровки.

Теперь можно окинуть взглядом собственно программу, которая целиком приведена в приложении 4 (разд. «Программа измерителя температуры и давления»). Как вы видите из таблицы прерываний, здесь используется всего один, самый простой Timer О, который срабатывает с частотой около 2000 раз в секунду. В его обработчике по метке timo и заключена большая часть функциональности.

В каждом цикле сначала проверяется счетчик cRazr, который отсчитывает разряды индикаторов (от О до 5). В соответствии с его значением происходит формирование кода индицируемого знака и затем на нужный разряд подается питание.

После формирования цифры программа переходит к довольно запутанному, на первый взгляд, алгоритму работы АЦП. На самом деле он не так уж и сложен. Управляют этим процессом две переменных— счетчик циклов countcyk и счетчик преобразований count. Первый из них увеличивается на 1 каждый раз, когда происходит прерывание таймера. Когда его величина дос­тигает 32 (то есть когда устанавливается единица в бите 5, см. команду sbrs countCyk,5), ТО значение счетчика сбрасывается для следующего цик­ла, и происходит запуск преобразования АЦП, причем для канала, соответст­вующего значению бита в регистре Flag, указывающего, что именно мы из­меряем сейчас— температуру или давление. Таким образом измерения равномерно распределяются по времени.

Сами преобразования отсчитываются счетчиком count до 64 (поэтому цикл одного измерения занимает чуть более секунды: 32×64 = 2048 прерываний таймера, а в секунду их происходит примерно 1953). Когда это значение достигается, то мы переходим к обработке результатов по описанным ранее алгоритмам: сумма измерений делится на 64 (то есть вычисляется среднее за секунду), затем вычитается или прибавляется значение коэффициента Z, и полученная величина умножается на коэффициент К, точнее— на его целый эквивалент, полученный умножением на 1024. Затем произведение делится на это число (отбрасывается младший байт, и оставшиеся сдвига­ются на два разряда вправо) и преобразуется к распакованному двоично-десятичному виду, отдельные цифры которого размещаются в памяти для последующей индикации. Как только очередной такой цикл заканчивается, меняется значение бита в регистре Flag, поэтому давление и температура измеряются попеременно. В целом выходит, что значение каждой из вели­чин меняется примерно раз в две секунды и представляет собой среднее за половину этого периода.

Собственно результат измерения читается в прерывании АЦП (процедура по метке readADc), которое происходит автоматически по окончании каждого преобразования. В нем увеличивается значение счетчика count, извлекается из памяти предыдущее значение суммы показаний (в зависимости от регист­ра Flag — температуры или давления), считываются значения АЦП, сумми­руются с предыдущими значениями и сумма записывается обратно в память. Практически весь алгоритм мы описали — осталось только понять, как полу­чить значения коэффициентов преобразования KhZh затем произвести точ­ную калибровку.

Калибровка

Для того чтобы прибор заработал, в него необходимо ввести предваритель­ные значения коэффициентов преобразования К и Z, причем такие, жела­тельно, чтобы они были достаточно близки к настоящим, и измеритель не показал бы нам сразу «погоду на Марсе». В программе «зашиты» некие зна­чения коэффициентов (см. процедуру Reset, секцию «Запись коэффициен­тов» в самом конце программы), которые вы можете использовать, если в точности воспроизведете схему по рис. 20.4 и используете тот же самый дат­чик давления. Как они получены?

Схема датчика температуры при указанных параметрах должна выдавать, как вы можете подсчитать, значение от О до 5 В в диапазоне температур пример­но от -47 до 55 °С. То есть на 102 °С у нас приходится 1024 градации АЦП, и крутизна характеристики, если считать градусы с десятыми долями, составит 1020/1024 = 0,996 десятых долей градуса на единицу кода АЦП. Для вычис­лений в МК эту величину мы хотим умножить на 1024, так что можно было бы и не делить — ориентировочное значение коэффициента К так и будет 1020.

Величину Z, соответствующую О °С, вычислить также несложно. Мы полага­ем, что нулевому значению кода соответствует температура -47°, тогда зна­чение кода в нуле должно составить величину 470, поделенную на крутизну: 470/0,996 = 471.

Теперь разберемся с давлением. «Если повар нам не врет», то диапазон дат­чика, соответствующий изменению напряжения на его выходе от О до 4,6 В, составляет примерно 850 мм рт. ст. Диапазон О—4,6 В будет соответствовать изменению кодов примерно от О до 940 единиц, то есть крутизна К равна 850/940 = 0,904 мм рт. ст. на единицу кода. В приведенном для наших расче­тов виде это составит 0,904-1024 = 926. «Подставка» Z есть значение кода на нижней границе диапазона датчика, которая равна около 11 мм рт. ст., соот­ветственно, Z= 11/0,904 = 12 единиц. Полученные величины «по умолча­нию» и «зашиваем» в программу.

Для уточнения этих величин необходимо произвести калибровку по темпера­туре уже отлаженного прибора. Для этого следует запустить прибор и помес­тить датчик температуры в воду, записав для двух значений температур (как можно ближе к 0°, но не ниже его, и около 30—35 °С) показания датчика (/) и реальные значения температуры по образцовому термометру (О- Они, есте­ственно, будут различаться.

Для расчета новых (правильных) значений коэффициентов К’ и Z’достаточно решить относительно них систему уравнений:

clip_image008

Здесь величины со штрихами относятся к правильным (новым) значениям, а без штрихов — к старым, причем значение коэффициента К нужно подстав­лять в изначальной форме (а не умноженным на 1024). Система четырех уравнений содержит четыре неизвестных, два из которых (величины кодов х\ и jc2) вспомогательные. Если вы забыли, как решаются такие простые систе­мы — обратитесь к любому справочнику по математике для средней школы (или к пособию по использованию Excel в алгебраических расчетах). Вычис­ленные значения (не забудьте А" умножить на 1024!) «забейте» в программу и перепрограммируйте контроллер.

Аналогично калибруется канал давления, только коэффициент Z в уравнениях не вычитается, а прибавляется к jc. Но самое сложное здесь — получить дейст­вительные значения давления. Далеко не все научные лаборатории располага­ют образцовыми манометрами для измерения столь малых давлений с необхо­димой точностью. Поэтому самый простой, хотя и долгий метод — сравнивать показания датчика с данными по давлению, которые публикуются в Интернете. Данные радио и телевидения лучше не использовать, так как текущие значения могут сообщаться с опозданием на полсуток либо вообще отсутствовать, а по завтрашнему прогнозу, естественно, вы ничего не откалибруете.

Для получения двух точек дождитесь, пока давление на улице не станет дос­таточно низким, а затем, наоборот, высоким — экстремальные значения дав­ления в регионе Москвы составляют примерно 720 и 770 мм рт. ст. Чем дальше будут отстоять друг от друга значения, тем точнее калибровка. Для повышения точности можно усреднить коэффициенты, рассчитанные по не­скольким парам значений давления, но это стоит делать, только если у вас хватит терпения вести наблюдения в течение нескольких месяцев, когда бу­дет пройдено несколько минимумов и максимумов. Средние значения давле­ния при калибровке лучше не учитывать, так как ошибка ее из-за узкого ин­тервала и так достаточно велика.

Можно ли объединить часы, описанные в первом разделе этой главы, с изме­рителем температуры и давления? Конечно, но я предоставляю читателям

сделать это самостоятельно. Одно только замечание: общее количество ин­дикаторов составит 10 штук (6 для измерителя и 4 для часов), и это почти предельная величина для динамической индикации. Увеличивать частоту об­хода индикаторов нельзя до бесконечности: у контроллера может просто не хватить быстродействия, и он начнет терять прерывания, сбиваясь в опросе датчиков или, что еще хуже, в отсчете времени (правда, это отчасти решается увеличением тактовой частоты). Но и быстродействие транзисторных ключей тоже ограничено, и при слишком высокой частоте обхода будут подсвечи­ваться ненужные и терять яркость нужные сегменты. Потому, возможно, схему придется продумывать более тщательно.

Один из путей улучшения схемы: обеспечить независимый отсчет времени через подсоединение к МК внешней микросхемы RTC. Принципы построе­ния такой конструкции мы разберем в следующей главе.

Рассмотрение таких устройств подробнее увело бы нас слишком далеко, по­тому мы лучше перейдем к такому вопросу: а можно ли не «зашивать» коэф­фициенты в программу, а устанавливать их при калибровке отдельно, напри­мер, через персональный компьютер? Для этого придется познакомиться еще с двумя вещами: с последовательным портом UART и хранением данных в EEPROM, чем мы и займемся в следующей главе.

Оставить комментарий

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