Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

ADC - стабилност
http://mcu-bg.com/mcu_site/viewtopic.php?f=2&t=7553
Страница 1 от 6

Автор:  npelov [ Пон Фев 15, 2010 4:41 am ]
Заглавие:  ADC - стабилност

Използвам PIC16F874A с кварц на 20 MHz и кондензатори 15pF. не съм сложил съпротивлението Rs което е показано в datasheet-а че "може и да трябва". Избрал съм такт на АЦП - Fosc/64:

Код:
ADCON0 -> 0x89 ; 1000 1001
ADCON1 -> 0xC2 ; 1100 0010


Ползвам порт AN1. Дават Tad >=1.6us за да работи АЦП-то стабилно. При такт на АЦП-то Fosc/32 Tad е 1.6 us, а аз съм избрал Fosc/64 - 3.2us.
Ползвам светлинен сензор TSL257.

Проблемът, че показанията много подскачат. Показвам старшия байт (ADRESH) на LCD дисплей и резултата се мени от 25 до 31. При 5/256 (8 битов защото ползвам само старшите 8 бита за сега) едно деление е 19.53 mV. Общо резултата варира с около 117 mV. Показанието на мултицета е около 500 mV и е доста стабилно. Не мърда дори с 1 mV.
Защо АЦП-то ми играе с >10%? На какво може да се дължи. Опитах с различни кондензатори на аналоговия вход да намаля колебанията, но резултата е същия. Изчаквам 40us преди всяко измерване, защото не знам колко всъщност трябва да изчаквам. Но дори и да не изчаквах правя измерване до 3-4 пъти на сек.

Единственото което ми хрумна е импеданса на източника - пише че не трябва да превишава 2.5 kO

Или е нормално това за вградените АЦП-та. Ако е така предложете ми някой 10+ битов ацп който може да ми държи стабилна стойност +- няколко деления.

Автор:  tgi [ Пон Фев 15, 2010 5:33 am ]
Заглавие: 

Пробвай със серийно 2 кила преди кондензатора (който към 100 нанофарада е добре).

Не познавам точно това MCU, но скачания повече от 1 LSB заради самото ADC не са
нормални.

В случая вероятно става дума за прехвърляне на заряд между съседни входни канали,
повечето ако не всички MCU-та ги правят с charge redistribution ADC-та, затова и
нещо като 2к/100 нано на всеки ползван вход е необходимо в повечето случаи.

Ако и това не помогне, има някакъв аналогов проблем по платката - скачащ ref или
кой знае какво.

Автор:  741 [ Пон Фев 15, 2010 10:18 am ]
Заглавие:  Re: ADC - стабилност

npelov написа:
Защо АЦП-то ми играе с >10%? На какво може да се дължи.

А не допускаш ли, че не "играе" АЦП-то, нито сензорът, ами лампата, дето го осветява? :)
Слагаш филтър да ти изреже всичко над половината от честотата, с която семплираш, след това усредняваш отчетите за време, кратно на 10 милисекунди, за да отрежеш 100-те херца на лампата. Ако избереш кратно на 50 мс, ще подтискаш едновременно 100 и 120 Hz.

Автор:  npelov [ Пон Фев 15, 2010 11:42 am ]
Заглавие: 

Като каза лампата ме озари надежда, но старшите 8 бита показват по сред бял ден стойности от 46 до 50 което си е 3 бита от старшите + младшите 2 = 4-5 бита колебание.
Все пак има разлика от лампата до дневна светлина.

Възможно е останалото да от мрежови колебания, макар че не знам дали мрежовата честота минава през импулсно захранване. Всъщност импулсното захранване не работеше ли на голяма честота - може от там да са смущенията (VDD и VSS са мо VREF+ и VREF-)
Може би е добре да взема отделен източник на опорно напрежение.
Въпреки че малко ме съмнява защото схемата точи до няколко mA, а преди и след стабилизатора има 220 и 100 uF кондензатори. Има и 100nF близо до стабилизатора и друг 100nF близо до крачетата на MCU-то.

Автор:  kiiid [ Пон Фев 15, 2010 11:59 am ]
Заглавие: 

За да не ти играе LSB много важно условие е да имаш много стабилно опорно напрежение за ADC. Твоето какво е? От захранването ли? Не става. Колкото и чисто да си мислиш че е, за 2-3 ADC LSB не става а и нямаш температурна компенсация. Закачи някой опорен източник според Vref което ти е за тоя чип и тогава постни резултата. Търси в Гугъл "Voltage Reference" и си избери нещо което върши работа.

Автор:  npelov [ Пон Фев 15, 2010 12:37 pm ]
Заглавие: 

kiiid, не е стабилно, но е до толкова стабилно че да закрепи дори младшия бит. Това че колебания в мрежата могат да направят измерването неточно не е чак такъв проблем.

Направих следния опит. Сложих 1к тример и въртях. показах и младшите битове за по-голяма точност. Като пусна тримера показанието заспива и много рядко мръдва с 1 lsb. Веднъж го видях да мръдва и с 2 lsb (от 1 до 3), но през повечето време държи стабилно (поне достатъчно стабилно).

от datasheet-a:
The maximum recommended impedance for analog sources is 2.5 kΩ.

Според мен проблема е във изходния импеданс на измервания източник. Въпроса е как да понижа импеданса? Позабравил съм транзисторите ... Коя схема се ползва за нисък изходен импеданс - ОК? Знам че на крайните стъпала слагат ОК. Може би един транзистор с по-линейна характеристика ще свърши работа. Ще съм благодарен на схеми/линкове.

П.П. На практика когато АЦП-то се използва напрежението никога няма да пада до 0. може би минимално ще е около 1-1.5в. Т.е. ако е един транзистор - ще е в линейната част от характеристиката си.

Автор:  741 [ Пон Фев 15, 2010 1:37 pm ]
Заглавие: 

Уфф, референс от захранването, че и импулсен стабилизатор на всичкото отгоре. Да се чуди човек още какво си спестил от постановката. Че на всичкото отгоре не слушаш какво те съветват хората. Защо тогава пускаш тема, като си ги знаеш нещата?

Експериментът с тримера е порнография и не доказва нищо. АЦП мери съотношение между вход и референс. С тримера задаваш на входа напрежение, което е пропорционално на референса. Захранването може и с цял волт да плува, и АЦП-то пак ще отчита един и същ резултат. Ако подадеш стабилно напрежение на входа обаче ще измериш боза.

Направи каквото ти е казал kiiid. Ако нямаш под ръка опорен източник, за проба направи с делител опорно нопрежение на около 80% от захранването с резистори от порядъка на няколко килоома, и сложи няколкостотин микрофарада + 100 нФ кондензатори в паралел към маса. Може да вържеш сериино на референс пина на контролера стотина ома, за да не се разрежда кондензаторът директно през входа когато махнеш захранването.

И не включвай директно кондензатори в изхода на сензора, както си писал, че операционният усилвател вътре може да стане нестабилен. Слагай и сериен резистор, за да нямаш ядове.

Автор:  rumen65 [ Пон Фев 15, 2010 1:54 pm ]
Заглавие: 

Едва ли проблема ти е в изходния импеданс, както го дават в описанието датчика е с изход операционен усилвател. По скоро сигнала от него си излиза със шум, най-добре го виж с осцилоскоп. А това че уреда показва постоянно напрежение, не е критерии. Той интегрира за няколко стотин милисекунди и много силно подтиска смущения с мрежовата честота. Ако и ти направиш интегриране, примерно 200 измервания за 200 милисекунди и след това намериш средната стойност, няма да се променя показанието.

Автор:  npelov [ Пон Фев 15, 2010 2:19 pm ]
Заглавие: 

741 не се дразни. Ценя и вземам в предвид всички съвети. Просто налучквам докато чакам отговори.
Сложих резистор сериино на кондензатора
Oпределено тримера нищо не доказва. взех алкална батерия - мултицета показва 1.44V. Показанието е 72 старши и 1 младши битове -> 72*4+1 = 297. VDD = 5.05V/1024 = 0.004931640625 * 297 = 1.46V Показанието е стабилно.

Друга проба - температурен датчик TC1047A показанието е почти стабилно - играе само 1 лсб.

rumen65 - това е следващата стъпка в графика, но ми се щеше данаправя поне малко по-стабилно отчитане преди да започна със средна стойност.

Ето как мисля да направя средна стойност:
Сумирам 16 измервания и шифт надясно с 4 (4 пъти rrf). Евентуално пробно ще се реши точния брой на измерванията - от 8 до 256, степен на 2. Коментари и съвети тук също са добре дошли.

Код:
BCF  STATUS, C
RRF  highByte ; rotate през Carry
RRF  lowByte
; това n на брой пъти


Възможно ли е самия светлинен датчик да дава колебания. Т.е. да е със слаба резолюция. Всъщност измерен с мултицет има колебания около 4-5 mV (като се има в предвид че най-вероятно мултицета усреднява.). Обаче при температурния датчик колебанието е също 4 mV измерено с мултицет - това е нормално като се има в предвид че има колебания в захранването.

Едно уточнение: след импулсното захранване - 9V има 220 uF кондензатор, после 7805, после 100uF + 100nF на изхода на 7805.

Автор:  npelov [ Пон Фев 15, 2010 2:54 pm ]
Заглавие: 

между другото целта ми е да следя процес който приключва за част от секундата. Светлината намалява от 100% до 20-50% (образно казано) за около 200 до 500 ms и след това спира да намалява (което е края на процеса). Така че не мога да правя много измервания. Трябва за тези примерно 500 ms да мога да спра процеса при зададена стойност, така че да се получат 256 нива на светлината (или колкото е възможно - 64-128). Това прави близо 1-2 ms на измерване. Ако едно измерване е 40 us мога да направя не повече от 16 измервания (степен на 2).

Автор:  741 [ Пон Фев 15, 2010 2:56 pm ]
Заглавие: 

ОК, това с батерията вече е по-сериозно, значи причината не е опорното напрежение.
А това с усредняването принципно върши работа, ама е замитане на проблема под килима. Виж кое ти вкарва тоя голям шум, отстрани го, пък след това усреднявай. Като гледам спецификацията за шума на сензора, не би трябвало да е от него.
Филтриращ кондензатор 100 нФ в захранването плътно до сензора имаш ли? Добави и RC-групата на входа на контролера, както ти е казал tgi.
Горе пишеш, че чакаш 40 мкс преди мерене, ама не става ясно какво чакаш и кога. Постни ако искаш и кода на процедурата по меренето с АЦП-то.

Автор:  npelov [ Пон Фев 15, 2010 3:57 pm ]
Заглавие: 

100nF плътно до сензора нямам - ще сложа. На изхода на сензора има 330pF + 1кО. Може би не са най-подходящите стойности ...

Код:
startAdc   macro
   callw   delayus,   .40
   banksel   ADCON0
   bsf      ADCON0, GO
   endm
waitAdc      macro
   banksel   ADCON0
   btfsc   ADCON0, GO_DONE
   goto   $-1
   endm


Тия двата макроса ги пускам един след друг.

40 us закъснение е за да съм сигурен че всичко е наред - кондензатора е зареден и т.н.

Цитат:
Equation 23-1: Acquisition Time
TACQ = Amplifier Settling Time +
Holding Capacitor Charging Time +
Temperature Coefficient
=TAMP + TC + TCOFF



При 10kO импеданс на източника го дават 19.72 µs
При 50Ом = 10.61 µs
Когато няма горна граница винаги удвоявам за да съм сигурен


Ето инициализацията:
Код:
   ; ADC initialization

   banksel   ADCON1
   movlw   0x02   ; 0000 0010;   portE - dig, left aligned
   movwf   ADCON1
   bcf      ADCON1, 7 ; 1 - right aligned, 0 left aligned
   bsf      ADCON1, 6 ; ADCS2: if 1 -> ADCS1:0 ->10 -> Fosc/64, if 0 -> Fosc/32


   banksel   ADCON0
   movlw   0x89   ; 1000 1001
   movwf   ADCON0

Автор:  npelov [ Вто Фев 16, 2010 12:55 am ]
Заглавие: 

Захраних сензора с батерия - никаква промяна. Вадя полезни 4 бита. Не знам друго от какво може да е.

Ще взема TSL230BRP и ще броя импулси.

Автор:  Edesign [ Вто Фев 16, 2010 7:27 am ]
Заглавие: 

А осцилоскоп за да погледнеш сигнала все пак нямаш ли?
Като гедам всичко си направил ОК.

Но на втора страница в пдфа във втората таблица има нещо интересно :
V Maximum output voltage swing
VDD = 4.5 V, No Load 4.49V
VDD = 4.5 V, RL = 10 k 4.2V

Това какво ли трбява да значи...... Входното ти съпротивление на АЦПто е около 10к. Да не би когато прави измерване да шашка нещо изхода. Това е много кратък процес - микросекунди и без осцилоскоп с мултимер няма как да го видиш.

Можеш да сложиш 50к последователно на входа да видим какво ще стане или най-добре буферирай с един ОУ (ЛМ358 например)

Автор:  relsys [ Вто Фев 16, 2010 10:00 am ]
Заглавие: 

От значение е и интервалът през който се правят измерванията.

Страница 1 от 6 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/