| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Въпрос относно ADC на ПИК http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=9819 |
Страница 1 от 2 |
| Автор: | stoyanoff [ Сря Яну 25, 2012 11:56 am ] |
| Заглавие: | Въпрос относно ADC на ПИК |
Ще ползвам въпросното ADC, но покрай него контролерът трябва да прави и други неща и ми трябва малко помощ за някой функции. Използвам CCS v4.078. Знам как да настроя ADC-то, но ме интересуват някой функции, които открих в хелпа. Както споменах искам освен това преобразуване контролера да прави и други неща. Открих функцията ADC_done(). Според обяснението тя връща единица, когато АЦП модулът е приключил с работата си. Обаче в примерите за АЦП, които видях никъде не намерих функция за старт на преобразуването. Пример: setup_adc_ports(AN0); set_adc_channel(0); setup_adc(ADC_CLOCK_DIV_32); while(1) { delay_us(20); //wait for the acquisition time value=read_adc(); delay_us(4); //A minimum wait of 2 TAD(=1,6µs) is //required before next acquisition starts. } Кога започва самото преобразуване??? Когато се извика value=read_adc() или още когато се настроят канала и източника на честота??? Мога ли да постоя програма, в която просто да проверявам дали АЦП е готово с ADC_done() и ако е прочета информацията примерно с value=read_adc()?? Благодаря! |
|
| Автор: | Cekins [ Сря Яну 25, 2012 4:35 pm ] |
| Заглавие: | Re: Въпрос относно ADC на ПИК |
Първо кажи с кой ПИК точно мислиш да работиш. Това е защото има такива, които сами (почти) всичко правят и такива, които не съвсем. Конкретно на въпроса ти : АЦП-то има прекъсване. Генерира го когато свърши с конверсията. Настройката е в някой от ADCON или PIE регистрите. В прекъсването само изчиташ стойността която е семплирало и толкова. Обаче ако е от по старите (16-ки и старите 18-ки) ще трябва ти да се грижиш за Aquisition time - а. Новите 18-ки (примерно 18F2520 и подобни) това го правят също автоматично. 24-ките пък са още по-добре - те могат да сканират определен брой канали и тогава да генерира прекъсване. И забрави какво може компилатора - това е загуба на време. Много по елегантно стават нещата като се правят директно с регистрите. Компилатора само да ти генериа If, For, While, Case и някой по засукани сметки кооито не си заслужава да се правят чак ръчно. |
|
| Автор: | rumen65 [ Сря Яну 25, 2012 5:29 pm ] |
| Заглавие: | Re: Въпрос относно ADC на ПИК |
В хелпа на този компилатор е описано доста добре: read_adc( ) Syntax: value = read_adc ([mode]) Parameters: mode is an optional parameter. If used the values may be: ADC_START_AND_READ (continually takes readings, this is the default) ADC_START_ONLY (starts the conversion and returns) ADC_READ_ONLY (reads last conversion result) read_adc( ) без параметър е равно на read_adc( ADC_START_AND_READ) , което стартира меренето, чака докато приключи и връща резултата. На повечето пикове преобразуването е няколко микросекунди, мисля до 20, но това е описано в документацията на процесора. Извикването на функцията с втория параметър само стартира мерене без да връща резултат от него, а с третия, връща само резултата от предното стартиране и измерване. |
|
| Автор: | Cekins [ Сря Яну 25, 2012 6:28 pm ] |
| Заглавие: | Re: Въпрос относно ADC на ПИК |
Винаги съм се дивял колко безумно може да изглеждат ADC, PWM и разни други хардуери на пик вкарани като функции в компилатора. Всичко това нещо (ако е с по-новите ADC) се свежда до няколко команди. Всичките са сетване на регистри и две за изчитане на резултата в някъв буфер евентуално. Останалото автомат, с прекъсване и няма никаква загуба на микросекунди. При прилична честота на проца, едно измерване е около 200-300 цикъла. Дпълнително никой не знае тия инструкции колко овърхед код генерират. |
|
| Автор: | stoyanoff [ Сря Яну 25, 2012 9:56 pm ] |
| Заглавие: | Re: Въпрос относно ADC на ПИК |
Това за хелпа го видях и мисля, че го направих. Опитах да изтрия темата, даже писах на админ, но явно не е дало резултат. Но след като си стой, искам да попитам още нещо. Понеже ще контролирам изключително бърз процес ме интересува, ако започна преобразуването и докато трае то се промени входната величина(напрежение), това ще се отрази ли на резултата??? |
|
| Автор: | Cekins [ Сря Яну 25, 2012 11:58 pm ] |
| Заглавие: | Re: Въпрос относно ADC на ПИК |
Колко бърз? А и не каза кой е пика. Повече могат да докарат 100kSp/s. Минималното време за Aquisition е от 2,5 до към 5 микросекунди. Ако през това време входния сигнал се промени, самплинг кондензатора ще го интегрира. С други думи ако към края на семплинга се измени драстично, кондензатора няма да може да се изравни с входното ниво. Също много голямо значени има изходното съпротивление на източника - препоръчително е да е под 5кОм, а най-добре да е буфериран с ОУ. |
|
| Автор: | ¶ [ Чет Яну 26, 2012 12:38 am ] | |||||||||
| Заглавие: | Re: Въпрос относно ADC на ПИК | |||||||||
По принцип термини като изключително бърз, доста бавен и други подобни не дават полезна информация, защото има процеси където ти трябва милиони семпли в секунди, има и такива където е достатъчно да мернеш 1-2 пъти в секунда. Във всички случаи честотата на измерване трябва да ти е минимум 2 пъти по-голяма отколкото честотата на входния сигнал ... АЦП-то вътре има S/H ( Измери/Запомни ) схема преди същинския конвертор. Преди всяко измерване S/H схемата "записва" стойността на входното напрежение в един кондензатор, след като приключи "записа" входната верига се разкачва от кондензатора и към него се закача конвертора, след което следва процеса на преобрузаване на аналоговото напрежение върху кондензатора до цифров резултат. Така че стартираш ли конвертирането входното аналогово напрежение може да се променя колкото си иска - то вече не е свързано към схемата на АЦП-то. Отделно трябва да помислиш колко време трябва да продължи S/H процеса - при някои PIC-ове това се прави ръчно от програмиста, при други това се прави автоматично. Струва ми се, че трябва малко да почетеш за да ти се изяснят нещата кое в каква последователност се извършва вътре в АЦП-то. |
||||||||||
| Автор: | Cekins [ Чет Яну 26, 2012 9:57 am ] |
| Заглавие: | Re: Въпрос относно ADC на ПИК |
При всички положения тези неща се правят най-добре с прекъсвания. Съвсем спокойно единия таймер може да се ползваза S/H ако ацп-то не го прави автоматично, а в прекъсването на ацп-то да се изчита резултата. Още повече, че ако е само за един канал ще е сууупер елементарно. Ще има 10-тина команди дето ще отработват целия процес, а през времето S/H и sampling процесора ще може да си прави каквото трябва. Stoyanoff - остави настрана ацп-то за сега - виждам, че много други неща по черната кутийка не са ти ясни. Хвани един даташийт и го прочети поне 10 пъти. Всяка една периферия може да работи самостоятелно (с малки изключения като I2C-то ама то е друга бира) и всяка периферия като си свърши работата сигнализира на ядрото за това чрез прекъсване. От там насетне нещата започват да изглеждат доста по-различно от това което ти си представяш. И не забравяй - това не е Core I7 с 8GB рам. |
|
| Автор: | stoyanoff [ Чет Яну 26, 2012 2:17 pm ] |
| Заглавие: | Re: Въпрос относно ADC на ПИК |
Благодаря за отговорите! Бяха доста изчерпателни. Само да поясня, че не харесвам варианта с прекъсването поради ред причини свързани с конкретното приложение. Като цяло системата не е толкова проста, колкото съм я представил тук. |
|
| Автор: | Cekins [ Чет Яну 26, 2012 9:10 pm ] |
| Заглавие: | Re: Въпрос относно ADC на ПИК |
Не се заблуждавай - преноса на операции към прекъсвания много облекчава работата на чипа. В момента имам един логер който : мери 5 вътрешни аналогови канала + 2 външни АЦП-та, търкаля дисплей, смята ПИД-ове за регулировки, върти FAT16 (SD карта), комуникация с РС и комуникация с друго пикче. 18-ка на 20MHz - всички времезависими неща по един или друг начин минават през прекъсване. Дисплея, картата, отговорите на заявките на РС-то и други маловажни задачи се обработват когато не прави нищо друго. Така, че всичко е въпрос на разпределяне на задачите. На микроконтролерите именно прекъсванията са им силна страна. Инче вземаш микропроцесор на 2GHz и нямаш грижи... |
|
| Автор: | dan [ Пет Яну 27, 2012 8:46 am ] |
| Заглавие: | Re: Въпрос относно ADC на ПИК |
Cekins, а какво ще стане, ако в система като твоята : 1.Настъпят две прекъсвания едновременно? 2.По време на обработката на някое прекъсване постъпи заявка за едно или повече други прекъсвания? |
|
| Автор: | CarBeta [ Пет Яну 27, 2012 9:59 am ] |
| Заглавие: | Re: Въпрос относно ADC на ПИК |
Изпълнява се прекъсването с приоритет. Ако няма приоритет се изпълнява първото настъпило и веднага след RETFIE се влиза отново в прекъсване и се обслужва и следващото. Споко, програмата няма да кисне само в прекъсвания, като пиянде в кръчма. |
|
| Автор: | ToHu [ Пет Яну 27, 2012 7:56 pm ] |
| Заглавие: | Re: Въпрос относно ADC на ПИК |
Да ползваш Read_adc() не е добра идея, така ще трябва да чакаш край на преобразуването, ADC_read_only пък ми се вижда безсмислена функция, може директно да четеш регистъра на ADC-то. Най-добрият вариант ако ти трябва фиксиран семпъл рейт е да стартираш ADC автоматично по таймер и прекъсването при комплийт да те вкарва в самото четене, така отнема най-малко ресурси. |
|
| Автор: | Cekins [ Пет Яну 27, 2012 8:35 pm ] |
| Заглавие: | Re: Въпрос относно ADC на ПИК |
Е аз за какво говорих досега? Dan, ако искаш чак таква прецизност в тайминга, АЦП-то на 24-ките може да постигне тази прецизност, без абсолютно никъв овърхед. Няколко команди. Оправяш си приоритетите и си готов. |
|
| Автор: | ¶ [ Пет Яну 27, 2012 9:42 pm ] | |||||||||
| Заглавие: | Re: Въпрос относно ADC на ПИК | |||||||||
Тази функция има смисъл, ако искаш кода който ще пишеш, да може да се изпълнява и на други процесори, така ще използваш един и същи сорс код. |
||||||||||
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|