Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: АЦП в PIC 16F876A
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Antarius
Сразу прошу прощения, если что - это мое первое сообщение в ваш форум.
Я - абсолютный чайник в электронике, и это мое первое устройство вообще (даже радио в детстве не собирал). Просто решил осуществить детскую мечту и собрать своими руками какое-либо электронное устройство. Решил сделать метеостанцию для начала.

Проблема следующая.
Нужно оцифровать значения датчика давления MPX 4115A с помощью АЦП в PIC16F876A.

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

Интересующий диапазон давления датчика соответствует напряжению на его выходе от 3,785 до 4,205 вольт. Поэтому на АЦП контроллера я подвел два напряжения минимум - 3,785 и максимум 4,205В. Чтобы весь интересующий меня диапазон уложился в 1024 отсчета АЦП. Напряжения задал многооборотными переменными резисторами. Напряжения стабильны и со временем не меняются.

Вся схема (и датчик и контроллер) питается от м/сх REF195, имеющая на выходе довольно стабильные 5,00 В. REF также подключена с двумя электролитическими конденсаторами, согласно даташиту.
Да, схема собрана на макетной плате (я только учусь), причем на плате в которую втыкается, а не паяется.

И в принципе все работает и все устраивает, но...
Почему-то, когда напряжение на выходе датчика стабильно, например 3,975В, с АЦП идет не стабильный ответ, допустим (просто для примера) 375, 376, 372, 373, 375... Что для моих целей неприемлимо, ибо дает плохую повторяемость результатов (получается больше чем 0,1 атм давления, а надо меньше). Пришлось опрашивать АЦП в цикле, делать множество замеров и находить среднее значение. Со средним все отлично, можно мерить даже с точностью в сотые доли атм.

В чем причина нестабильности? Что можно сделать, чтобы опрашивать датчик один раз, а не в цикле и получать стабильный результат?
Заранее спасибо.
Tanya
Цитата(Antarius @ Jan 8 2008, 12:37) *
Нужно оцифровать значения датчика давления MPX 4115A с помощью АЦП в PIC16F876A.


Интересующий диапазон давления датчика соответствует напряжению на его выходе от 3,785 до 4,205 вольт. Поэтому на АЦП контроллера я подвел два напряжения минимум - 3,785 и максимум 4,205В. Чтобы весь интересующий меня диапазон уложился в 1024 отсчета АЦП. Напряжения задал многооборотными переменными резисторами. Напряжения стабильны и со временем не меняются.

Вот этот кусок текста непонятен. Может схему лучше бы прикрепить? Только не в .bmp
Antarius
Да нету никакой схемы, собирается на коленке smile.gif

Датчик давления измеряет давление от 0 до 120 кпа, что соответствует напряжению на его выходе от 0 до 5 вольт. Я измеряю давление атмосферы, которое изменяется примерно от 90 до 105 кпа, что есть примерно 3,785 - 4,205 В на выходе датчика.
Поэтому если я просто буду оцифровывать с помощью АЦП диапазон 0 - Vdd (+5В), интересующее меня давление будет слабо меняться на выходе АЦП.
Поэтому с помощью регистра ADCON1 я переключаю АЦП в контроллере на работу с напряжениями Vref- и Vref+, вместо 0 - Vdd (см. стр. 128 англ. даташита на PIC 16F876A)
Подаю на Vref- (RA.2) +3.785В, а на Vref+ (RA.3) + 4.205 В. И измеряю уже относительно этих напряжений.

Ответ АЦП не стабилен, хотя напряжение с датчика стабильно (< +/- 0,001В).
Почему?
Tanya
Цитата(Antarius @ Jan 8 2008, 13:24) *
Да нету никакой схемы, собирается на коленке smile.gif

Датчик давления измеряет давление от 0 до 120 кпа, что соответствует напряжению на его выходе от 0 до 5 вольт. Я измеряю давление атмосферы, которое изменяется примерно от 90 до 105 кпа, что есть примерно 3,785 - 4,205 В на выходе датчика.
Поэтому если я просто буду оцифровывать с помощью АЦП диапазон 0 - Vdd (+5В), интересующее меня давление будет слабо меняться на выходе АЦП.
Поэтому с помощью регистра ADCON1 я переключаю АЦП в контроллере на работу с напряжениями Vref- и Vref+, вместо 0 - Vdd (см. стр. 128 англ. даташита на PIC 16F876A)
Подаю на Vref- (RA.2) +3.785В, а на Vref+ (RA.3) + 4.205 В. И измеряю уже относительно этих напряжений.

Ответ АЦП не стабилен, хотя напряжение с датчика стабильно (< +/- 0,001В).
Почему?

Схема - это не изделие, а его схема. А мучаете Вы таким образом АЦП напрасно. Удивительно, что еще как-то работает! У Вас диапазон примерно 0.4 вольта. Вам бы его усилить раз в 10. Проще всего - инструментальным усилителем.
Antarius
Ну не разрабатывал я схему.
Приходит идея - ищется деталька, даташит к ней и подключается к микроконтроллеру.
Схему нарисую, когда печатную плату буду делать.

Про инструментальный усилитель думал. Даже купил AD623. Но уткнулся в получение отрицательного напряжения в схеме (-5В), необходимых для него, и готовых решений не нашел, а сам не знаю - чайник же.
А почему я мучаю АЦП? Это же штатный режим работы... Или как?

Кстати, спасибо за ответы!
Еще раз прошу прощения, ибо абс. чайник в электронике.
K_AV
Цитата(Antarius @ Jan 8 2008, 12:24) *
Поэтому с помощью регистра ADCON1 я переключаю АЦП в контроллере на работу с напряжениями Vref- и Vref+, вместо 0 - Vdd (см. стр. 128 англ. даташита на PIC 16F876A)
Подаю на Vref- (RA.2) +3.785В, а на Vref+ (RA.3) + 4.205 В. И измеряю уже относительно этих напряжений.
Возьмите даташит на свой микроконтроллер и уточните, какие минимальное и максимальное значения напряжений можно использовать для встроенного АЦП в качестве внешних опорных. Это в табл.17-14 wink.gif
А схемы рисовать нужно. Как минимум - перед тем, как задавать вопросы. Иначе вас не поймут (даже если захотят пытаться понимать без схемы).
Antarius
О, спасибо, эту табличку я почему-то даже и не смотрел.
Значит, проблема в том, что у меня не соблюдается Max Vref - = Vref+ - 2.0V.
Спасибо большое!

А кто подскажет как получить -5 В из +5В wink.gif Ой, уже оффтопик.
Tanya
Цитата(Antarius @ Jan 8 2008, 15:11) *
О, спасибо, эту табличку я почему-то даже и не смотрел.
Значит, проблема в том, что у меня не соблюдается Max Vref - = Vref+ - 2.0V.
Спасибо большое!

А кто подскажет как получить -5 В из +5В wink.gif Ой, уже оффтопик.

AD22050 или подобное избавят Вас от второго питания....
volodya
Для получения +-5(+-15) двыхполярных можно DC/DC конвертор использовать например P6CU-0505Z в двух полярн. 5В или их аналоги (хотя хто кому аналог) от разных производителей. Таких море и недоого.
Удачи!!
amw
Цитата(Antarius @ Jan 8 2008, 11:37) *
Почему-то, когда напряжение на выходе датчика стабильно, например 3,975В, с АЦП идет не стабильный ответ, допустим (просто для примера) 375, 376, 372, 373, 375... Что для моих целей неприемлимо, ибо дает плохую повторяемость результатов (получается больше чем 0,1 атм давления, а надо меньше). Пришлось опрашивать АЦП в цикле, делать множество замеров и находить среднее значение. Со средним все отлично, можно мерить даже с точностью в сотые доли атм.

В чем причина нестабильности? Что можно сделать, чтобы опрашивать датчик один раз, а не в цикле и получать стабильный результат?
Заранее спасибо.

Вообще-то АЦП всегда болтает. И усреднять всегда надо.
Вам еще повезло, что разброс болтанки меньше 3-4 разрядов при Вашей "схеме".
Энтомолог
Цитата(Antarius @ Jan 8 2008, 15:11) *
О, спасибо, эту табличку я почему-то даже и не смотрел.
Значит, проблема в том, что у меня не соблюдается Max Vref - = Vref+ - 2.0V.


Я думаю проблема не в этом. Учитывая что превышение у Вас небольшое, это немного влияет на линейность работы АЦП, но не более. Проблема скорее всего в питании, возможно есть смысл увеличить емкости по питанию.
K_AV
Цитата(Энтомолог @ Jan 10 2008, 17:53) *
Я думаю проблема не в этом. Учитывая что превышение у Вас небольшое, это немного влияет на линейность работы АЦП, но не более. Проблема скорее всего в питании, возможно есть смысл увеличить емкости по питанию.
Я в своем посте не имел в виду, что проблема нестабильных показаний - в величинах опорных напряжений. Просто указал, что заданы они неверно. Прошу прощения - не акцентировал внимания на этой мысли. Но не сказать, что "превышение небольшое": разница между верхней и нижней опорами около 300 мВ при требуемом "не менее 2000 мВ".
А болтанка АЦП - да, от нее избавиться трудно. И вопрос не только в стабильности питания. Там могут и просто посторонние пульсации попадать на вход АЦП.
Марк_Я
Попробую и я помочь автору топика. Хочу ему напомнить, что на входе АЦП стоит УВХ. Поэтому необходимо обеспечить достаточное для заряда конденсатора УВХ (25 пФ) время между выбором канала АЦП (подачей сигнала на его вход) и моментом начала преобразования. В противном случае возможен эффект о котором он пишет...
Antarius
Спасибо помогающим!

По поводу напряжений все понял. Буду переделывать на инструментальном усилителе, когда найду подходящий по питанию в продаже.

Что касается времени заряда конденсатора, я опрашиваю датчик в цикле, между опросами задержка 20 мс. Этого достаточно для заряда? Пробовал 50 мс, разницы не заметил, но утверждать на 100% не буду.
Tanya
Цитата(Antarius @ Jan 11 2008, 11:03) *
Спасибо помогающим!

По поводу напряжений все понял. Буду переделывать на инструментальном усилителе, когда найду подходящий по питанию в продаже.

Что касается времени заряда конденсатора, я опрашиваю датчик в цикле, между опросами задержка 20 мс. Этого достаточно для заряда? Пробовал 50 мс, разницы не заметил, но утверждать на 100% не буду.

А искать можно быстро.. Вот, например...
http://www.efind.ru/icsearch/?search=ad627
Энтомолог
Хочу добавить, на резисторы, которыми вы получаете опорные напряжения надо тоже "повесить" конденсаторы.
Antarius
Извините чайника, а между какие выводами конденсатор вешать?
Между регулируемым выводом и землей? А зачем?
Марк_Я
Цитата(Antarius @ Jan 11 2008, 11:03) *
Что касается времени заряда конденсатора, я опрашиваю датчик в цикле, между опросами задержка 20 мс. Этого достаточно для заряда? Пробовал 50 мс, разницы не заметил, но утверждать на 100% не буду.


Если Вы не трогаете входной коммутатор, то и 20 мкс достаточно для заряда УВХ...
Antarius
Цитата(Марк_Я @ Jan 11 2008, 21:13) *
Если Вы не трогаете входной коммутатор, то и 20 мкс достаточно для заряда УВХ...

Входной коммутатор - это регистр ADCON?
Я его один раз перед циклом опросов трогаю, но потом жду 100 мс.
Энтомолог
Цитата(Antarius @ Jan 11 2008, 20:40) *
между какие выводами конденсатор вешать?
Между регулируемым выводом и землей? А зачем?


Именно так - между регулируемым выводом и землей. Для уменьшения пульсаций опорных напряжений. При выборе емкости учитывайте время заряда вашей RC цепочки, т.е. чем больше емкость конденсатора, тем лучше (при прочих равных), но при этом увеличивается время выхода устройства в рабочий режим после подачи питания.
XVR
Добавлю свои 5 коп. автору темы:

ОЧЕНЬ рекомендуется (а при вашем диапазоне входных напряжений и вообще обязательно smile.gif ) переводить процессор в режим SLEEP во время измерения напряжения - ядро процесора довольно заметно шумит, его остановка позволяет от этого шума избавится.
dac
Цитата(XVR @ Jan 15 2008, 18:48) *
ОЧЕНЬ рекомендуется (а при вашем диапазоне входных напряжений и вообще обязательно smile.gif ) переводить процессор в режим SLEEP во время измерения напряжения - ядро процесора довольно заметно шумит, его остановка позволяет от этого шума избавится.


в свое время проводил эксперименты, даже усреднение на 4 полностью устраняет шум от ядра (по крайней мере небыло разницы между SLEEP и нормальным режимом, в обоих случаях +- 0,5 младшего разряда), гораздо больше зависит от правильной разводки и качества опоры. например при использовании двухвыводных ион (по типу стабилитронов, LM285, tl431) очень сказывается ток через этот стабилитрон, чем меньше ток тем больше шум. Поэтому конденсатор в опору однозначно необходим (между выводом опоры и землей).
При выборе делителя также необходимо учитывать требуемый ток потребляемый пиком от опоры, а лучше включить ОУ в режиме повторителя м/у делителем опорного и входом опоры пика.

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

еще один момент - если Вы собираетесь ставить промежуточный инстр усилитель, тогда однозачно стоит поднять опору до 5В а низ опоры заземлить, точноть при этом так же лучше будет (см. даташит на пик)
Antarius
Спасибо!
Попробую.
Правда никогда не сталкивался с режимом Sleep.
Как я понимаю, это режим пониженного энергопотребления.
Но программа все равно выполняется, правильно?
И опрос ацп мне вести в этом режиме?
А как потом вывести контроллер из этого режима, прерыванием от таймера, запущенного перед циклом опросов?

Опорное напряжение от REF195.
Tanya
Цитата(Antarius @ Jan 16 2008, 11:29) *
Спасибо!
Попробую.
Правда никогда не сталкивался с режимом Sleep.
Как я понимаю, это режим пониженного энергопотребления.
Но программа все равно выполняется, правильно?
И опрос ацп мне вести в этом режиме?
А как потом вывести контроллер из этого режима, прерыванием от таймера, запущенного перед циклом опросов?

Опорное напряжение от REF195.

Да не мучайтесь... Вы же атмосферное давление измеряете - оно не скачет... Можете хоть за 10 секунд накапливать-усреднять.... Тем более, что усилитель у Вас уже есть.. (?).
Важнее правильно запитать все это хозяйство - должен получиться мост... Второе плечо из потенциометра проволочного. Опорное на АЦП с питания моста. Оно может быть и не сильно стабилизированным, наверное... от датчика зависит...
dac
еще пара моментов

вы в курсе что в этом диапазоне датчик обеспечивает 5,5 разрядную точность?

MPX4115 по даташиту обеспечивает стабильность 0,5% от рабочего диапазона т.е. 25мВ) в требуемом диапазоне 3,8...4,2В (даже считая что вы его правильно усилили и оцифровали) сам датчик обеспечит точность всего в 45 единиц
(4,2-3,8)/0,025 = 45 - результат округленно, но это ваша реальная стабильность от датчика,
без учета основной точности в 1,5% sad.gif
даже если вы и получите стабильные цифры, они мало общего будут иметь с реальным давлением

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

есть еще один вариант, именно по оцифровке, искусственно получить 12 битный результат по принципу: сделать 16 десятибитных измерения, затем поделить на 4. Но это не повысит реальную точность датчика, хотя может позволить избежать применения дополнительных элементов, сохранив разрядность, примерно 9 бит в диапазоне 3,8...4,2В.

а потом еще нужное кол-во таким образом полученных 12битных результатов усреднить на любом интервале времени

и по усреднению - лучше всего делать 16 отсчетов за 20мс , т.е. с интервалом 1,25мс - в этом случае вы хорошо отфильтруете помеху 50Гц или в принципе, с любым интервалом кратным 10мс - получите тот же результат
XVR
Цитата(Antarius @ Jan 16 2008, 11:29) *
Спасибо!
Попробую.
Правда никогда не сталкивался с режимом Sleep.
Как я понимаю, это режим пониженного энергопотребления.


Угу, совсем пониженного smile.gif Ядро останавливается

Цитата
Но программа все равно выполняется, правильно?
Нет

Цитата
И опрос ацп мне вести в этом режиме?
Да

Цитата
А как потом вывести контроллер из этого режима, прерыванием от таймера, запущенного перед циклом опросов?
Прерыванием от АЦП по окончанию преобразования
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.