# PIC mikrokontrolleri >  Kā pareizi izmantot A/D

## Slowmo

Ir saslēgti rezistori virknē, kur aiz katra rezistora ir spiedpoga, kas savienota ar zemi. Ideja tāda, ka tiek sasummētas rezistoru pretestības līdz nospiestai pogai. Ja nav nospiesta neviena poga, tiek iegūta visu virknes rezistoru summa.
Uzdevums ir ar PIC palīdzību noteikt, kura poga nospiesta (jāuztaisa sava veida ommetrs). Elektronikā man ir tikai pamatzināšanas, tāpēc vajag palīdzību, kā pareizi šo pasākumu pieslēgt pie PICa analogās ieejas (A/D). Ja pareizi saprotu, tad, ja šajā ieejā pieslēgs barošanas spriegumu (5V), 10 bitu ACP rādīs maksimālo vērtību (1023). Bet kā aprēķināt, šo vērtību, ja starp barošanas spriegumu un A/C ieeju virknē tiek pieslēgta pretestība, piemēram, 54 Omi. Un vai vispār var tādā veidā slēgt klāt rezistorus pie A/D? Cik saprotu, jāzin A/D iekšējā pretestība, lai kaut ko varētu rēķināt.
Otra ideja man ir taisīt sprieguma dalītāju, kur rezistoru virkne caur vēl vienu virknes rezistoru tiek pieslēgta pie zemes. Un tad, ja pareizi esmu izštukojis, A/D būtu jāpievieno pirms šī rezistora. Sareķināju, ka ja izmanto 1K rezistoru, sprieguma kritums uz to pie 54 Omu pārejās ķēdes būs aptuveni 4,7V, Tātad - attiecīgi A/D ieejā aptuveni 0,3V jeb cipars 61, pārvēršot spriegumu vērtībā.
Kā būs pareizi?

----------


## karloslv

uzskati, ka AD ieejai ir praktiski bezgalīga pretestība, līdz ar to pirmajā variantā vienmēr nolasīsi 5V vērtību. otrajā jau ir pareizs domu gājiens - strāvai kaut kur ir jāplūst. viss ir pareizi, tikai nolasīsi nevis 0,3V, bet 4,7V jeb aptuveni 963. ņem gan vērā, ka AD atbalsta spriegums var nesakrist tieši ar 5,00V.

----------


## Slowmo

Tātad, lai nolasītu 0,3V nevis 4,7V man rezistors jāslēdz nevis pirms zemes aiz rezistoru ķēdes, bet gan pirms ķēdes (pie barošanas sprieguma), pareizi?
Kā pareizi izvēlēties papildu pretestību? Ar rezistoru ķēdes palīdzību varu iegūt 54-5057 Omus. 54 Omi, ja nospiesta poga uzreiz aiz pirmā rezistora, 5057 Omi - nav nospiesta neviena poga.

----------


## karloslv

Pats sajaucu - ja tev visas pogas ir saslēgtas pret zemi, protams, vajadzēs virknes galu pie +5V pievilkt. AD nolasa spriegumu uz dalītāja, kas tajā brīdī izveidojas (54-5000 omu un 1k, piemēram).

----------


## Slowmo

Izveidoju aptuvenu shēmu (pievienotajā failā). Vai tā ir pareizi?
Bet vienalga paliek jautājums - kāds ir R4 optimālākais nomināls? Ja izvēlas pārāk lielu, uz to kritīs lielākā sprieguma daļa un nevarēs atšķirt tuvāko pogu nospiešanu (pārāk mazs spriegums paliek pāri). Pārāk mazs nomināls savukārt nozīmēs, ka uz A/D visu laiku būs spriegums, kas tuvs 5V (būs mazs dinamiskais diapazons).
Pašlaik, ja izmantoju 1k rezistoru, sanāk, ka pirmās pogas nospiešana rada 0,26V (skaitlis 53), otrās - 0,64V (131), pēdējās - 3,55 (522). Ja nav nospiesta neviena poga - 4,17V (853). Laikam jau 1K ir gana labs...

Shēmā nav attēlotas pārējās 3 pogas, taču tas lietas būtību nemaina...

----------


## jeecha

R3 ir diezgan lieks, ja neviena poga nav nospiesta, vinsh tikai sprieguma daliitaajaa teeree straavu. Ja vinja nebuutu tad laikaa kad neviena poga nav nospiesta A/D pins vienkaarshi tiktu uzvilkts uz baroshanas spriegumu.

Iesaku no fizikas stundaam atcereeties kaa reekjina izejas spriegumu rezistoru sprieguma daliitaajaa (Vout=Vin*R2/(R1+R2)) un vienkaarshi izreekjinaat pretestiibu veertiibas lai sprieguma solis starp katru pogu buutu maksimaali liels.

Starp citu - kaadeelj ir nepiecieshamiiba lasiit pogu staavokli tieshi shaadaa veidaa? I/O pinu izveeleetajam chipam nepietiek?

Veel viens variants buutu pretestiibas sleegt nevis rindaa (kaa tavaa sheemaa), bet paraleeli:


```
VDD---R1---Vout---+-------+-------+
                  |       |       |
                 SW1     ...     SWn
                  |       |       |
                  R2     ...     Rn+1
                  |       |       |
GND---------------+-------+-------+
```

 Vai arii R-2R "resistor ladder" (nezinu kaa latviski to kjeedi sauc):


```
VDD---------------+-------+-------+
                  |       |       |
                 SW1     ...     SWn
                  |       |       |
                 2*R     ...     2*R
                  |       |       |
GND-------2*R-----+---R---+---R---+----Vout
```

 (Viens no D/A konvertoru veidiem)

Taadaa veidaa vareetu nolasiit arii ja reizee nospiestas ir vairaakas pogas.

----------


## next

Mchips rekomendē 2.5 Kom kā lielāko iespējamo lai mērījumu neietekmētu ieejas kapacitāte.

----------


## jeecha

Nu jaa, veel vienkaarshaak protams buutu panjemt kontrolieri ar vairaak piniem (ja tas ir iemesls deelj shiis perversiibas) lai nevaidzeetu kjeepaaties ar visu sho  ::

----------


## Slowmo

Šoreiz ir tā, ka jātaisa tikai stāvokļa nolasīšanas daļa. Pogas un rezistoru virkne ir tāda kā ir... tur mainīt neko nevar. Kas attiecas uz R3, tad tā ir shēmā izlaisto rezistoru nominālu summa + rezistora nomināls aiz pēdējās pogas. Bet fakts paliek tāds, ka pie nenospiestām pogām ķēdes kopējā pretestība ir tie minētie 5057 Omi.
Tas, ko centīšos uzmeistarot, ir interfeisa adapteris maģa pultij pie automašīnas stūres, lai oriģinālā maģa vietā varētu kaut ko citu pieslēgt, saglabājot pults funkcionalitāti. Fordam, kā izrādās, maģis darbojas kā ommetrs, kurš mēra pretestību pultij, kura savukārt mainās atkarībā no nospiestās pogas.

----------


## Vikings

Neliels offtops:
Klau, gadījumā vadu no stūres uz maģi nesavieno ar Jacka štekeri?

----------


## Slowmo

Šķiet, ka Sony maģiem 3,5mm stereo jacks tiek izmantots pults pievienošanai. Starp citu - arī rezistoru virkne, tikai pretestības citas.

----------


## Slowmo

OK, ejam tālāk.
Izbūros, cauri PIC programmēšanai un rezultātā varu nolasīt spriegumu, kas ir uz AN0, kā arī šo vērtību nosūtīt uz seriālo portu.
Iepriekš biju jautājis, kādu pretestību izmantot sprieguma dalītājā. Iemetu formulas Excelī un aprēķināju, ka vislielākā spriegumu starpība starp nospiestu pirmo pogu un nenospiestu nevienu pogu sanāk, kad izvēlas 560 omu rezistoru (starp e12 vērtībām). Ar to tā kā ar viss skaidrs.
Bet ir viena cita lieta. Pašreizējā slēgumā nepārtraukti jālasa spriegums, lai noteiktu, vai ir nospiesta poga. Būtu ideāli, ja A/D varētu aktivizēt tikai tad, kad skaidri zināms, ka nospiesta poga. To itkā varētu panākt tad, ja shēmu pieslēgtu ne tikai pie analogās ieejas, bet arī pie digitālās, un mikrokontrolierī aktivizēt pārtraukumu uz signāla līmeņa maiņu šajā ieejā. Problēma tur, ka signāla līmeņi neatbilst, lai varētu tā pa tiešo slēgt klāt pie digitālās ieejas. Pašlaik, kad nav nospiesta neviena poga, ieejā ir 4,5V, kas ir pietiekami, lai tas tiktu saprasts kā loģiskais "1". Spiežot pirmās 3 pogas spriegumi būs attiecīgi - 0,44V, 1,04V un 1,75V. Ņemot vērā, ka loģiskais "1"  iestājas sākot no 2V, pirmās 3 pogas neģenerētu vieninieku digitālajā ieejā. Taču pēdējo divu pogu spriegumi būs 2,5V un 3,25V un tur jau būs "1". Datašītā gan ir teikts, ka "0" garantēta līdz 0,8V, bet "1" sākot no 2V. Tad jau sanāk, ka viss, kas ir starp 0,8V un 2V var dot gan "1", gan "2"? Kā tur īsti ir?
Palielinot sprieguma dalītāja pretestību es varu panākt, ka nenospiesta poga dos virs 3V, bet lielākais nospiestās pogas spriegums - zem 2V, bet tad stipri samazinās spriegumu starpība starp blakus pogām.

Kā pareizi panāk loģisko "1" un "0" digitālajā ieejā manā gadījumā? Vai ir tādi tranzistori, kas strauji atveras pie, teiksim, 4V uz bāzes, bet ir ciet ar mazākiem spriegumiem?

Pievienoju arī shēmu, lai vieglāk saprast, par ko ir runa:

----------


## Slowmo

Laikam pats atradu atbildi uz jautājumu - komparators, kurš iestādīts uz 4V. Vai ir tādi PICi ar iebūvētu komparatoru, kurš ģenerētu pārtraukumu?

----------


## abergs

http://www.microchip.com/stellent/id...param=en027797
un citi...

----------


## next

Galīgi neredzu problēmu darbināt AD nepārtraukti.
Tev tur daudz citu procesu vajag, jebšu elektrību taupīt gribi?

----------


## Slowmo

Pagaidām nav nedz citu procesu, nedz arī elektrība jātaupa. Laika gaitā gan plānoju kabināt procim klāt vel uzdevumus (dažādi sensori, displejs u.t.t), tāpēc centīšos visu jau sākumā optimizēt. Man kā augta līmeņa valodu programmētājam nešķiet optimāli visu laiku pieprasīt A/D vērtību, ja var nostrādāt komparatora pārtraukums, kurš liecina, ka ir nospiesta poga. Tikai tad var iedarbināt A/D un nolasīt vērtību. Tikko atradu arī PICu, kuram ir komparators un, pats svarīgākais - kuru atbalsta mans necilais programmators - PIC16F873A. Microchip lapā gan iesaka PIC16F883 (jaunāks), taču to pašlaik nevaru ieprogrammēt.

----------


## next

Nē nu ja jau plāno paplašināt "darbu apjomu" tad protams.
Minimālai konfigurācijai ar PIC12F675 būtu pieticis.

----------


## Slowmo

Nākošais jautājums par tēmu.
Vai var vienu analogās ieejas kāju PICam vienlaicīgi izmantot kā A/D ieeju un komparatora VIN- ieeju? Kas notiks, ja COMCON reģistrā RA0/AN0 būs iekonfigurēts kā VIN-, kamēr tajā pašā laikā ADCON1 reģistrā šī pati ieeja būs norādīta kā analogā ieeja? Vai problēma būs tikai faktā, ka A/D ieejas kondensators uzlādējoties sēdinās spriegumu un var nostrādāt komparators, vai arī kopā komparators un A/D no vienas kājas vispār nestrādās?

----------


## abergs

Nianses nepateikšu, bet ja nav kritisks ātrums- kā pogu skanēšana - var nevaja'dzīgo moduli slēgt ārā.
"Oscilografam" no AN0 lasīju gan amplitūdu ar ADC, gan frekvenci ar komparatoru.

----------


## next

Viss strādās, kā jau te minēts, klaviatūras skanēšana nav nekāds ātrais darbs.

----------


## Slowmo

Izskatās, ka komparators un A/D pie ieejas kājas tiek pievienoti paraleli viens otram. Nu katrā ziņā simulācijā viss strādā baigi labi. A/D visu laiku ieslēgts, bet nolasīšanu sāku tikai pēc komparatora pārtraukuma.

Starp citu, ja vajag uzstādīt kādu spriegumu uz VIN+ (reference voltage), kāda maksimālā impedance pieļaujama sprieguma dalītājā? Specifikācijā redzu, ka A/D ieejā avota impedance var būt max 2k5 omi, bet neko neatradu par prasībām pret komparatora reference sprieguma avotu.

----------

