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



първо да припомним каква е разликата между ляво и дясно подравняване от предния урок.



ляво подравняване на резултата - използва се само регистъра ADRESH, като първите два бита /които са последните от регистъра ADRESL/ не се използват.

защо първите два бита не ги използваме в повечето случаи ?

сега ще отговорим на този въпрос.
първо - значи при въртенето на потенциометъра в двете посоки към увеличаване или към намаляване промяната на тези два първи бита /при ляво подравняване/ се променят прекалено бързо и числата получени от тях са прекалено малки за да ни послужат за нашите задачи.
второ - в нашата практика ще ни се налага по често да използваме само ADRESH регистъра защото той е със достатъчна резолюция в измерването. регистъра е 8 битов, това означава че имаме 255 стъпки в измерването на който и да е сигнал. ако сигналите са високо честотни примерно над 10 мегахерца /MHZ/, което ги прави много бързи и трябва да се измерва с голяма точност 10 битов регистър това са 1024 стъпки във процеса на измерване на аналоговия сигнал.

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

имам идея да направя АЦП конвертор който да показва измерената стойност както във бинарен формат /11001101/ така и във десетичен едновременно. но това е доста сложен софтуер, който първо трябва да се запознаем със управлението на LCD/лсд/ индикаторите и тогава ще съберем цялата картинка на едно като пъзел ;).

така, да следваме процедурата показана във пдф файла за измерване на ацп конвертора. намирате във пдф файла следният текст :

ADC Operation - STARTING A CONVERSION

To enable the ADC module, the ADON bit of the
ADCON0 register must be set to a ‘1’. Setting the GO/
DONE bit of the ADCON0 register to a ‘1’ will start the
Analog-to-Digital conversion.

COMPLETION OF A CONVERSION
When the conversion is complete, the ADC module will:
• Clear the GO/DONE bit
• Set the ADIF Interrupt Flag bit
• Update the ADRESH and ADRESL registers with
new conversion result

я да преведем тука това парче текст.

значи, превод : за да разрешите АЦП модула, битът ADON във регистъра ADCON0 трябва да е установен в 1. установяването на GO/DONE битът от ADCON0 регистъра във 1 ще стартира конвертирането от аналогов към цифров сигнал.

когато конвертирането завърши, АЦП модулът ще изчисти GO/DONE битът, ще установи ADIF флага за прекъсване битът и ще запише новият резултат във регистрите ADRESH и ADRESL.

така, значи както се вижда от пдф файла процесора ще свърши цялата работа по измерването като от нас се иска само да вдигнем два бита в единица 1. това е добре но как ще видим ние резултата от измерването дали в вярно, колко е като стойност и как да настройм потенциометъра за да се получи желаният резултат. това ще стане като напишем правилно кода на нашият софтуер, проверим действието му на тестова платка, направим симулация в протеуса и ако сме толкова добри в програмирането и електрониката може да си свържем и едно лцд индикаторче да ни показва ко толкоз мери тва ацп разбийш ли :)

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

тука има един текст във пдф файла кйто описва коректно прцедурата при настройка на софтуера как да се измери и запише резултата от измерването. има и код на асемблер, но ние ще дадем коректен код на С/С++ който ще ви работи коректно за вашите примери.



ADC CONVERSION PROCEDURE
This is an example procedure for using the ADC to
perform an Analog-to-Digital conversion:
1. Configure Port:
• Disable pin output driver (Refer to the TRIS
register)
• Configure pin as analog (Refer to the ANSEL
register)
• Disable weak pull-ups either globally (Refer
to the OPTION_REG register) or individually
(Refer to the appropriate WPUx register)
2. Configure the ADC module:
• Select ADC conversion clock
• Configure voltage reference
• Select ADC input channel
• Turn on ADC module
3. Configure ADC interrupt (optional):
• Clear ADC interrupt flag
• Enable ADC interrupt
• Enable peripheral interrupt
• Enable global interrupt(1)
4. Wait the required acquisition time(2).
5. Start conversion by setting the GO/DONE bit.
6. Wait for ADC conversion to complete by one of
the following:
• Polling the GO/DONE bit
• Waiting for the ADC interrupt (interrupts
enabled)
7. Read ADC Result.
8. Clear the ADC interrupt flag (required if interrupt
is enabled).


превод :
АЦП процедура конвертиране
този пример ще бъде използвам за АЦП модулът за да осъществи аналогово към цифрово конвертиране:
1. конфигуриране на порта или само пин от даден порт:
а/ забранете изходните драйвери във TRIS регистъра.
б/ настройте пинът като аналогов във ANSEL регистъра
в/ забранете пул-ъп резисторите във OPTION_REG регистъра за целия порт или за даден пин поотделно
2. конфигуриране на АЦП модула
а/ изберете АЦП честота за конвертиране във ADCON1 регистъра. // забележка : по подразбиране честота е настроена да бъде два пъти по ниска от работната на процесора. в нашият пример работната честота на процесора ще бъде 8 мегахерца, значи измерването ще се извърши на 4 мегахерца, което е даже много бързо за този пример.
б/ настройте еталонното напрежение.
в/ изберете АЦП пин който ще измервате.
г/ включете АЦП модула.
3. настройване на прекъсванията /по желание/
а/ изчистете ADIF /бит/ флага за прекъсванията
б/ разрешете периферийните прекъсвания /бит/
б/ разрешете глобалните прекъсвания /бит/
4. изчакайте задължителното време за преместване на избрания канал
5. стартирайте конвертирането с установяването на GO/DONE битът
6. изчакайте АЦП конвертирането да завърши по един от двата начина :
а/ със смяна на GO/DONE в състояние нула /0/
б/ изчакване на АЦП прекъсване / ако са разрешени/
7. прочетете АЦП резултата във регистрите ADRESH:ADRESL
8. изчистете АЦП флага за прекъсване / ако са разрешени.

сега по план график след прилагането на коректен код всичко трябва да е ОК и светодиодите да светнат всеки според стойността на потенциометъра.

тука ще покажа и една грфика от пдф файла която трябва добре да разгледате и да помислите какво е нарисувано на нея. във следващия урок ще допълна графиката със малко обяснения за да стане по ясна кое за какво е написано.

така, да продължим урока за АЦП конвертора със определяне на границните на измерваното напрежение, както и със резолюцията на измерване. настройките са достатъчно много за да имат програмистите избор при получаване на качествен краен резултат.

ще дам линк към статия която е ни бъде полезна.
http://www.circuitsgallery.com/2015/04/digital-voltmeter-using-pic-microcontroller.html

ето и още един линк директно от микрочип с който можете да се научите да конфигурурате АЦП модула с код конфигуратора на микрочип

http://microchipdeveloper.com/8bit:emr-adc

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

да започнем със графиката на ацп конвертора който е описан във пдф файла на процесора.



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

CHS<4:0> - както е видно с тези 5 бита от регистъра можете да изберете от кой пин на процесора /на който е обозначено че има ADC input да свържете някакъв вид подавано аналогово напрежение/сигнал до 5 ВОЛТА !!!!!/. има забележка която ви показва да прегледате ADCON0 регистъра за да видите за съответния брой пинове на процесора колко на брой са аналоговите канали.

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

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

FVR буфера може да бъде използван за задаване на фиксирано стабилно напрежение със точно пределена стойност независимо от захранващото. това се използва при употреба на компараторите на процесора, може също да бъде използвано за АЦП, ЦАП и други задачи.

сега да дадем описание на битовете за конфигуриране на опорното/еталонно напрежение и каква роля играе то за измерването на нашето входящо напрежение/сигнал.

опорното напрежение ни е необходимо за задаване на границите на измерването. или казано направо, границите в които ние ще мерим са от нула/0/ волта до плюс пет волта /+5/. за това входящото напрежение на аналоговия пин на процесора НЕ ТРЯБВА ДА НАДВИШАВА ПЛЮС ПЕТ ВОЛТА !!!!! ако по някаква причина се налага да се мери напрежение и/или аналогов честотен сигнал с по голям волтаж от плюс пет волта, ще направите делител на напрежение със резистори със точност 1% или по-точни за да можете да намалите входящото напрежение към процесора до плюс пет волта !!!! във линка койо съм дал в началото има графика която показва как се прави делител и как се смята. ще дадем обяснение за делителите като дойде ред за това.

VREF+/- >> тези битове се изполват когато се налага да се мери биполярно напрежение от източник с възможност за подаване на такова опорното/еталонно напрежение. това обикновенно са операционни усилватели, биполярни захранвания, биполярни честотни генератори и други апаратури. описаният бит ADNREF със сответната двоична стойност ще превключи входа на АЦП блока съответно към двата възможни варианта. веднъж към VREF- или към VSS/ground/маса/електрическа 0 на схемата/.

както се вижда всеки от двата бита има и точно определени входящи пинове към които трябва да се свърже съответното опорното/еталонно напрежение.

VDD/VSS това са битовете които ни трябват на нас тъй като ние ще използваме за нашето измерване захранващото напрежение на процесора. VDD битът е захранващият плюс пет волта след стабилизатора и филтриращите кондензатори, а VSS битът е общата маса/нула на схемата. тука имаме три варианта в двойчна стойност. ADPREF битът отговаря за включването на АЦП блока към VDD/плюс на захранването +5 волта/ или към FVR буфера или към VREF+ пина на процесора за входящият плюс на биполярното захранване.

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

сега е време да кажем и най-важният бит който пуска самият АЦП блок да измери напрежението и/или честотата или какъвто и да е друг аналогов сигнал

GO бит - това е битът GO който се стартира в програмата като поредица от команди за да може АЦП блока да започне измерването и когато този бит се установи в нула/0/ нашето измерено напрежение ще се запише във регистър.

ADFM битът е този който казва по какъв начин да се запише резултата във регистърът за запис.

како се вижда регистрите за запис са два ADRESH и ADRESL. това са два регистъра по 8 бита което прави цял регистър от 16 бита. само че ние имаме по задание на процесора можем да използваме само 10 бита. така, тука идва на помощ ADFM битът. от пдф файла става ясно че, ако ADFM битът е равен на единица/1/ ще бъдат активни битовете на целия ADRESL регистър както и два бита от ADRESH регистъра което прави точно 10 бита. или тази настройка наричаме дясно подравнени битове в регистъра за резултат.

другата стойнот на ADFM битът е когато то е равен на нула/0/. при тази опция 10 бита който можем да използваме от регистъра за резултат на АЦП ще бъдат целият 8 битов /7:0 битове/ регистър ADRESH както и последните два бита 7:6 от регистъра ADRESL. обърнете внимание че съм дал стойностите на битовете във двойчен формат както е записано в пдф файла на процесора.

ако разгледате внимателно пдф файла с описанието на двата варианта на регистъра може да се запитате защо в таблицата на регисъра ADRESH са записани от 7:0 битовете, а на горния ред пише ADRES<9:2> и съответно за регистъра ADRESL пак във третият ред има номер 7:0, а на горния ред са дадени последните два бита като ADRESL<1:0> а предходните младши битове са забранени.

това е защото това на кой край да са подравнени битовете се определя от ADFM битът. когато е равен на единица/1/ битовете в двата регистъра са дясно подравнени и най старшите битове от регистъра ADRESH са неактивни. и в другият вариант когато ADFM битът е равен на нула/0/ или това са ляво подравнени битове на двата регистъра неактивни са младшите битове на ADRESL. разпечатайте тези четири страници изрежете регистрите с ножица и ги наложете един до друг според варианта на бита ADFM. ще видите какъв е резултата от подредбата и кои битиве кога са активни и неактивни.

ето и един цитат от пдф файла директно
if (ADFM = 0) // left side
{
ADRESH<9:2>: ADC Result Register bits
Upper 8 bits of 10-bit conversion result
ADRESL<1:0>: ADC Result Register bits
Lower 2 bits of 10-bit conversion result
} // page 147 from pdf file for pic16f1827/47

if (ADFM = 1) // right side
{
ADRESH<9:8>: ADC Result Register bits
Upper 2 bits of 10-bit conversion result
ADRESL<7:0>: ADC Result Register bits
Lower 8 bits of 10-bit conversion result
} // page 148 from pdf file for pic16f1827/47


ето една нагледна графика която показва точко какво представлява ляво и дясно подравнен резултат спрямо бита ADFM

 

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


аналогов към цифров преобразувател / конвертор / - ADC analog to digital convertor

пик процесорите, както и всички други предлагат възможност за цифровизиране на всякакви аналогови сигнали със определена точност на преобразуване. в различните фамилии процесори точността може да варира между 8, 10, 12 и 14 бита. има и процесори в които точността на измерване на аналоговит сигнали може да достигне и 32 бита.

каква е прецизността на адц конвертора на конкретния процесор е записано във съответния му пдф файл направен от производителя.

в нашият случай ще разгледаме процесора 16F1827/47 със който сме започнали уроците за програмиране.

първо да кажем и да покажем какво представлява цифровизирането на аналоговите сигнали

http://www.microcontrollerboard.com/analog-to-digital-converter.html

една статия която ще ни помогне да напишем нашият урок




няколко различни графики които показват различно битово преобразуване на аналоговия сигнал към цифрова стойност.




няколко различни графики които показват различно битово преобразуване на аналоговия сигнал към цифрова стойност.




да започнем със настройка на основните регистри и портове за да може да използваме адц функцията на даден пин според схемата която сме направили.

в схемата на процесора 1827 ясно се вижда че първият аналогов порт който можем да използваме се намира на RA0 в порт А - пин номер 17. според таблицата с разположениео на пиновете във пдф файла, този пин има и други функции. ние ще изберем да ползваме само аналоговият вход като това ще бъде указано във TRISA /входове или изходи/ регистъра и във ANSELA /аналогови или цифрови/ регистъра. след това във кода който ше дадем като пример ще добавим коментари за по-голяма яснота кой регистър какво прави към пиновете на процесора. този процесор има възможност да укаже само на един порт от всички аналогови да бъде използван за адц конверсия. имайте предвид че във някои процесори когато инициализирата адц блока имате таблица по която можете да укажете кои да бъдат цифрови и коои аналогови входове или изходи. в някои процесори стартирането на адц блока стартира всички аналогови портове. внимателно прочетете пдф файла на съответния процесор за да настроите необходимите ви пинове за работа според вашата схема.

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

какво представлява цифровизирането на сигнал от аналогов вход ?

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



ще направим и малка симулация в протеуса за да се покаже как работи софтуера. за всички които искат да направят схемата на живо, ще дам и проект на платка със списък на елементите и софтуер със сорс код за промяна по желание и допълнителни функции за добавяне от ваша страна.

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

Двоична бройна система от Уикипедия, свободната енциклопедия >> ЛИНКА Е ТУКА <<<
ето и линк към страницата в уикипедия за този велик учен, измислил тази супе система за превръщане на числата от десетична в двоична бройна система >>> Готфрид Лайбниц
Двоичната бройна система (също и бинарна система) е позиционна бройна система с основа 2, при която числата се изобразяват само с помощта на две цифри: 0 и 1.

така, прочетете внимателно статията за двоичната система, като обърнете внимание на частта за Готфрид Лайбниц <<< . в тази част е дадена една таблица която е била измислена от този немски математик, учен и т.н. още през 1679 година.

изключително полезна ТАБЛИЦА за употреба при превръщане на числа от десетична към двоична /бинарна/ система. има даже и няколко примера с числа.

Изчисленията му се показват със следната таблица. Удебелените десетични числа горе представляват стойността на кореспондиращата единица, като се попълват нарастващо от дясно наляво; а в ляво е сборът от произведението на тези стойности. В таблицата се получава готовия бинарен код:

 

 

Десетична система

Продукт по десетичната система 512 256 128 64 32 16 8 4 2 1
6         0 0 0 1 1 0
48         1 1 0 0 0 0
27           1 1 0 1 1
4             0 1 0 0
805 1 1 0 0 1 0 0 1 0 1

както се вижда което и число да изберете от множеството можете с тази система да го превърнете във двоично, като правилно пресмятате сумата от всеки бит в десетичната скала. които числа участват във сумата за постигане на резултата получават статус 1, ако които не статус 0. тази система е доста по добра от стандартната на която учат във всички училища в електрониката и програмирането. по точна, по лесна и по прегледна както и в употреба на доста големи резултати от представените в примера. удобна може да бъде използвана и в програмирането на процесорите където всеки 8 битов или 16 битов порт може да бъде дефиниран като сумата от десетичните числа на всеки бит е  равна на най-голямото десетично число за този порт. пример ако имате 8 битов порт А на процесора 16F1827/47 и дефинирате неговите битове със числата от 1 до 128 както в таблицата, ще можете в масив от данни да сумирате две числа и да изпратите резултата директно към порта на процесора.

това ще доведе до светване на порта във същата комбинация в единици 1 и нули 0 в която е двоичният резултат на даденото число. в горната таблица можете да си направите няколко примера с числа, като първо сумирате числата от 1 до 512 за да видите до колко големи числа можете да превръщате с тази таблица.

следващият въпрос е >> кое е следващото число което следва след 512 в редицата и съответно каква ще бъде сумата на числата за да знаем границата до която можем да превръщаме числа в бинарна стойност.

директен програмен код за употреба във пик процесорите използвайки тази система ще дадем когато дойде ред за урока за управление на масиви от данни. тъй като това е малко по трудна част от програмирането, ще се изисква внимание и прочитане на няколко предварителни статии и уроци от други автори. директен С/С++ код също ще има както за процесорите, така и за уиндоус ще дадем пример в компилатора на пелес С/С++. чети внимателно, печелиш обезателно. ако има нещо неясно емайла е ясен ;)

нов проект - компилиране в MPLAB

структурата на вашият нов проект трябва да изглежда по този начин във директорията на проекта

 
 

излгед на прозореца на компилатора със структурата на файловете във проекта

 



графика от симулацията на процесора и новият софтуер във протеус

 
 

линк за сваляне на рар файла със целия проект >>>> www.karadev.net/basto/new_project_1827.X.rar