adc təsviri. STM32: analoqdan rəqəmə çevirici

10.09.2021

Analoqdan rəqəmə çeviricilər (ADC) analoq giriş siqnallarını qəbul edən və mikroprosessorlar və digərləri tərəfindən emal üçün uyğun olan müvafiq rəqəmsal siqnalları yaradan qurğulardır rəqəmsal cihazlar.ADC bir çoxuna daxildir müasir modellər MK AVR, çox kanallıdır. Adətən kanalların sayı 8-dir, lakin içəridə müxtəlif modellər Tiny ailəsinin gənc modellərində 4 kanaldan, ATmega8-də 6 kanaldan, ATmega2560-da 16 kanala qədər dəyişə bilər.

Çoxkanal bir modulun girişində olması deməkdir ADC quraşdırılıb analoq multipleksor, bu girişi vaxt ayırmaqla bir neçə müstəqil analoq kəmiyyətin ölçülməsini həyata keçirmək üçün müxtəlif MC pinlərinə birləşdirə bilər. Multipleksor girişləri fərdi olaraq idarə oluna bilər (yerə nisbətən gərginliyin ölçülməsi üçün tək uclu rejimdə) və ya (bəzi modellərdə) ölçmək üçün cüt-cüt birləşdirilə bilər. diferensial siqnallar. Bəzən ADC əlavə olaraq sabit qazanc dəyərləri 10 və 200 olan bir gərginlik gücləndiricisi ilə təchiz olunur.

Özüm ADC nümunə götürmə və saxlama cihazı və 13-ə (və ya diferensial daxiletmə üçün 14) bərabər olan sabit sayda çevirmə dövriyyəsi olan ardıcıl yaxınlaşma çeviricisidir; işə salındıqdan sonra ilk çevirmə işə salmaq üçün 25 dövr tələb edəcək. ADC). Saat tezliyi taymerlər üçün olduğu kimi formalaşır - 1-dən 128-ə qədər bölmə faktorları ola bilən xüsusi MK saat tezliyi preskalerindən istifadə etməklə. Amma taymerlərdən fərqli olaraq, saat tezliyinin seçimi. ADC tamamilə ixtiyari deyil, çünki analoq komponentlərin sürəti məhduddur. Buna görə də bölmə əmsalı elə seçilməlidir ki, verilmiş “kvars” üçün saat tezliyi olsun ADC tövsiyə olunan 50-200 kHz diapazonuna düşdü (yəni saniyədə maksimum təxminən 15 min ölçmə). Əgər nail olunarsa, seçmə sürətinin artırılması məqbuldur ən yüksək dəqiqlikçevrilmələr.

Qətnamə ADC V MK AVR- Ən tipik tətbiqlər üçün kifayət edən 10 ikili rəqəm. Mütləq çevrilmə xətası bir sıra amillərdən asılıdır və ideal olaraq ±2 ən az əhəmiyyətli rəqəmi keçmir ki, bu da təxminən 8 ikili rəqəmin ümumi ölçmə dəqiqliyinə uyğundur. Bu nəticəyə nail olmaq üçün xüsusi tədbirlər görmək lazımdır: təkcə saat tezliyini tövsiyə olunan diapazona “sürüşdürmək” deyil, həm də rəqəmsal səs-küyün intensivliyini maksimuma endirmək lazımdır. Bunun üçün ən azı rəqəmsal siqnalları emal etmək üçün ADC-nin qoşulduğu eyni portun qalan sancaqlarından istifadə etməmək, lövhələri düzgün istiqamətləndirmək və maksimum olaraq, həmçinin xüsusi parametrləri işə salmaq tövsiyə olunur. rejimi ADC səs-küyün azaldılması.

ADC nəzarət registrləri

ADCSR

Davamlı ölçmə rejimi biti təyin etməklə aktivləşdirilir ADFR(bit 5) eyni registrdən. Bir sıra Mega modellərində bu bit adlanır YAXŞI, və iş rejiminə nəzarət daha mürəkkəbdir: oraya müxtəlif fasilələr vasitəsilə bir neçə tetik rejimi əlavə olunur (o cümlədən, müqayisə aparatının kəsilməsi, taymerdən müxtəlif hadisələrin baş verməsi və s.) və onlar bitləri təyin etməklə seçilməlidir. ADTS qeydiyyatdan keçin SFIOR, və biti təyin edin YAXŞI bu hadisələr əsasında ADC-nin işə salınmasına imkan verir.

Boşalma ad Təsvir
5 ADFR(YENİLƏNİB) ADC iş rejiminin seçilməsi

Çünki bütün bitlər sıfırdır ADTS(standart olaraq) davamlı çevrilmə rejimi deməkdir, sonra onların dəyərlərinə toxunmadığınız halda, bit işləyir YAXŞIADFR digər modellərdə də eyni olacaq.

ADTS2 ADTS1 ADTS0 Başlanğıc siqnal mənbəyi
0 0 0 Davamlı dönüşüm rejimi
0 0 1 Analoq komparatordan kəsmə
0 1 0 Xarici kəsmə INT0
0 1 1 Taymeri/sayğacın T0 "Təsadüf" hadisəsi səbəbindən kəsmə
1 0 0 Taymer/Sayğac T0 Daşma Kəsilməsi
1 0 1 Taymer/sayğac T1-in "Təsadüf" hadisəsi səbəbindən kəsmə
1 1 0 Taymer/Sayğac T1 daşqın kəsilməsi
1 1 1 Taymer/sayğac T1-in "Təsir" hadisəsinə görə kəsinti

Başqa bir başlanğıc rejimi seçsəniz xarici mənbə, sonra çevrilmə biti təyin etməklə işə salınır ADSC(bit 6). Davamlı rejimdə bu bitin qurulması ilk çevrilməyə başlayacaq, sonra onlar avtomatik olaraq təkrarlanacaq. Tək konvertasiya rejimində, həmçinin kəsilmələr vasitəsilə başladıqda təyin edilmiş rejimdən asılı olmayaraq (bunun mümkün olduğu modellərdə) biti təyin edin ADSC yalnız bir transformasiyanı həyata keçirir. Konversiyanı tetikleyen fasilə baş verdikdə, bit ADSC hardware tərəfindən quraşdırılmışdır. Nəzərə alın ki, konvertasiya quraşdırmadan sonra ilk saat impulsunun kənarından başlayır (kontrolörün özü deyil, ADC saat siqnalı!) ADSC. İstənilən çevrilmənin sonunda (həm tək, həm də davamlı rejimdə) bit təyin olunur ADIF(bit 4. kəsmə bayrağı). ADC kəsilməsi biti təyin etməklə aktivləşdirilir ADIE(bit 3) eyni registrdən ADCSR/ADCSRA.

ADC ilə işləmək üçün onun saat tezliyini də təyin etməlisiniz. Bu, registrin ən az əhəmiyyətli üç biti ilə edilir ADCSR/ADCSRAçağırdı ADPS0..2. MK saat generatorunun tezlik bölgü əmsalı iki gücdə qurulmuşdur, bu üç bitdəki bütün sıfırlar 2 faktoruna uyğundur, hamısı - 128. Optimal tezlikçevrilmə 50-200 kHz diapazonunda olur, buna görə də, məsələn, 4 MHz MC takt tezliyi üçün əmsal yalnız 32 (bit vəziyyəti) dəyərinə malik ola bilər. ADPS0..2= 101, tezlik 125 kHz) və ya 64 (bit vəziyyəti ADPS0..2= 110, tezlik 62,5 kHz). 16 MHz saat tezliyində yalnız 128 faktor icazə verilən diapazona uyğun gəlir.

ADPS2 ADPS1 ADPS0 Bölmə nisbəti
0 0 0 2
0 0 1 2
0 1 0 4
0 1 1 8
1 0 0 16
1 0 1 32
1 1 0 64
1 1 1 128

Aşağıda reyestri təsvir edən bir cədvəl var ADMUX.



Referans gərginlik mənbəyi bitlərlə nümunə götürülür REFS1..0 qeydiyyatdan keçin ADMUX(ən əhəmiyyətli bitlər 7 və 6), onların sıfır dəyəri (defolt) xarici mənbəyə uyğundur. Bu xarici mənbənin gərginliyi 2 V-dan analoq hissəsinin təchizatı gərginliyinə qədər dəyişə bilər AVcc(və bu, öz növbəsində, rəqəmsal hissənin enerji təchizatından yuxarı və ya aşağı 0,3 V-dən çox fərqlənməməlidir). Analoq hissənin özünün enerji təchizatını istinad olaraq və iki yolla seçə bilərsiniz: ya sadəcə sancaqları birləşdirin AREFAVcc mikrosxemlər və ya set bitləri REFS1..0 dövlət 01 (sonra əlaqə daxili sxemlər tərəfindən həyata keçirilir, lakin xarici istinad mənbəyinin söndürülməli olduğunu nəzərə alın). Daxili mənbə də mövcuddur (dəst REFS1..0 11-ci vəziyyətdə, nəticəyə qədər AREF 2,4 ilə 2,7 V arasında geniş yayılmış nominal gərginliyi 2,56V olan bir filtr kondansatörünü birləşdirmək tövsiyə olunur.

REFS1 REFS0 İstinad gərginlik mənbəyi
0 0 AREF pininə qoşulmuş xarici istinad, daxili istinad deaktivdir
0 1 Təchizat gərginliyi AVcc*
1 0 Qorunur
1 1 AREF* pininə qoşulmuş daxili 2.56V ION
*Əgər gərginlik mənbəyi AREF pininə qoşulubsa, bu seçimlərdən istifadə etmək olmaz

Nəticə ADC çevrilməsi registrlərdə görünür ADCH: ADCL. Nəticə 10 bit olduğundan, defolt registrdəki ən əhəmiyyətli 6 bitdir ADCH olduğu ortaya çıxır sıfıra bərabərdir. Bu registrlər ən az əhəmiyyətli olandan başlayaraq oxunur. ADCL, bundan sonra ADCH reyestri oxunana qədər bloklanır. Nəticə etibarilə, registrlərin oxunması arasındakı an ADC saatının ön 14 (15) hissəsinə düşsə belə, onlarda olan məlumatlar dəyişməli olduqda, oxunan cütün dəyərləri bir-birinə uyğun olacaq, hətta nəticə bu çevrilmə itir. Bu registrləri əks ardıcıllıqla oxumaq tövsiyə edilmir. Amma bir az ADLAR(bit 5 qeydiyyatı ADMUX) maraqlı bir xüsusiyyət təqdim edir: əgər 1-ə qoyulubsa, registrlərdə çevrilmənin nəticəsi ADCH: ADCL sola əsaslandırılmış: nəticənin 9-cu biti ən əhəmiyyətli bitdə olacaqdır ADCH, və registrin ən az əhəmiyyətli 6 biti əhəmiyyətsiz olacaqdır ADCL. Bu halda, nəticənin 8 bitlik həlli kifayət edərsə, yalnız dəyəri oxumaq olar ADCH.

class="eliadunit">

Kanalların və onların ADC-də qarşılıqlı əlaqə rejimlərinin seçimi bitlər vasitəsilə həyata keçirilir MUX0..3 reyestrdə ADMUX. Onların dəyərləri, ölçülmüş gərginlik yerdən ölçüldükdə normal (qeyri-diferensial) rejimdə istədiyiniz kanalı seçir. Mega ailəsi üçün bu bitlərin son iki dəyəri (əksər modellərdə 11110 və 11111 və ya ATmega8-də 1110 və 1111) müvafiq olaraq ADC girişinin müqayisəçi istinadına (1,22 V) və ya yerə qoşulduğu rejimləri seçir. , cihazın avtomatik kalibrlənməsi üçün istifadə edilə bilər.

Atmega8x modellərində giriş multipleksoruna nəzarət

MUX3-MUX0 Balanssız giriş
0000 ADC0
0001 ADC1
0010 ADC2
0011 ADC3
0100 ADC4*
0101 ADC5*
0110 ADC6**
0111 ADC7**
1000-1101 Qorunur
1110 1.22V
1111 0V(GND)

*8-bit çevrilmə

**Yalnız TQFP-32 və MLF-32 paketlərində mövcuddur.

Rəqəmlərin digər birləşmələri MUX müxtəlif diferensial rejimləri təyin etmək üçün nəzərdə tutulmuşdur - onların mövcud olduğu modellərdə, digər hallarda bu bitlər qorunur (Atmega8, ATmega163 və s. modellərdə olduğu kimi). Diferensial rejimdə ADC seçilmiş iki pin arasındakı gərginliyi ölçür (məsələn, arasında ADC0ADC1) və bütün çıxışlar bu rejimdə istifadə edilə bilməz. O cümlədən ADC-nin diferensial girişləri sıfır düzəliş üçün eyni girişə qoşula bilər. Fakt budur ki, bir sıra modellərdə ADC girişində 1x, 10x və 200x əmsalı olan daxili gücləndirici var (əmsal eyni bitlər tərəfindən seçilir. MUX0..4) və bu rejim onu ​​kalibrləmək üçün istifadə olunur - gələcəkdə qoşulmuş girişlərlə çıxış dəyəri sadəcə çıxarıla bilər.

Dönüşüm tamamlandıqdan sonra (bayraq “1” olaraq təyin edildikdə ADIF qeydiyyatdan keçin ADCSR) onun nəticəsi verilənlər reyestrində saxlanılır ADC. ildən ADC 10 bit var, bu registr fiziki olaraq iki I/O registrində yerləşir ADCH: ADCL, yalnız oxumaq üçün. Varsayılan olaraq, çevrilmə nəticəsi düzgün əsaslandırılır (reestrin ən yüksək 6 biti ADCH- əhəmiyyətsiz). Bununla belə, o, sola da düzülə bilər (registrdən aşağı 6 bit ADCL- əhəmiyyətsiz). Dönüşüm nəticəsinin düzülməsinə nəzarət etmək üçün bitdən istifadə edin ADLAR qeydiyyatdan keçin ADMUX. Bu bit "1" olaraq təyin edilərsə, çevrilmə nəticəsi 16 bitlik sözün sol sərhəddinə, "0"-a sıfırlandıqda isə sağ sərhədə uyğunlaşdırılır.

Reyestrlərə giriş ADCHADCL nəticə əldə etmək üçün çevirmə müəyyən ardıcıllıqla aparılmalıdır: əvvəlcə reyestri oxumaq lazımdır ADCL və sonra ADCH. Bu tələb reyestrə daxil olduqdan sonra olması ilə bağlıdır ADCL prosessor kənardan məlumat registrlərinə girişi bloklayır ADC ADCH reyestrinin oxunmasına qədər. Bunun sayəsində siz əmin ola bilərsiniz ki, registrləri oxuyarkən onların tərkibində eyni nəticənin komponentləri olacaq. Müvafiq olaraq, əgər növbəti çevrilmə qeydiyyatdan keçmədən əvvəl tamamlanırsa ADCH, çevrilmə nəticəsi itiriləcək. Digər tərəfdən, əgər çevrilmənin nəticəsi əsaslandırılıbsa və 8 bitlik dəyərin dəqiqliyi kifayətdirsə, nəticə əldə etmək üçün yalnız registrin məzmunu oxuna bilər. ADCH.

Qeyri-diferensial ADC rejimi üçün, gərginlik yerdən ölçüldükdə, çevrilmə nəticəsi düsturla müəyyən edilir:

Ka = 1024Uin/Uref

Burada Ka ADC çıxış kodunun dəyəri, Uin və Uref giriş və istinad gərginlikləridir.

Aşağıdakı düstur diferensial ölçüyə uyğundur:

Ka = 512 (Upos - Uneg)/Uref

Burada Upos və Uneg müvafiq olaraq müsbət və mənfi girişlərdəki gərginliklərdir. Mənfi girişdəki gərginlik müsbət girişdən çox olarsa, diferensial rejimdə nəticə mənfi olur və ikinin tamamlayıcı kodu ilə 200$ (-512) ilə $3FF (-1) arasında ifadə edilir. Diferensial rejimdə faktiki çevrilmə dəqiqliyi 8 bitdir.

LED gərginlik göstəricisinin hazırlanması

ADC-nin praktiki öyrənilməsi üçün proqram yazacağıq LED göstərici gərginlik. Əvvəlki nümunələrdə olduğu kimi, biz Atmega8 mikro nəzarətçisindən istifadə edəcəyik. Səkkiz göstəricini nəzarətçinin D portuna bağlayırıq, bu, 0-dan 5V-ə qədər xətti siqnal səviyyəsinin şkalası olacaqdır. ADC-nin girişi PC0(ADC0) pin olacaq, ondan keçir dəyişən rezistor gərginlik 10 kOhm müqavimətlə təmin edilir. Cihazın diaqramı aşağıda təqdim olunur:

Dəqiqliyə doğru ADC Bu cihaz ən az tələblərə malikdir. İstinad gərginliyi mənbəyi mikrokontrolörün təchizatı gərginliyidir - 5 Volt, bu məqsədlə pin AREFçıxışa qoşulun Vcc mikrokontroller, biz də analoq hissəsinin güc sancaqları ilə eyni şeyi edirik AVccAGND, onları bitlərlə proqramda müvafiq olaraq artı və mənfi ilə əlaqələndiririk REFS1REFS0 mənbəyi təyin edin İON.

Göstəriş rejimi aşağıdakı kimi işləyir: davamlı rejimdə işləyən çevrilmə başa çatdıqdan sonra bitləri oxuyuruq. ADCHADCL. Sonra bu dəyəri əvvəllər hesablanmış sabitlərlə müqayisə edirik. ADC dəyəri sabitdən böyükdürsə, dəyər olduqda bir LED yanır ADCİkinci sabitdən çox, iki LED yanır və s.

Sabitlər aşağıdakı kimi hesablanır: ADC 10 bit olduğundan biz 1024 sayını 8 bərabər hissəyə bölürük və düsturdan istifadə edərək artıq bu dəyərləri Voltla hesablayırıq.

1020...5V (təxminən)

Tam proqram kodu aşağıda göstərilmişdir. Nəzarətçinin saat generatorunun tezliyi 8MHz-dir.

/*** ADC-dən istifadə etməklə. LED şkalası ***/ #daxildir #daxildir int main (boş) ( DDRD = 0xFF; PORTD = 0x00; /*** ADC parametrləri ***/ ADCSRA |= (1)<< ADEN) // Включение АЦП |(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8 ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН |(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PC0 while(1) { unsigned int u; ADCSRA |= (1 << ADSC); // Начинаем преобразование while ((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразования u = (ADCL|ADCH << 8); // Считываем ADC if (u >128) // 0,625V PORTD = 0b00000001; başqa PORTD = 0b00000000; əgər (u > 256) // 1.25V PORTD = 0b00000011; əgər (u > 384) // 1.875V PORTD = 0b00000111; əgər (u > 512) // 2.5V PORTD = 0b00001111; əgər (u > 640) // 3.125V PORTD = 0b00011111; əgər (u > 768) // 3.75V PORTD = 0b00111111; əgər (u > 896) // 4.375V PORTD = 0b01111111; əgər (u > 1020) // 5V PORTD = 0b11111111; _gecikmə_ms(30); ) )

Növbəti nümunədə biz Atmega8 mikrokontrolöründə 0-30V voltmetrin yaradılması prinsiplərinə baxacağıq.

Analoqdan rəqəmsal çeviricilər (ADC) analoq giriş siqnallarını qəbul edən və mikroprosessorlar və digər rəqəmsal cihazlar tərəfindən emal üçün uyğun olan müvafiq rəqəmsal siqnalları yaradan qurğulardır.

ADC çox kanallı AVR mikro nəzarətçilərinin bir çox müasir modellərinə daxildir; Tipik olaraq kanalların sayı 8-dir, lakin müxtəlif modellərdə bu, Tiny ailəsinin gənc modellərində 4 kanaldan, ATmega8-də 6 kanaldan, ATmega2560-da 16 kanala qədər dəyişə bilər. Çoxkanal o deməkdir ki, bir ADC modulunun girişində analoq multipleksor quraşdırılıb və o, vaxt ayırmaqla bir neçə müstəqil analoq kəmiyyətin ölçülməsini həyata keçirmək üçün bu girişi müxtəlif MK pinlərinə birləşdirə bilər. Multipleksor girişləri ayrı-ayrılıqda (yerə nisbətən gərginliyin ölçülməsi üçün birtərəfli rejimdə) və ya (bəzi modellərdə) diferensial siqnalları ölçmək üçün cüt-cüt birləşdirilə bilər. Bəzən ADC əlavə olaraq sabit qazanc dəyərləri 10 və 200 olan bir gərginlik gücləndiricisi ilə təchiz olunur.

ADC özü nümunə götürmə və saxlama cihazı və 13-ə (və ya diferensial giriş üçün 14) bərabər olan sabit sayda çevirmə dövrü ilə ardıcıl yaxınlaşma çeviricisidir; işə salındıqdan sonra ilk çevrilmə ADC-nin işə salınması üçün 25 dövr tələb edəcək. Saat tezliyi taymerlər üçün olduğu kimi formalaşır - 1-dən 128-ə qədər bölmə əmsallarına malik ola bilən xüsusi MK saat tezliyi preskalerindən istifadə etməklə. Lakin taymerlərdən fərqli olaraq, ADC takt tezliyinin seçimi tamamilə ixtiyari deyil, çünki analoq komponentlərin sürəti məhduddur. Buna görə də, bölmə əmsalı elə seçilməlidir ki, müəyyən bir “kvars” üçün ADC takt tezliyi tövsiyə olunan 50-200 kHz diapazonuna düşsün (yəni saniyədə maksimum təxminən 15 min ölçmə). Ən yüksək çevirmə dəqiqliyi tələb olunmadığı halda, seçmə sürətinin artırılması məqbuldur.

AVR MCU-da ADC-nin həlli 10 ikili bitdir ki, bu da əksər tipik tətbiqlər üçün kifayətdir. Mütləq çevrilmə xətası bir sıra amillərdən asılıdır və ideal olaraq ±2 ən az əhəmiyyətli rəqəmi keçmir ki, bu da təxminən 8 ikili rəqəmin ümumi ölçmə dəqiqliyinə uyğundur. Bu nəticəyə nail olmaq üçün xüsusi tədbirlər görmək lazımdır: təkcə saat tezliyini tövsiyə olunan diapazona “sürüşdürmək” deyil, həm də rəqəmsal səs-küyün intensivliyini maksimuma endirmək lazımdır. Bunun üçün ən azı rəqəmsal siqnalları emal etmək üçün ADC-nin qoşulduğu eyni portun qalan sancaqlarından istifadə etməmək, lövhələri düzgün istiqamətləndirmək və maksimum olaraq, xüsusi parametrləri işə salmaq tövsiyə olunur. ADC səs-küyün azaldılması rejimi.

Qeyd edək ki, ADC iki rejimdə işləyə bilər: tək və davamlı çevrilmə. İkinci rejim yalnız maksimum seçmə tezliyində uyğundur. Digər hallarda, bunun qarşısını almaq lazımdır, çünki bu halda rəqəmsal siqnalların paralel işlənməsi ehtiyacından keçmək ümumiyyətlə mümkün deyil və bu, çevrilmə dəqiqliyinin azalması deməkdir.

ADC nəzarət registrləri

ADC-nin işləməsini təmin etmək üçün bir jurnal yazmaq lazımdır. 1 ADCSR registrinin ADEN bitinə, söndürmək üçün isə log. 0. Əgər konversiya dövrü ərzində ADC söndürülürsə, konversiya başa çatmayacaq (əvvəlki çevrilmənin nəticəsi ADC məlumat reyestrində qalacaq).

Davamlı ölçmə rejimi eyni registrin ADFR bitini (bit 5) təyin etməklə aktivləşdirilir. Bir sıra Mega modellərində bu bit ADATE adlanır və iş rejiminə nəzarət daha mürəkkəbdir: orada müxtəlif fasilələr vasitəsilə bir neçə işə salma rejimi əlavə olunur (o cümlədən müqayisə aparatının kəsilməsi, taymerdən müxtəlif hadisələrin baş verməsi və s. .), seçin və SFIOR registrinin ADTS bitlərini təyin etməklə onları seçin və ADATE bitini təyin etmək ADC-yə bu hadisələri işə salmağa imkan verir. Bütün ADTS bitlərinin sıfır dəyərləri (standart olaraq) davamlı çevrilmə rejimi demək olduğundan, onların dəyərlərinə toxunmadığınız halda, digər modellərdə ADATE və ADFR bitlərinin funksiyaları eyni olacaqdır.

Əgər tətik rejimi xarici mənbədən deyilsə, o zaman konversiya ADTS bitini (eyni ADCSR/ADCSRA registrinin bit 6) təyin etməklə işə salınır. Davamlı rejimdə bu bitin qurulması ilk çevrilməyə başlayacaq, sonra onlar avtomatik olaraq təkrarlanacaq. Tək konvertasiya rejimində və kəsilmələr vasitəsilə işə salındıqda təyin edilmiş rejimdən asılı olmayaraq (bunun mümkün olduğu modellərdə) ADCS bitinin qurulması sadəcə bir çevrilməni başlayır. Konversiyanı tetikleyen fasilə baş verdikdə, ADCS biti aparat tərəfindən təyin edilir. Nəzərə alın ki, konversiya ADCS-i quraşdırdıqdan sonra ilk saat impulsunun kənarından başlayır (kontrolörün özü deyil, ADC saat siqnalı!). İstənilən çevrilmənin sonunda (həm tək, həm də davamlı rejimdə) ADIF biti təyin edilir (bit 4. kəsilmə bayrağı). ADC kəsilməsi eyni ADCSR/ADCSRA registrinin ADIE bitini (bit 3) təyin etməklə aktivləşdirilir.

ADC ilə işləmək üçün onun saat tezliyini də təyin etməlisiniz. Bu, ADPS0..2 adlanan ADCSR/ADCSRA registrinin ən az əhəmiyyətli üç biti ilə həyata keçirilir. MK saat generatorunun tezlik bölgü əmsalı iki gücdə təyin olunur, bu üç bitdəki bütün sıfırlar 2 faktoruna uyğundur, hamısı - 128. Optimal çevrilmə tezliyi 50-200 kHz diapazonunda yerləşir, belə ki, məsələn, MK takt tezliyi 4 MHz üçün əmsal yalnız 32 (bit vəziyyəti ADPS0..2 = 101, tezlik 125 kHz) və ya 64 (bit vəziyyəti ADPS0..2 = 110, tezlik 62.5 kHz) dəyərinə malik ola bilər. ). 16 MHz saat tezliyində yalnız 128 faktor icazə verilən diapazona uyğun gəlir.

İstinad gərginlik mənbəyi ADMUX registrinin REFS1..0 bitləri (ən əhəmiyyətli bitlər 7 və 6) ilə nümunə götürülür, onların sıfır dəyəri (defolt) xarici mənbəyə uyğundur. Bu xarici mənbəyin gərginliyi 2 V-dan AVcc analoq hissəsinin təchizatı gərginliyinə qədər dəyişə bilər (və bu, öz növbəsində, rəqəmsal hissənin təchizatı gərginliyindən 0,3 V-dan yuxarı və ya aşağı fərqlənməməlidir). Siz analoq hissənin özünün enerji təchizatını istinad olaraq və iki yolla seçə bilərsiniz: ya sadəcə olaraq mikrosxemin AREF və AVcc pinlərini birləşdirin, ya da REFS1..0 bitlərini 01 vəziyyətinə təyin edin (sonra əlaqə aşağıdakı şəkildə həyata keçirilir. daxili sxemlər, lakin nəzərə alın ki, bu halda xarici istinad mənbəyi söndürülməlidir). 2,4-dən 2,7 V-a qədər geniş yayılma ilə 2,56V nominal gərginliyə malik daxili mənbə də təmin edilir (11-ci vəziyyətdə REFS1..0 ilə təyin olunur, bir filtr kondensatorunu AREF pininə qoşmaq tövsiyə olunur). .

*****REFS *******

ADC çevrilməsinin nəticəsi ADCH:ADCL registrlərində görünür. Nəticə 10 bit olduğundan, standart olaraq ADCH registrindəki ən əhəmiyyətli 6 bit sıfırdır. Bu registrlər aşağı ADCL-dən başlayaraq oxunur, bundan sonra ADCH registri oxunana qədər bloklanır. Nəticə etibarilə, registrlərin oxunması arasındakı an ADC saatının ön 14 (15) hissəsinə düşsə belə, onlarda olan məlumatlar dəyişməli olduqda, oxunan cütün dəyərləri bir-birinə uyğun olacaq, hətta nəticə bu çevrilmə itir. Bu registrləri əks ardıcıllıqla oxumaq tövsiyə edilmir. Lakin ADLAR biti (ADMUX registrinin 5-ci biti) maraqlı bir xüsusiyyət təqdim edir: əgər o, 1-ə təyin edilərsə, ADCH:ADCL registrlərindəki çevrilmənin nəticəsi əsaslandırılmış qalır: nəticənin 9-cu biti ən əhəmiyyətli olacaq. ADCH-nin biti və ADCL registrinin aşağı 6 biti əhəmiyyətsiz olacaq. Bu halda, nəticənin 8 bitlik həlli kifayət edərsə, yalnız ADCH dəyəri oxuna bilər.

ADC-də kanalların və onların qarşılıqlı əlaqə rejimlərinin seçimi ADMUX registrində MUX0..3 bitləri ilə aparılır. Onların dəyərləri, ölçülmüş gərginlik yerdən ölçüldükdə normal (qeyri-diferensial) rejimdə istədiyiniz kanalı seçir. Mega ailəsi üçün bu bitlərin son iki dəyəri (əksər modellərdə 11110 və 11111 və ya ATmega8-də 1110 və 1111) müvafiq olaraq ADC girişinin müqayisəçi istinadına (1,22 V) və ya yerə qoşulduğu rejimləri seçir. , cihazın avtomatik kalibrlənməsi üçün istifadə edilə bilər.

MUX bitlərinin qalan birləşmələri müxtəlif diferensial rejimləri təyin etmək üçün nəzərdə tutulub - onların mövcud olduğu modellərdə, digər hallarda bu bitlər qorunur (Atmega8, ATmegal63 və s. modellərdə olduğu kimi). Diferensial rejimdə ADC seçilmiş iki pin arasındakı gərginliyi ölçür (məsələn, ADC0 və ADC1 arasında) və bu rejimdə bütün sancaqlar istifadə edilə bilməz. O cümlədən ADC-nin diferensial girişləri sıfır düzəliş üçün eyni girişə qoşula bilər. Fakt budur ki, bir sıra modellərdə ADC girişində əmsalı 1x, 10x və 200x olan daxili gücləndirici var (əmsal eyni MUX0..4 bit ilə seçilir) və bu rejimdən istifadə olunur. onu kalibrləmək üçün - gələcəkdə qoşulmuş girişlərlə çıxış dəyərini sadəcə çıxarmaq olar.

Qeyri-diferensial ADC rejimi üçün, gərginlik yerdən ölçüldükdə, çevrilmə nəticəsi düsturla müəyyən edilir: Ka = 1024Uin/Uref, burada Ka ADC çıxış kodunun dəyəri, Uin və Uref giriş və istinaddır. gərginliklər. Aşağıdakı düstur diferensial ölçüyə uyğundur: Ka = 512(Upos - Uneg)/Uref, burada Upos və Uneg müvafiq olaraq müsbət və mənfi girişlərdəki gərginliklərdir. Mənfi girişdəki gərginlik müsbət girişdən çox olarsa, diferensial rejimdə nəticə mənfi olur və ikinin tamamlayıcı kodu ilə 200$ (-512) ilə $3FF (-1) arasında ifadə edilir. Diferensial rejimdə faktiki çevrilmə dəqiqliyi 8 bitdir.

Fərqli xüsusiyyətlər:

  • Sürətli çevrilmə vaxtı: 1,4 µs, maks
  • Daxili nümunə/dondurma funksiyası
  • Kod itkisi yoxdur
  • İstifadəçi tənzimlənməsini tələb etmir
  • Tək təchizatı +5 V
  • Xarici saat tələb olunmur
  • Mikroprosessorlara asan uyğunlaşma

Tətbiqlər:

  • Rəqəmsal Siqnal Emalı
  • Sürətli məlumat toplama sistemləri
  • Telekommunikasiya
  • Yüksək sürətli servo idarəetmə sxemləri
  • Audio sistemlər

Funksional diaqram:

Pin yerləri:

Təsvir:

ADC0820 IC 1,4 µs çevirmə vaxtına nail olmaq üçün yarım flaş texnologiyasından istifadə edən yüksək sürətli, mikroprosessora uyğun, 8 bitlik analoqdan rəqəmə çeviricidir (ADC). Dönüştürücü 0 V-dan +5 V-ə qədər bir sıra analoq giriş siqnallarına və +5 V-lik bir təchizatına malikdir.

100 mV/µs-ə qədər çevirmə sürəti ilə quraşdırılmış nümunə/tutma sistemi xarici nümunə/tutma sisteminə ehtiyacı aradan qaldırır.

Bu ADC xarici uyğunluq məntiqinə ehtiyac olmadan yaddaş hüceyrəsi və ya I/O portu kimi daxil olmaq imkanı sayəsində mikroprosessorlarla asanlıqla uyğunlaşır. Məlumat çıxışlarında üç məntiqi vəziyyətə və sabit səviyyələrə malik bufer mərhələləri var ki, bu da IC-ni birbaşa mikroprosessor məlumat avtobusuna və ya sistemin I/O məlumat portuna qoşmağa imkan verir. ADC-nin daşması çıxışı daha yüksək qətnamə səviyyələrinə nail olmaq üçün IC-ləri sıralamaq imkanı verir.

Maxim-in ADC0820-si Milli Yarımkeçiricinin ADC0820 ilə pin-uyğundur və üstün performans təklif edir. IC aşağıdakı növ paketlərdə mövcuddur: 20-pin SO, DIP, CERDIP.

Məqalədə STMicroelectronics-dən STM32 seriyasının 32 bitlik ARM mikrokontrolörlərinin analoqdan rəqəmə çevrilməsi təsvir edilmişdir. Onun registrlərinin arxitekturası və tərkibi nəzərə alınır,
Proqramların praktiki nümunələri də verilmişdir.

Giriş
Mikrokontroller üçün ən vacib və populyar bloklardan biri onun rəqəmsal çeviricisidir (ADC) texniki ingilisdilli ədəbiyyatda Analoqdan Rəqəmə
Dönüştürücü (ADC).

Bu, analoq siqnalları rəqəmsal dəyərlərə çevirməyə imkan verir, sonra prosessor tərəfindən emal edilə bilər. Dönüşümün mahiyyəti analoq siqnalı istinad gərginliyi ilə müqayisə etmək və ADC bit diapazonunda analoq siqnala uyğun ədədi dəyər yaratmaqdan ibarətdir. Məsələn, istinad gərginliyi 3,3 V olan 12 bitlik ADC, 0-dan 3,3 V-a qədər olan analoq siqnalları müəyyən bir dövr ərzində 0-dan 4095 vahidə qədər rəqəmsal dəyər diapazonuna çevirir.

ADC-nin köməyi ilə mikrokontroller prosesləri avtomatlaşdırmaq üçün daha bir çox vəzifələri həll edə bilir. Bundan əlavə, mikrokontrollerdə quraşdırılmış bir ADC varsa, inkişaf etdirilən cihazın sxemi əhəmiyyətli dərəcədə sadələşdirilir və onun dəyəri əhəmiyyətli dərəcədə azalır. Bir qayda olaraq, ADC-nin özündən əlavə, mikrokontrollerdə quraşdırılmış analoq multipleksor var ki, bu da mikrokontrolörün bir neçə pinini növbə ilə dəyişdirərək və sonra bu sancaqlardan gələn siqnalları çevirməklə analoq girişlərin sayını artırmağa imkan verir.

STM32 seriyalı mikrokontrollerlər həmçinin 14 MHz-ə qədər saat tezliyi ilə daxili 12 bitlik ardıcıl yaxınlaşma ADC-yə malikdir. Bəzi STM32 modellərində hətta iki və ya üç ADC bloku var.

STM32 mikro nəzarətçilərinin ADC-nin blok diaqramı

ADC arxitekturası və əməliyyatı
STM32 üçün ADC blokunun arxitekturasına və işinə daha yaxından nəzər salaq. Bu ADC ilə siqnalların analoqdan rəqəmə çevrilməsi tək rejimdə, davamlı rejimdə, tarama rejimində və ya aralıq rejimdə həyata keçirilə bilər. Dönüşüm nəticəsi 16 bitlik ADC registrlərində sola və ya sağa düzülmüş məlumatlar ilə saxlanılır.
STM32 seriyalı mikro nəzarətçilərin daxili ADC-si təkmil funksiyalara malikdir. Bu ADC-nin əsas xüsusiyyətləri:

  • bit dərinliyi - 12 bit;
  • minimum çevrilmə müddəti – 1 µs;
  • kanalların sayı – 16 xarici və 2 daxili;
  • hər bir kanal üçün çevrilmə vaxtı dəyərlərinin sayı – 8;
  • tək və ya davamlı çevrilməni təyin etmək imkanı;
  • avtomatik kalibrləmə;
  • pəncərə komparatorunun olması;
  • xarici mənbələrdən konvertasiyaya başlamaq imkanı;
  • birbaşa yaddaşa giriş (DAM) bloku ilə işləmək.

ADC gərginliyi 2,4 V-dan 3,6 V-a qədər olan mənbədən qidalanır. ADC-nin istinad gərginlik mənbəyi (VS) modelindən və sayından asılı olaraq ya daxildən ADC təchizatı gərginliyinə, ya da xüsusi xarici pinlərə qoşulur. kristal sancaqlar. STM32 seriyalı mikro nəzarətçilərin ADC-nin blok diaqramı şəkildə göstərilmişdir. Şəkildən göründüyü kimi, ADC-də 16 xarici analoq kanal var
və giriş multipleksorundan istifadə edərək dəyişdirilən 2 daxili. Xarici kanallar mikrokontroller sancaqlarına qoşulur. Bu pinləri analoq kimi istifadə etməzdən əvvəl onları analoq giriş kimi konfiqurasiya etməlisiniz. Daxili siqnallar üçün əlavə iki kanal istifadə olunur. Biri daxili istinad gərginliyini izləmək üçün, ikincisi isə sensor üçündür
kristalda yerləşən temperatur.
Bu ADC üçün müntəzəm və yeridilmiş kanallar kimi xüsusi terminlər təqdim edilmişdir. Bu anlayışların mahiyyəti səsvermə kanallarının metodundadır. Daimi kanallar müəyyən bir tezlikdə, yəni müntəzəmlikdə sorğulanır və çevrilir. Injected, yəni daxil edilmiş kanallar, proqramın xüsusi sorğusu əsasında adi sorğular arasında sorğulanır.
Əgər vaxtaşırı bir neçə kanalda sorğu keçirmək lazımdırsa, o zaman ADC üçün bu kanalların siyahısını yarada və xüsusi registrlərə yaza bilərsiniz. Bundan sonra, ADC növbə ilə bu siyahının kanallarından gələn siqnalları ardıcıl olaraq bir-birinin ardınca çevirəcəkdir. Məsələn, 3, 7, 5 və 1-ci kanallarda gərginliyi alternativ olaraq ölçmək üçün bu ardıcıllığı xüsusi registrlərə yazmaq və ADC çevirmə prosesinə başlamaq lazımdır. Nəticədə, bu kanallar ardıcıl olaraq sorğulanacaq və çevriləcək,
və bu çevrilmələrin nəticəsi verilənlər registrlərinə yazılır. Bu zaman kanalların sırasının əhəmiyyəti yoxdur. Üstəlik, eyni kanal hər dövrədə bir neçə dəfə sorğulana bilər. Normal kanallar qrupunda ölçmələrin sayı 16-ya çata bilər. Seçilmiş kanalların davamlı ölçülməsinə icazə verilir, yəni ölçmə başa çatdıqdan sonra avtomatik olaraq yeni dövrə başlayır.

Enjekte edilmiş kanallar qrupunda ölçmələrin maksimum sayı dörddür. Enjeksiyonlu kanalları ölçməyə başlasanız, adi kanalların ölçülməsi dayandırılacaq. Sonra müəyyən edilmiş vurulan kanalların ölçülməsi aparılacaq və müntəzəm qrupun kanallarının ölçülməsi yenidən bərpa olunacaq.
Müntəzəm və enjeksiyonlu kanalların istifadəsinin praktikada necə tətbiq oluna biləcəyinə dair bir nümunəyə baxaq. Tutaq ki, müəyyən bir ardıcıllıqla beş terminalda gərginliyi daim ölçmək lazımdır. Bunun üçün bu kanalları adi bir qrupa daxil etməli və konversiyaya başlamalısınız. ADC onları ardıcıl olaraq sorğulamağa və siqnalları rəqəmsal dəyərlərə çevirməyə başlayacaq. Lazım gələrsə, çevrilmənin sonunda fasilələr yaradılacaq. Bu yolla, analoq siqnallar emal edilə bilər və ADC çevrilmə məlumatları avtomatik olaraq saxlanıla bilər. Bu zaman kristalın temperaturunu və ya başqa bir kanalda analoq siqnalı ölçməyə ehtiyac varsa, adi kanalda ölçməni pozmamaq üçün enjekte edilmiş kanalı ölçməyə başlaya bilərsiniz. Bu halda, müntəzəm kanalların işlənməsi bir müddət və bitdikdən sonra avtomatik olaraq dayandırılacaq
enjekte edilmiş qrupun ölçmələri - avtomatik olaraq bərpa olunur.
Dörd yeridilmiş kanal üçün çevrilmə nəticəsi müvafiq məlumat registrlərində saxlanılır. ADC-də hər bir yeridilmiş kanal üçün ayrıca registr, yəni cəmi dörd məlumat registrinə malikdir. Bununla belə, 18 müntəzəm kanal üçün ADC yalnız bir məlumat registrinə malikdir. Hər bir kanal üçün çevrilmə nəticələrini saxlamaq üçün hər bir kanalda ölçməni tamamladıqdan sonra siz fasilə yarada və bu registrdən məlumatları prosessorun yaddaş blokuna yenidən yaza bilərsiniz. Bundan əlavə, xüsusi DMA kanalından istifadə edə bilərsiniz ki, bu da hər bir çevrilmənin nəticələrini prosessorun iştirakı olmadan yaddaşda əvvəlcədən təşkil edilmiş məlumat buferinə göndərməyə imkan verəcək. Bu metoddan istifadə etmək, bir qrup müntəzəm kanalın hər bir çevrilmə dövrünün sonunda kəsilmənin yaranma tezliyini birinə endirməyə imkan verir. Bundan əlavə, ikiqat tampon istifadə edə bilərsiniz. Bu, ilk buferin ADC-si doldurulduqdan sonra imkan verəcəkdir
fasilə yaradın və nəticələri prosessor tərəfindən emal etməyə başlayın. Bu zaman ADC DMA-dan istifadə edərək ikinci buferi doldurmağa başlayacaq. Sonra sıra dəyişəcək və s. Şəkildə göstərilən diaqramın aşağı hissəsində müntəzəm və yeridilmiş kanallar qrupu üçün ayrıca çevrilmə prosesini işə sala bilən mənbələr var. Bunlar taymerlərdən gələn siqnallar, xarici siqnal və ya nəzarət registrlərinin iki xüsusi biti ola bilər ki, onları təyin etməklə siz adi və ya yeridilmiş qrupda çevrilməni proqramlaşdıra bilərsiniz.
Bu ADC-nin fərqli xüsusiyyəti, pəncərə müqayisəçisi olan analoq gözətçi taymerinin (AWD, İngilis Analog Watch Dog-dan) olmasıdır. O, müqayisənin sərhədlərini təyin etmək üçün iki registrdən ibarətdir. Müvafiq dəyərlər ölçülmüş siqnalın səviyyəsinə nəzarət etmək üçün aşağı hədd registrinə və yuxarı həddi registrinə proqramlaşdırılmışdır. Müqayisənin bağlanması lazım olan kanal nömrəsi xüsusi registrə yazılır. Verilmiş kanalın ölçülmüş gərginliyi müəyyən edilmiş hədləri aşarsa, ADC-də müvafiq bayraq qoyulacaq və kəsilmə sorğusu yaradılacaq.
Bu pəncərə komparatoru müəyyən bir parametrə avtomatik nəzarət etmək üçün çox faydalı ola bilər. Onun köməyi ilə, məsələn, həddindən artıq istiləşmədən qaçınmaq üçün nəzarətçinin temperaturunu izləyə bilərsiniz. Bunu etmək üçün mütəmadi olaraq, hər saniyə deyək, temperatur sensorundan siqnal səviyyəsini ölçə bilərsiniz. Göstərilən həddi keçərsə, müəyyən tədbirlər görülməlidir. Məsələn, saat tezliyini azaltmaq, xəbərdarlıq siqnalı yaratmaq və s. Pəncərə komparatoru, prosessoru əsas proqramı yerinə yetirməkdən yayındırmadan oxşar proseduru yerinə yetirməyə imkan verir və bununla da prosessor resurslarına və proqram yaddaşına qənaət edir. Pəncərə müqayisəçisini işə salmaq üçün onu sərhəd səviyyələrini yazaraq işə salmaq, monitorinq edilən kanalı adi kanallar siyahısına daxil etmək və ondan kəsilmələri aktivləşdirmək lazımdır. Nəzarət olunan siqnalın səviyyəsi müəyyən edilmiş diapazondan kənara çıxarsa, komparator işləyəcək və bu hadisə üçün kəsmə idarəedici funksiyası çağırılacaq.
ADC üç kəsmə siqnalını yarada bilir: çevrilmənin sonu, yeridilmiş qrupun çevrilməsinin sonu və pəncərə müqayisəedicisindən gələn siqnal.

HAQQINDAyazma registrləriADC
ADC blokuna kifayət qədər çox sayda registr daxildir. Ancaq zəngin funksionallığı və konvertasiya üçün kanalların sayını nəzərə alaraq bu, məntiqlidir. ADC registrinin xəritəsi Cədvəl 1-də təqdim olunur.
Bütün registrləri funksionallığa görə qruplaşdırmaq olar. Bu təşkilat nəticəsində aşağıdakı qruplar formalaşır:

●● status registri ADC_SR – ADC-nin vəziyyətini göstərən bitləri ehtiva edir;
●● ADC_CR1 və ADC_CR2 idarəetmə registrləri – ADC-nin iş rejimini müəyyən edir;
●● ADC_SMPR1 və ADC_SMPR2 qeydləri – ADC çevrilmə vaxtını təyin edin;
●● ADC_JOFR1…ADC_JOFR4 qeyd edir – yeridilmiş kanal qrupunda verilənlərin ofsetini təyin edir;
●● ADC_HTR və ADC_LTR registrləri – pəncərə komparatoru üçün yuxarı və aşağı hədləri təyin etmək;
●● ADC_SQR1…ADC_SQR3 registrləri – adi qrupun kanallarının ardıcıllığını təyin edir;
●● ADC_JSQR registri – yeridilmiş qrupun kanallarının ardıcıllığını təyin edir;
●● məlumat registrləri ADC_JDR1…ADC_JDR4 – yeridilmiş kanal qrupunun registrləri üçün çevrilmənin nəticəsini ehtiva edir;
●● məlumat reyestri DR – müntəzəm kanallar qrupu üçün çevrilmənin nəticəsini ehtiva edir.

ADC registrlərinin təqdim olunan qruplarının hər birində bitlərin təyinatını daha ətraflı nəzərdən keçirək. ADC_SR registrində aparat tərəfindən təyin olunan bitlər var. Onlar proqramlı şəkildə və ya sıfırlandıqdan sonra sıfırlanır. EOC biti ADC_DR registrini oxuduqdan sonra avtomatik olaraq sıfırlanır. Bitlərin məqsədi aşağıdakılardır:
●● bit 4 STRT müntəzəm kanal çevrilməsi başlayanda təyin edilir;
●● bit 3 JSTRT yeridilmiş kanalın çevrilməsinin başlanğıcında təyin edilir;
●● bit 2 JEOC yeridilmiş kanal çevrilməsinin sonunu göstərir;
●● bit 1 EOC müntəzəm və ya yeridilmiş kanal çevrilməsinin sonunu göstərir;
●● Pəncərə müqayisəsi işə salındıqda AWD bit 0 təyin edilir.

ADC_CR1 registrində aşağıdakı nəzarət bitləri var:
●● bit 23 AWDEN adi kanal pəncərəsi komparatorunu idarə edir;
●● bit 22 JAWDEN yeridilmiş kanal pəncərəsi komparatorunu idarə edir;
●● 15…13 DISCNUM bitləri xarici trigger hadisəsi baş verdikdə çevrilməsi fasiləli rejimdə həyata keçiriləcək müntəzəm kanalların sayını müəyyən edir;
●● bit 12 JDISCEN yeridilmiş kanallar üçün fasiləli rejimi söndürür və işə salır;
●● 11 bit DISCEN müntəzəm kanallar üçün aralıq rejimini söndürür və işə salır;
●● bit 10 JAUTO yeridilmiş kanallar üçün avtomatik çevrilmə rejimini söndürür və işə salır;
●● bit 9 AWDSGL pəncərə komparatoruna bütün kanallar və ya AWDCH bitləri ilə müəyyən edilmiş kanal üçün işləməyə imkan verir;
●● bit 8 SCAN ADC_SQRx və ya ADC_JSQRx registrləri tərəfindən müəyyən edilmiş kanalların skan rejimini qadağan edir və imkan verir;
●● bit 7 JEOCIE inyeksiya kanallarının çevrilməsi başa çatdıqdan sonra fasilələri söndürür və imkan verir;
●● bit 6 AWDIE ADC pəncərə müqayisəçisindən kəsilmələri söndürür və işə salır;
●● bit 5 EOCIE adi və ya yeridilmiş qrupda çevrilmənin sonunda kəsilmələri söndürür və imkan verir;
●● 4…0 AWDCH bitləri pəncərə komparatorunun qoşulduğu kanal nömrəsini müəyyən edir.
ADC_CR2 registrində aşağıdakı məqsədlər üçün bitlər var:
●● bit 23 TSVREFE çipdə yerləşən istinad gərginliyinin və temperatur sensorunun kanalını birləşdirir;
●● bit 22 SWSTART adi kanalların çevrilməsinə başlayır;
●● bit 21 JSWSTART yeridilmiş kanalların çevrilməsinə başlayır;
●● bit 20 EXTTRIG adi kanallar üçün xarici tetikləməni söndürür və istifadəyə imkan verir;
●● 19…17 bitləri EXTSEL adi kanalda konversiyanı tetikleyecek mənbəni müəyyən edir (000 = TIM1_CH1, 001 = TIM1_CH2, 010 = TIM1_CH3, 011 = TIM2_CH2, 100 = TIM3_TRGO, 101_CH110, IM4_CH11, T = ART );
●● bit 15 JEXTTRIG inyeksiya edilmiş kanallar üçün xarici tetiklemenin istifadəsini söndürür və imkan verir;
●● 14…12 bitləri JEXTSEL yeridilmiş kanalda konversiyanı tetikleyecek mənbəni müəyyən edir (000 = TIM1_TRGO, 001 = TIM1_CH4, 010 = TIM2_TRGO, 011 = TIM2_CH1, 100 = TIM3_CH4, 100 = TIM3_CH4, 100 = TIM3_CH4, 1000 = JEXTSEL, TIM10GO, 1000 = TIM1_TRGO, 001 = TIM1_CH4 );
●● bit 11 ALIGN məlumat registrində dönüşüm nəticəsinin sağ (0) və ya sol (1) kənarlarına düzülməsini təyin edir;
●● bit 8 DMA DMA blokunun istifadəsini qadağan edir və imkan verir;
●● bit 3 RSTCAL kalibrləməni sıfırlayır;
●● bit 2 CAL 1 yazmaqla ADC kalibrlənməsinə başlayır, bu da prosesin sonunda aparat tərəfindən sıfırlanır;
●● bit 1 CONT davamlı çevrilməyə başlayır;
●● Bit 0 ADON ADC modulunu söndürür və aktivləşdirir.

ADC_SMPR1 və ADC_SMPR2 registrləri hər bir kanalda çevrilmə vaxtını təyin edir. Hər bir kanal üçün üç bit ayrılmışdır ki, bu da 8 çevrilmə vaxtını təyin etməyə imkan verir
dövrlərdə (000 = 1,5 dövr, 001 = 7,5 dövr, 010 = 13,5 dövr, 011 = 28,5 dövr, 100 = 41,5 dövr, 101 = 55,5 dövr, 110 = 71,12 dövr, 110 = 71,115 dövr).
ADC_JOFR1…ADC_JOFR4 registrləri yeridilmiş qrupun hər bir kanalının ofsetini təyin etmək üçün istifadə olunur (JOFR1, JOFR2, JOFR3, JOFR4). Bu registrlər ADC çevrilmə nəticəsindən avtomatik çıxılan 12 bitlik dəyərə yazıla bilər. Nəticə dəyər mənfi olarsa, vurulan qrupun nəticə registrinə mənfi işarə biti əlavə olunur.

ADC_LTR və ADC_HTR registrlərinin hər biri 12 bitə malikdir, bunlara pəncərə müqayisəedicisinin yuxarı və aşağı hədlərinin qiymətləri yazılır.
ADC_SQR1 registrləri… ADC_SQR3 adi qrupda sorğulanacaq kanal nömrələrini və kanalların ümumi sayını təyin etmək üçün istifadə olunur. Bu registrlərin SQx bitləri kanal nömrəsini təyin edir, burada x 1-dən 16-ya çevrilmə üçün mövqe nömrəsidir. Qrupdakı kanalların sayı ADC_SQR1 registrinin L bitləri ilə müəyyən edilir.

Məsələn, müntəzəm olaraq 1, 3, 1, 5, 9, 9, 1 sırası ilə 7 kanal sorğusu aparmaq lazımdır. Bunun üçün yazmaq lazımdır.
ADC_SQR3 registrində aşağıdakı dəyərləri qeyd edin: SQ1 = 1, SQ2 = 3, SQ3 = 1, SQ4 = 5, SQ5 = 9, SQ6 = 9. ADC_SQR2 registrində sonuncu yeddinci sorğulanan kanalın nömrəsini yazmalısınız: SQ7 = 1. Bundan sonra siz ADC_SQR1 reyestri üçün adi qrupun sorğulanmış kanallarının sayını təyin etməlisiniz: L = 7. Təqdim olunan məlumatlardan aydın olur ki, kanallar istənilən ardıcıllıqla sorğulana bilər. Bundan əlavə, istənilən kanalda bir neçə dəfə sorğu keçirilə bilər.
ADC_JSQR reyestri, ADC_SQRx registrləri kimi, sorğulanmış kanalların ardıcıllığını və yeridilmiş kanal qrupu üçün onların sayını müəyyən edir. Reyestr strukturundan göründüyü kimi, yeridilmiş qrupda çevrilmələrin maksimum sayı dörddür. Kanalların sayı JL rəqəmləri ilə müəyyən edilir.

Qeydiyyat ADC_JDR1…ADC_JDR4 yeridilmiş qrupun kanalları üçün məlumatları saxlayır. Enjekte edilmiş qrupdakı kanalların maksimum sayı dörddür, buna görə də dörd məlumat reyestri var. Seçilmiş hər bir kanaldakı çevrilmələrin nəticəsi bu registrlərə yerləşdirilir. Registrlər 16 bit, ADC isə 12 bit olduğundan ölçmə nəticəsini bu registrlərin soluna və ya sağına uyğunlaşdırmaq mümkündür.

ADC_DR registrində adi qrupda ADC çevrilməsinin nəticəsi var. Dörd məlumat registrinə malik olan inyeksiya edilmiş qrupdan fərqli olaraq, bütün qrup üçün yalnız bir ədəd var. Onun strukturu ən əhəmiyyətli bitlər 16...31 istisna olmaqla, JDRx registrlərinə bənzəyir. Bu bitlər ADC ADC2 adlı ikinci ADC ilə birlikdə ikili rejimdə işləyərkən istifadə olunur.

ADC iş rejimləri
ADC bir neçə iş rejimindən istifadə etməyə imkan verir. Tək çevirmə rejimindən başlayaraq onlara bir-bir baxaq. Bu rejimdə ADC yalnız bir çevrilmə həyata keçirir. O, adi kanallar üçün ADC_CR2 registrində ADON bitini təyin etdikdən sonra və ya müntəzəm və yeridilmiş kanallar üçün xarici siqnaldan işə salınır. Bu halda ADC_CR2 registrinin CONT biti sıfıra bərabər olmalıdır. Seçilmiş adi kanalda çevrilmə başa çatdıqdan sonra çevrilmənin nəticəsi ADC_DR registrində saxlanılır və EOC bayrağı qoyulur. EOCIE biti təyin edilərsə, kəsmə yaranır. Enjekte edilmiş kanal üçün çevrilmə nəticəsi ADC_DRJ1 registrində saxlanılır və JEOC bayrağı qoyulur. JEOCIE biti təyin edilərsə, kəsmə yaranır. Bundan sonra ADC əməliyyatı dayanır.
Davamlı çevirmə rejimində ADC cari çevrilmə başa çatdıqdan sonra növbəti çevrilməyə başlayır. Bu rejim xarici mənbədən və ya ADC_CR2 registrinin ADON bitini təyin etməklə işə salınır. Bu halda ADC_CR2 registrinin CONT biti birinə bərabər olmalıdır. Hər konvertasiyadan sonra çevrilmənin nəticəsi tək konvertasiya rejimində olduğu kimi icra edilir və saxlanılır.
Tarama rejimində ADC bir qrup kanalın ardıcıl çevrilməsini həyata keçirir. Bu rejim ADC_CR1 registrinin SCAN bitini təyin etməklə seçilir. Bu bit təyin edilərsə, ADC adi kanallar üçün ADC_SQRx registrlərində və ya yeridilmiş kanallar üçün ADC_JSQR registrində seçilmiş bütün kanalları skan edir. CONT biti təyin edilərsə, çevrilmə son kanalda dayanmır, lakin birinci kanaldan yenidən başlayır. Əgər DMA biti qurulubsa, EOC biti təyin edildikdən sonra hər bir çevrilmənin sonunda nəticəni yaddaşa köçürmək üçün DMA nəzarətçisi istifadə olunur. Adi bir qrupda birdən çox kanal istifadə olunursa, nəticəni saxlamaq üçün DMA-dan istifadə etmək tövsiyə olunur. Bu, artıq ADC_DR registrində saxlanılan məlumatların itirilməsinin qarşısını alır. Dönüşümün sonunda adi qrup nəticəni ADC_DR reyestrindən istifadəçinin müəyyən etdiyi yerə saxlamaq üçün DMA sorğusu verir. İnyeksiya edilmiş kanalları olan ADC-lərin iş rejimləri də müxtəlifdir. Enjeksiyon kanalı tetikleyicisini istifadə etmək üçün JAUTO biti təmizlənməlidir və ADC_CR1 registrində SCAN biti təyin edilməlidir. Müntəzəm kanallar qrupu üçün siqnalın çevrilməsi ya xarici siqnalla, ya da ADC_CR2 registrində ADON bitini təyin etməklə işə salınır. Əgər adi kanallar qrupundan gələn siqnalların çevrilməsi zamanı inyeksiya kanallarının xarici işə salınması baş verirsə, o zaman cari çevrilmə dayandırılır və tək skan rejimində inyeksiya kanallarının ardıcıllığının çevrilməsinə başlanır.

Sonra kəsilən kanaldan başlayaraq müntəzəm kanallar qrupunun çevrilməsi bərpa edilir. Enjeksiyon transformasiyası zamanı müntəzəm kanal tetikleme hadisəsi baş verərsə, o, transformasiyanı dayandırmır, lakin inyeksiya ardıcıllığı emal başa çatdıqdan dərhal sonra müntəzəm ardıcıllıq işə salınır. Enjeksiyon kanallarının xarici hadisə tetiklemesinden istifadə edərkən, tətik hadisələri arasındakı intervalın inyeksiya kanalının çevrilmə vaxtından daha uzun olmasını təmin etməlisiniz. Məsələn, əgər çevrilmə ardıcıllığı 28 ADC saat dövrü uzunluğundadırsa, tetikleyici hadisələr arasında minimum interval 29 dövr olmalıdır.

JAUTO biti qurulubsa, adi kanal qrupunun çevrilməsi başa çatdıqdan sonra, enjeksiyon kanalı qrupunun çevrilməsi avtomatik olaraq başlayır. Bu, ADC_JSQR və ADC_SQRx registrlərində müəyyən edilmiş 17-20 kanal ardıcıllığının xəritələşdirilməsi üçün istifadə edilə bilər. Bu rejimdə xarici hadisə tetikleme mexanizmi söndürülməlidir. Əgər JAUTO bitinə əlavə olaraq CONT biti quraşdırılıbsa, enjeksiyon kanal qrupu çevrildikdən dərhal sonra adi kanal qrupunun çevrilməsi yenidən başlayır. Hər iki rejimi eyni vaxtda istifadə etmək mümkün deyil, avtomatik başlanğıc və xarici hadisə ilə işə salın.

KalibrləməADC
ADC daxili avtomatik kalibrləmə mexanizminə malikdir. Kalibrləmə daxili siqnal seçmə və saxlama kondansatörlərində qeyri-homogenlikdən qaynaqlanan rəqəmsallaşdırma xətasını əhəmiyyətli dərəcədə azaldır. Kalibrləmə zamanı hər bir kondansatör üçün rəqəmsal ADC dəyəri düzəliş kodu şəklində hesablanır. Bütün sonrakı çevirmələr zamanı bu kod siqnalın çevrilməsi xətalarını kompensasiya etmək üçün istifadə olunur.
Kalibrləmə başlamazdan əvvəl ADC əlil vəziyyətdə olmalıdır, yəni ADON biti ən azı iki ADC saat dövrü üçün sıfır olmalıdır.
Kalibrləmə ADC_CR2 registrində CAL bitini təyin etməklə başlanır. Kalibrləmə tamamlandıqdan sonra CAL biti aparat tərəfindən sıfırlanır, bundan sonra normal çevrilmə həyata keçirilə bilər. Güc tətbiq edildikdə ADC-ni bir dəfə kalibrləmək tövsiyə olunur. Kalibrləmə kodları kalibrləmə mərhələsi başa çatdıqda ADC_DR-də saxlanılır.

ADC çevrilmə vaxtı
ADC hər bir kanalda çevrilmə vaxtını ayrıca proqramlaşdırma qabiliyyətini dəstəkləyir. 1,5…239,5 dövr diapazonundan 8 diskret dəyər seçmək mümkündür. Hər bir kanal üçün vaxt ADC_SMPR1 və ADC_SMPR2 registrlərinin SMPx bitlərindən istifadə etməklə fərdi olaraq təyin edilir.
Ümumi çevrilmə vaxtı Tconv aşağıdakı düsturla hesablanır: Tconv = Tsmt + 12.5 dövr, burada Tsmt proqram təminatı ilə müəyyən edilmiş seçmə vaxtıdır. Məsələn, ADCCLK tezliyi 14 MHz-ə təyin edilmişdir,
və nümunə götürmə müddəti 1,5 dövrdür. Sonra Tconv = 1,5 + 12,5 = 14 dövr = 1 μs.

ADC temperatur sensoru
Mikrokontroller kristalında quraşdırılmış temperatur sensoru kristalın özünün temperaturunu ölçməyə imkan verir. Sensor ADC-nin 16-cı girişinə qoşulub. Tövsiyə olunan nümunə götürmə vaxtı
səsvermə zamanı sensor 17,1 µs-dir.
İstifadə edilmədikdə, sensor söndürülə bilər. Sensor çıxışındakı gərginlik temperaturdan asılı olaraq xətti dəyişir. Fərqli kristallarda bu xətt 45 dərəcəyə qədər dəyişir, buna görədir
istehsal texnologiyası ilə. Daxili sensor temperaturun mütləq dəyərini ölçmək üçün deyil, onun dəyişməsini izləmək üçün daha uyğundur. Lazım olan temperaturu oxumaq üçün
16-cı kanalı seçin, seçmə vaxtını ən azı 17,1 μs təyin edin və sensoru işə salmaq üçün ADC_CR2 registrində TSVREFE bitini təyin edin. Bundan sonra siz ADON bitini təyin etməklə və ya xarici hadisə ilə ADC çevrilməsini işə sala və çevrilmə nəticəsini oxuya bilərsiniz.
Temperatur dəyəri düsturla hesablanır: T[C] = (V25 – Vsense) / Avg_Slope + 25, burada V25 25 dərəcə ölçmə dəyəridir, tipik dəyəri 1,41V, Vsense cari ölçülmüş dəyərdir, və Avg_Slope 4,3 mV/C tipik qiymətə malik kristal başına cədvəllərdən əmsaldır.

Pəncərə müqayisəsi
Pəncərə müqayisəçisi seçilmiş müntəzəm və ya yeridilmiş kanalı və ya bütün müntəzəm və ya yeridilmiş kanalları izləmək üçün istifadə edilə bilər. Gərginliyin monitorinqinə əlavə olaraq, pəncərə müqayisəsi funksiyası sıfır keçid detektoru kimi istifadə edilə bilər.

AWD bayrağı ADC tərəfindən ölçülən kanal siqnalının rəqəmsal dəyəri müəyyən edilmiş səviyyədən böyük və ya az olarsa təyin edilir. Bu səviyyə ADC_HTR və ADC_LTR registrləri tərəfindən təyin edilir. Kesinti ADC_CR1 registrinin AWDIE biti ilə aktivləşdirilə bilər. Pəncərə komparatoru tərəfindən idarə olunan ADC kanalları Cədvəl 2-ə uyğun olaraq təyin edilmişdir.
AWDSGL biti nəzarət edilən kanalların sayını təyin edir. 0 olarsa, bütün kanallara, 1 olarsa, bir kanala nəzarət edilir. Kanal nömrəsi AWDCH bitləri ilə müəyyən edilir.
AWDEN biti adi qrupun kanallarının, JAWDEN isə vurulan qrupun kanallarının monitorinqinə imkan verir.

Cədvəl 2. Pəncərə komparatoru ilə idarə olunan ADC kanalları

Nümunə proqramlar

ADC-lərlə işləmək üçün proqramların nümunələrinə baxaq. Ən sadə variantdan başlayaq: proqram təminatının işə salınması ilə bir kanalda siqnal səviyyəsinin ölçülməsi. Bunun üçün mikrokontrolörün PORTA.6 port pinindən istifadə edirik. Nümunə proqram Siyahı 1-də göstərilmişdir.

Siyahı 1 //========================== // ADC başlatma funksiyası //============= =========== void Init_ADC(void) ( RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // PORTA portunun saat rejimini aktivləşdirin // PORTA.6-nı analoq giriş GPIOA->CRL &= ~GPIO_CRL_MODE6 kimi konfiqurasiya edin; / / Clear MODE bits GPIOA->CRL &= ~GPIO_CRL_CNF6 // CNF bitlərini sil RCC->APB2ENR |= RCC_APB2ENR_ADC1EN // ADC clocking RCC->CFGR &= ~RCC_CFGR_ADCPAD1 dəyərini təyin edin; > CR1 = 0; // İdarəetmə registrini sıfırla ADC1->SQR1 = 0 // SQR1 ADC1->CR2 |= ADC_CR2_CAL (!(ADC1->CR2 & ADC_CR2_CAL))( //) ; Kalibrləmənin tamamlanmasını gözləyin ADC1->CR2 = ADC_CR2_EXTSEL // Tətik mənbəyini seçin SWSTART ADC1->CR2 |= ADC1->CR2 |= ADC_CR2_ADONC; ) //=== ============================================ ========= = // ADC konversiyasına başlamaq və seçilmiş kanalı oxumaq funksiyası // Giriş - konvertasiya üçün kanal nömrəsi // Çıxış - çevrilmənin nəticəsi //========== ============ ======================================== ======= uint16_t RD_ADC(uint8_t nk) ( ADC1->SQR3 = nk; // Kanal nömrəsini təyin edin ADC1->CR2 |= ADC_CR2_SWSTART; // Dönüştürməyə başlayın while(!(ADC1->SR & ADC_SR_EOC))(); // Dönüşümün başa çatmasını gözləyin ADC1->DR qaytarın; // Dönüşümün nəticəsini oxuyun) //=========== // Proqramın əsas modulu //========= ======== ====== void main(void) ( unsigned int ai; // Dəyişənləri işə salın // Digər əmrlər... while(1) // Sonsuz dövrə ( Init_ADC(); // ADC ai-nin başlanğıcını və başlanğıcını yerinə yetirin = RD_ADC(6); // Kanal 6 üçün ADC məlumatlarını oxuyun // Digər əmrlər ... ) )

Bu nümunə ADC-ni müntəzəm olaraq işə salmaq və çevrilmənin tamamlanmasını gözləmək lazım olan proqramı nümayiş etdirir.
İndi ADC-nin davamlı çevrilmə rejimindən istifadə edən 2-ci Siyahıda göstərilən başqa bir proqram nümunəsinə baxaq.

Siyahı 2 //========================== // ADC başlatma funksiyası //============= =========== void Init_ADC(void) ( RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // PORTA portunun saat rejimini aktivləşdirin // PORTA.6-nı analoq giriş GPIOA->CRL &= ~GPIO_CRL_MODE6 kimi konfiqurasiya edin; / / Clear MODE bits GPIOA->CRL &= ~GPIO_CRL_CNF6 // CNF bitlərini sil RCC->APB2ENR |= RCC_APB2ENR_ADC1EN // ADC clocking RCC->CFGR &= ~RCC_CFGR_ADCPAD1 dəyərini təyin edin; > CR1 = 0; // İdarəetmə registrini sıfırla ADC1->SQR1 = 0 // SQR1 ADC1->CR2 |= ADC_CR2_CAL (!(ADC1->CR2 & ADC_CR2_CAL))( //) ADC1->CR2 = ADC_CR2_EXTSEL // Tətik mənbəyini seçin ADC1->CR2 |= ADC1->CR2 |= ADC_CR2_CONT davam edir; dönüşüm rejimi ADC1->CR2 |= ADC_CR2_ADON; // ADC ADC1->CR2-ni aktivləşdir |= ADC_CR2_SWSTART ) //======== // Proqramın əsas modulu //= ======================== void main(void) ( imzasız int ai; // Dəyişənlərin işə salınması Init_ADC(); // ADC-ni işə salın və işə salın // Digər əmrlər... while(1) // Sonsuz dövrə ( ai=ADC1->DR; // Dönüşüm nəticəsini oxuyun // Digər əmrlər... ) )

Bu proqram verilmiş kanal üçün davamlı çevrilmə rejimini işə salır və ADC davamlı olaraq seçilmiş kanalı sorğulayır, nəticəni verilənlər registrinə yerləşdirir. Buna görə
əsas proqramın ADC-ni müntəzəm olaraq işə salmasına ehtiyac yoxdur. Bu üsulla ADC_DR registrində kanal girişindəki siqnal səviyyəsi haqqında məlumat daim yenilənəcək. Yeniləmələr dəyişdirilə bilən fasilələrlə baş verəcəkdir.
Müzakirə olunan nümunələrdə bir kanal üçün davamlı çevrilməni həyata keçirə bilərsiniz. Bunu bir neçə kanal üçün etmək lazımdırsa, fasilələr və ya DMA blokundan istifadə etmədən edə bilməzsiniz, çünki adi bir qrup üçün yalnız bir məlumat reyestri təmin edilmişdir. Bununla belə, kanalların sayı dörddən çox deyilsə, enjekte edilmiş kanalların çevrilməsi oxşar şəkildə istifadə edilə bilər.
Enjeksiyonlu qrup üçün kanalların maksimum sayı dörddür. Hər bir belə kanalın çevrilmə nəticəsini saxlamaq üçün öz reyestrinə malikdir.
Deyək ki, siz dörd kanalı rəqəmlərlə sorğulamalısınız: 3, 4, 5 və 6. Bunu etmək üçün dörd enjekte edilmiş kanaldan ibarət qrupun davamlı ölçülməsinə başlaya bilərsiniz. Bu halda, ADC avtomatik olaraq göstərilən dörd kanalı skan edəcək və nəticəni ADC_JDR1, ADC_JDR2, ADC_JDR3 və ADC_JDR4 məlumat registrlərinə yerləşdirəcək. Bu halda istənilən vaxt istənilən kanaldan məlumatları oxumaq mümkün olacaq. Belə bir proqramın nümunəsi Siyahı 3-də göstərilmişdir.

Siyahı 3 //========================== // ADC başlatma funksiyası //============= =========== void Init_ADC(void) ( RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // PORTA port saatını aktivləşdirin // PORTA.3-ü analoq giriş kimi konfiqurasiya edin GPIOA->CRL &= ~GPIO_CRL_MODE3; / / Clear MODE bits GPIOA->CRL &= ~GPIO_CRL_CNF3 // Clear bits CNF //PORTA.4-ü analoq giriş kimi konfiqurasiya edin GPIOA->CRL &= ~GPIO_CRL_MODE4 // GPIOA->CRL &= ~; GPIO_CRL_CNF4; // CNF bitlərini təmizləyin // PORTA.5-i analoq giriş kimi konfiqurasiya edin GPIOA->CRL &= ~GPIO_CRL_MODE5 // Clear MODE bits GPIOA->CRL &= ~GPIO_CRL_CNF5 // CNF-i təmizləyin. 6 analoq giriş kimi GPIOA->CRL &= ~GPIO_CRL_MODE6 // Clear MODE bits GPIOA->CRL &= ~GPIO_CRL_CNF6 // Clear CNF bits RCC->APB2ENR |= RCC_APB2ENR_ADC1AD-i aktivləşdirin; CFGR &= ~RCC_CFGR_ADCPRE ; // Saat tezlik bölücüsünün dəyərini təyin edin ADC1->CR1 = 0 // ADC1->CR2 |= ADC_CR2_CAL; // Kalibrləməni (!(ADC1->CR2 & ADC_CR2_CAL))(); // Kalibrləmənin sonunu gözləyin ADC1->CR2 = ADC_CR2_JEXTSEL; // Tətik mənbəyi bitini seçin JSWSTART ADC1->CR2 |= ADC_CR2_JEXTTRIG; // Yerləşdirilmiş ADC1->CR2 qrupunun xarici işə salınmasına icazə verin |= ADC_CR2_CONT; // Davamlı çevrilmə rejimini aktivləşdirin ADC1->CR1 |= ADC_CR1_SCAN; // Çoxkanallı skan rejimini aktivləşdirin ADC1->CR1 |= ADC_CR1_JAUTO; // Enjekte edilmiş qrupun avtomatik işə salınması ADC1->JSQR = (uint32_t)(4-1)<<20; // Задать количество каналов в инжектированной группе=4 ADC1->JSQR |= (uint32_t)3<<(5*0); // Номер первого канала для преобразования=3 ADC1->JSQR |= (uint32_t)4<<(5*1); // Номер второго канала для преобразования=4 ADC1->JSQR |= (uint32_t)5<<(5*2); // Номер третьего канала для преобразования=5 ADC1->JSQR |= (uint32_t)6<<(5*3); // Номер четвертого канала для преобразования=6 ADC1->CR2 |= ADC_CR2_ADON; // ADC ADC1->CR2-ni aktivləşdir |= ADC_CR2_JSWSTART; // Transformasiyaya başlayın ) //=========== // Proqramın əsas modulu //=========== =========== == void main(void) ( unsigned int ai; // Dəyişənləri işə salın Init_ADC(); // ADC-ni işə salın və işə salın // Digər əmrlər ... while(1) // Sonsuz dövrə ( //Nəticəni oxuyun conversion ai=ADC1->JDR1; // Channel 3 ai=ADC1->JDR2; // Channel 5 ai=ADC1->JDR4 // Kanal 6; .. ))

İnyeksiya edilmiş qrupun məlumat registrlərində yuxarıda göstərilən ADC başlanğıc funksiyasını yerinə yetirdikdən sonra, kanal proqramında göstərilən çevrilmə nəticələri müntəzəm olaraq yenilənəcəkdir. Buna görə də, bu nəticələr lazım olduqda istənilən vaxt oxuna bilər.
STM32 mikrokontrollerinin ADC bloku haqqında daha çox məlumatı veb saytında tapa bilərsiniz.

ADC Neo-Modus" Direct Connect (NMDC) kimi müştəri-server şəbəkələri üçün mətn əsaslı protokoldur. Məqsəd nə müştəriyə, nə də serverə yük olmayan və genişləndirilə bilən sadə protokol yaratmaqdır. NMDC protokolunun bəzi zəif həllərini düzəldir, lakin hamısını deyil.

Eyni qarşılıqlı əlaqələr nəzərə alınır: müştəri-müştəri və müştəri-server. Bu sənədlər iki hissəyə bölünür; birinci hissə protokolun strukturunu, ikincisi - bu strukturdan istifadə üçün protokol sisteminin spesifikliyini təsvir edir. Advanced Direct Connect ilk versiyadır və tədricən təkmilləşdiriləcək.

Protokol üçün ideyaların çoxu DCTNG layihəsindən gəldi (Yan Vidar Krey-in) inkişafının əsas iştirakçıları: Dastin Brody, Walter Doekes, Timmo Stange, Fredrik Ullner, Fredrik Stenberg və başqaları NMDC protokolu.

Protokolun üstünlükləri

  • SID, eləcə də protokol komanda adları dörd böyük Latın simvolundan ibarətdir. Protokol SI dilində həyata keçirmək üçün olduqca uyğundur. SI dil standartına görə sizeof(char) == 1, yəni 4 simvol 4 bayt tutacaq və ya dörd baytlıq tam ədəd kimi göstərilə bilər. Sətri rəqəmə və arxaya çevirmək əmrlərlə işi əhəmiyyətli dərəcədə asanlaşdırır və optimallaşdırır və əmri birləşmə kimi saxlamağa imkan verir.

Protokolun çatışmazlıqları

  • Protokol ayırıcıları \s və \n ilə əvəz edilməli olan çox ümumi simvollardır (boşluq və defis). Söhbət mesajlarında bu simvollar çox yaygın olduğundan, dəyişdirmələrin sayı həmişə çox olacaq, NMDC protokolunda belə deyildi.
  • NMDC protokolu ilə müqayisədə ADC protokolu UserCommand-da xüsusi menyunu silmək imkanına malikdir. Bununla belə, hələ də konkret menyunu silmək imkanı yoxdur müəyyən kontekstdə.

Versiya tarixçəsi

Bu sənədin sonrakı versiyaları, həmçinin aralıq və köhnə versiyaları aşağıdakılardan əldə edilə bilər: . Bu versiya yenidən baxılmaq üçün təqdim olunur:

Versiya 1.0.1, 2008-05-02

  • Genişləndirmələr ayrı bir sənəddə vurğulanır.
  • Spesifikasiyalar SourceForge-da ayrıca bir layihəyə bölünür.

Versiya 1.0, 2007-12-01

  • İlk buraxılış

Protokol quruluşu

  • Bütün protokol əmrləri dörd hərflə başlayır. Birinci məktub əmrin necə göndərilməsini, sonrakı üçü isə nə edilməli olduğunu göstərir.
  • Parametrlər boşluqlarla ayrılır və hər bir əmr sətir sonu ilə bitir (kod 0x0a). Elementlər qaçırılır: "\s" - boşluq, "\n" - yeni xətt və "\\" əks kəsikdir. Protokolun bu versiyası gələcəkdə mümkün istifadə üçün bütün digər qaçmış simvolları özündə saxlayır; naməlum qaçmış simvolları ehtiva edən hər hansı əmrlərə məhəl qoyulmamalıdır.
  • Bütün göndərilən əmrlər UTF-8 kodlaşdırmasında göndərilməlidir - C normallaşdırmasında kodlanmış Unicode.
  • Müştərilər naməlum/etibarsız əmrlərə məhəl qoymamalıdırlar. Hublar etibarsız əmrlərə məhəl qoymamalı və naməlum əmrləri növlərinə (prefiks) görə göndərməlidirlər.
  • Müştəri ünvanları formada müəyyən edilməlidir ondalık ədədlər, IPv4 üçün nöqtələrlə ("x.x.x.x") və ya IPv6 üçün RFC (1884) formatında ayrılır. Qovşaq ünvanları qarşısında "adc" prefiksi olan keçidlə müəyyən edilməlidir ki, bu da bu protokolun xüsusiyyətlərini göstərir ("adc://server:port/").
  • Nömrələr üzən nöqtə standartına uyğun olaraq sətirlər kimi göndərilir, tam kəsr hissəsi arasında ayırıcı kimi "." nöqtəsi istifadə olunur. . Tam ədədlər kəsr hissəsi olmayan və eksponensial əlavəsi olmayan ədədlərdir. Proqramlar 64 bit ilə işləyə bilməlidir müsbət ədədlər və 64 bitlik üzən nöqtə nömrələri ilə. İnkar prefiksi "-" işarəsidir.

D (Birbaşa mesaj) Hub bu əmri müəyyən edilmiş SID ilə istifadəçiyə göndərməlidir.

E (Exo mesajı) Hub əmri sid və my_sid ilə istifadəçilərə göndərməlidir.

F (Bədii yayım) Hub bu əmri (+) / dəstəkləməyən (-) dəstəkləyən bütün müştərilərə göndərməlidir. bu xüsusiyyət. Müştərinin müəyyən bir xüsusiyyət üçün dəstəyi müştəri tərəfindən göndərilən INF əmrində olan SU sahəsindən müəyyən edilir.

H (Hub mesajı) Müştərilər istifadə etməlidirlər bu tip yalnız hub üçün nəzərdə tutulan əmr göndərmək.

I (Məlumat mesajı) Hublar başqa müştəri tərəfindən göndərilməmiş əmri göndərmək üçün bu tipdən istifadə etməlidirlər.

U (UDP mesajı) Müştərilər bu əmrdən yalnız birbaşa UDP bağlantıları üçün istifadə etməlidirlər.

Hash funksiyaları

Bəzi əmrlər hash funksiyalarını təyin etmək üçün istifadə olunur. SUP əmrindən istifadə edərək yeni bir əlaqə qurulduqda, hash funksiyaları mübadiləsi aparılır. Qoşularkən müştəri SUP əmrinin parametrləri vasitəsilə serverə bir neçə hash funksiyasını ötürür. Server onlardan birini götürür və onu serverdən göndərilən SUP əmrində hər hansı digər hash funksiyasından əvvəl yerləşdirərək müştəriyə ötürür. Müştəri və mərkəzin protokolda və fayl identifikasiyasında istifadə olunacaq ən azı bir eyni hash funksiyası olmalıdır.

Müştəri identifikasiyası

Hər bir müştəri üç müxtəlif identifikatorla müəyyən edilir: sessiya identifikatoru - Sessiya ID (SID), şəxsi identifikator - Şəxsi İD (PID) və müştəri identifikatoru - Müştəri ID (CID).

Fayllar

Fayl adları istifadəçi payında nisbi (uydurma) kökdən sayılır. "/" - kataloq ayırıcı; Hər bir fayl və ya kataloq adı böyük hərflərə həssas olmayan kontekstdə unikal olmalıdır. Fayl adında boşluq daxil olmaqla bütün çap edilə bilən simvollara icazə verilir; "/" və "\" simvolları "\" simvolu ilə qaçır. Müştərilər özlərinə uyğun ad filtrlərindən istifadə etməlidirlər fayl sistemləri, digər müştərilərdən alınan fayl adları da bu qaydalara əməl etməlidir. Xüsusi adlar "." və ".." kataloq və ya fayl adında ola bilməz; bu adları ehtiva edən istənilən nəticəli siyahı faylı nəzərə alınmamalıdır. Bütün kataloq adları "/" ilə bitməlidir.

Paylaşılan fayllar adsız kök "/" ("/dir/subdir/filename.ext") ilə müqayisədə müəyyən edilir, əlavələr isə kök adını əlavə edə bilər. Məsələn, TIGR əlavələri üçün "TTH/..." faylları "Tiger Tree Hash" ilə müəyyən etmək üçün "TTH" kök adından istifadə edir. Bu, yoxlama məbləği ilə identifikatorlu paylaşıma daxil edilən adsız kökdən olan adlar üçün qəbuledilməzdir.

Kök fayl adı olmadan "files.xml" UTF-8 kodlu XML formatında tam vərəq faylını təyin edir. Müştərilərə bu vərəq faylını sıxmaq üçün əlavələrdən istifadə etmək tövsiyə olunur.

Əlavələr adətən adların təkrarlanmasının qarşısını almaq üçün fayl adına öz uzantılarını əlavə edə bilər.

Xüsusi növ "siyahı" faylların siyahılarına baxmaq üçün istifadə olunur. Qismən fayl siyahısı adi siyahı ilə eyni struktura malikdir, lakin qovluqlar qismənliyi göstərən Incomplete="1" atributu ilə işarələnə bilər. Yalnız kök faylları olmayan qovluqlar "/" simvolu ilə başlaya bilər. Belə bir kataloqun məzmunu sonradan sorğu edən müştəriyə onun seçdiyi dərinlikdə göndəriləcək (bu, yalnız istifadəçinin tələb etdiyi səviyyəni göndərmək üçün lazımdır). "FileListing" sahəsinin "Baza" atributu bu faylın hansı xüsusi qovluğa aid olduğunu müəyyən edir.

Əvvəlcə proqram təminatı yaratmaq üçün istifadə etdiyimiz komponentləri başa düşməliyik. Və biz yalnız bir komponentdən istifadə etdik - PWM8. PWM Pulse Width Modulator deməkdir, yəni Pulse Width Modulator. Qurğunun mahiyyəti ondan ibarətdir ki, o, mikrokontroller tərəfindən yaradılan impulsların enini dəyişməyə imkan verir. Beləliklə, tezliyə həssas olmayan cihazlar üçün çıxış gərginliyinin dəyişdirilməsi.
Məsələn: mikrokontrolörün işləmə tezliyi 1Hz (yəni impulsun yaranma müddəti 1s), impulsun eni 0,5s, impuls gərginliyi 5V-dir.

Sonra orta çıxış gərginliyi saniyədə 2,5 volta bərabərdir. Və bu dəyər sadəcə olaraq əldə edilir: alt nəbz sahələrini əlavə edərək və onları ümumi müddətə bölmək yolu ilə. Hər ehtimala qarşı daha ətraflı yazacam. Deyək ki, biz 1 saniyəlik bir müddət çəkdik, rəqəmdən ilk nəbzin 0,5 sürdüyünü görə bilərsiniz. Biz 0,5s * 5V (nəbz gərginliyi) çarpırıq və bütün bunları vaxt intervalına bölürük. 0,5s*5V/1s = 2,5V. 3.33V çıxış gərginliyinə ehtiyacımız varsa, nəbz sahəsini 75% -ə çatdırmalı olacağıq. Ədəbiyyatda vəzifə dövrü termini tez-tez rast gəlinir. Beləliklə, vəzifə dövrü nəbz müddətinin sıfır potensialın müddətinə nisbətidir, məsələn, birinci halda 50%, ikincisi üçün 75% idi.

Düşünürəm ki, nəzəriyyə artıq kifayətdir və dövrəyə PWM quraşdırmaqda heç bir problem yox idi. Ancaq komponentin parametrlərini daha ətraflı nəzərdən keçirməyə dəyər. Bunun üçün dəyişdirilmiş parametrləri vurğulanmış ekran görüntüsünü təqdim edəcəyəm.

Saat PWM-nin işləmə tezliyidir, hər hansı bir rəqəmsal və ya analoq-rəqəmsal blok müəyyən bir saat tezliyində işləməlidir; Buna görə tezlik bölücülər və Saat sahəsi icad edilmişdir. SysClk Qlobal Resurslar sekmesinde təyin edilmiş sistem tezliyidir. Maraqlıdır ki, Saat açılan siyahısında Row_0_Input_0 kimi sahələr var. Bu o deməkdir ki, modulun saat generatoru çipdən kənarda ola bilər və onlar Row_0_Input_0 avtobusu vasitəsilə sinxronlaşdırılacaq.

Enable - bu blokun məntiqi vahid səviyyəsi. Tipik olaraq iki standart istifadə olunur: Yüksək = 5V və Aşağı = 3V. Yeri gəlmişkən, mikrokontrolörün özü də Yüksək və ya Aşağı rejimlərdən birinə keçə bilər.

CompareOut - impuls eni modulator çıxışı.

Sual yarana bilər: əgər praktikada biz ondan heç vaxt heç yerdə istifadə etməmişiksə, yuxarıdakı nəzəriyyə niyə verilmişdir? Cavab budur ki, biz nəbz uzunluğu və dövr vaxtı üçün standart dəyərlərdən istifadə etdik (Period və PulseWidth sahələri) 0 0. Belə dəyərlərlə PWM çıxışı məntiqi bir dəyərə bərabər möhkəm bir siqnala sahib olacaqdır. Siz həmçinin PWM8_1_WritePeriod() və PWM8_1_WritePulseWidth() funksiyalarından istifadə edərək mikrokontrolörün iş rejimində proqramlı olaraq dövr vaxtı və nəbz eni dəyərlərini dəyişə bilərsiniz.

ADC və ya ADC

ADC - analoqdan rəqəmsal çevirici (və ya ADC Analoqdan rəqəmsal çevirici) analoq siqnalı rəqəmsal birinə çevirməyə imkan verən bir cihazdır. İstənilən fiziki kəmiyyətlər (təzyiq, sürət, fırlanma bucağı, gərginlik, cərəyan, işıq intensivliyi) analoqdur və ADC-nin vəzifəsi onları enerjiyə çevirməkdir. rəqəmsal siqnal. Praktikada gərginlik adətən rəqəmsal siqnala çevrilmək üçün istifadə olunur.
ADC-nin bir çox xüsusiyyətlərindən üç əsası vurğulanmalıdır:

  1. Bit dərinliyi ən kiçik vahiddir analoq siqnal, ADC-nin qeyd edə biləcəyi dəyişiklik adətən bitlə ölçülür.
  2. Dönüşüm tezliyi - SPS ilə ölçülən saniyədə ölçmələrin sayı (saniyədə nümunələr)
  3. Əməliyyat diapazonu - bu çeviricinin işlədiyi dəyərlər diapazonu.

ADC artıq PWM qədər sadə bir cihaz olmadığı üçün. Mikrokontrolörün bir neçə nəzəri aspektinə və ADC-nin özünün bəzi xüsusiyyətlərinə baxmalı olacağıq.

Mikrokontrolörün ümumi xüsusiyyətləri

PSoC çipləri ilə işləyərkən bilməli olduğunuz bəzi anlayışların və təyinatların siyahısı (yeri gəlmişkən, yalnız aşağıda göstərilənlər AVR mikro nəzarətçiləri üçün doğru olmayacaq)

Təsvirlərdə və s dövrə diaqramları məlumat vərəqlərinə tez-tez Vcc, Vdd, Vss, AGND kimi təyinatlar daxildir. Və aralarındakı fərq bəzən ən bariz deyil. Vcc mikrokontrolörün (cc - kollektordan kollektora) təchizatı gərginliyidir, Vdd ilə eynidir, tarixən belə oldu ki, eyni dəyərin 2 təyinatı var. Vss mikrokontrollerdəki minimum potensialdır; çox vaxt bu dəyər AGND-ə bərabərdir. AGND abbreviaturasındakı "A" hərfi onun süni zəmin və ya olduğunu göstərir süni torpaq. Adətən BandGap adlanan dövrədə bu gərginliyi qeyd etmək lazımdır. BandGrap gərginliyə istinad edir. İstinad gərginliyi, MK təchizatı gərginliyindən, temperaturdan və digər xarici göstəricilərdən asılı olmayaraq sabit qalması deməkdir. Vref, nəzərdən keçirilən fərdi modulun istinad gərginliyidir. Çox uzun müddət Rail-to-Rail nə olduğunu başa düşə bilmədim. Və mən bu ifadəyə belə kontekstlərdə rast gəldim: "Bu modul Dəmirdən Dəmirə rejimində işləyə bilər." Beləliklə, Rail-to-Rail o deməkdir ki, element Vcc-dən AGND-ə qədər bütün gərginlik diapazonunda işləyə bilər.

Nümunə 2: Gərginliyin ölçülməsi

Tapşırıq: Sazlama lövhəsinə bərkidilmiş potensiometrdə gərginliyi ölçün və dəyəri ekranda göstərin.

Burada daha maraqlı olur. Həmişə olduğu kimi, dizayneri işə salırıq və layihə yaradırıq. İstifadəçi Modulları -> Misc Data -> LCD-ə gedin və onu mikrokontrollerə sürükləmək üçün sol klikləyin. LCD çox faydalı və sadə moduldur və bundan başqa rəqəmsal blokda yer tutmur. Siz bunu Workspace Explorer nişanında görə bilərsiniz. Parametrlərdən o, yalnız LCDPort = Port_2 seçməlidir. İndi main.c faylına keçin, onun Workspace Explorer -> [Layihə adı] -> Mənbə Faylları -> main.c-də yerləşdiyini sizə xatırlatmağa icazə verin. Və aşağıdakı kodu main() funksiyasına əlavə edin.

LCD_Start();

LCD_Mövqe(0,0); LCD_PrCString("Ölçülən Gərginlik"); ekrana çıxdılar və onlar buna nail ola bilmədilər. Və bu məni xoşbəxt edir. İndi ADC-dən asılıdır. İstifadəçi Modulları -> Legacy -> ADCINC12 seçin və onu nəzarətçiyə atın. Sual yarana bilər: “Niyə biz sadəcə olaraq ADCINC-i və ADCINC12-ni və əlavə olaraq Legacy qovluğundan seçmədik, bunun səbəbi modulların işə salınmasının mürəkkəbliyindədir və bu, daha diqqətli olmağı tələb edir və hərtərəfli konfiqurasiya Miras qovluğunda, daha az çevik olan, lakin həyata keçirilməsi daha asan olan bir modul var. dövrə. əməliyyat gücləndiricisi. Giriş empedansını artırmaq üçün gücləndirmək üçün çox ehtiyac yoxdur. Belə ki, dövrədəki cərəyanın böyüklüyü ölçmə dəqiqliyinə təsir göstərməsin.
PWM parametrlərini ekran görüntüsündə olduğu kimi qurun.

  1. Qazanc - qazanc faktoru.
  2. Giriş - cihaz girişi.
  3. İstinad - istinad gərginliyi.

ADC parametrlərini belə təyin edirik:

  1. TMR Clock - taymerin saat tezliyi.
  2. Giriş - cihaz girişi (PGA-ya qoşulmuşdur).
  3. CNT Clock - əks tezlik.

Bizə lazım olan son şey normal əməliyyat, bu Ref Mux adlı qlobal resursdur. Ref Mux analoq blokların işləmə gərginliyi diapazonudur. Əgər (Vdd/2)+/-(Vdd/2) dəyəri təyin etsək, 0-dan 5V-ə qədər tam gərginlik fərqi əldə edəcəyik. Ancaq bunun müəyyən bir mənfi cəhəti var. Təchizat gərginliyi istinad gərginliyi kimi qəbul edildiyi üçün. Vdd gərginliyi üzürsə, bu, nəticələrin düzgünlüyünə təsir edəcəkdir. Bu halda BandGap bizim üçün faydalı olardı. Ancaq hələlik bu barədə narahat olmayaq və (Vdd/2)+/-(Vdd/2) təyin edək.
İki dəfə yoxlamaq üçün sizə analoq blokların nəticədə keçidinin ekran görüntüsünü göndərəcəyəm.

main.c saytına gedin və aşağıdakı kodu main() funksiyasına əlavə edin:

PGA_Start(PGA_HIGHPOWER); //PGA işə salın ADCINC12_Start(ADCINC12_HIGHPOWER); //ADC-ni başladın ADCINC12_GetSamples(0); //ADC-nin davamlı işləməsinə təyin edilməsi M8C_EnableGInt ; // Qlobal Kesintiləri aktivləşdirmək üçün bu sətri şərhdən çıxarın while(1) // əsas proqram təminatı döngəsi ( if (ADCINC12_fIsDataAvailable() != 0) // ADC-də verilənləri yoxlayın ( nəticə = ADCINC12_iGetData() + 2048; ADCINC12_ClearFlag( LCD_); 1,0); //çıxış üçün mövqe təyin etmək LCD_PrHexInt(nəticəni hex şəklində çıxarın ) );

Məlumatları imzasız ekvivalentə çevirmək üçün iGetData() funksiyasının məlumatlarına 2048 əlavə olunur (əgər siz Google-da “c++ imzalanmış və imzasız dəyişənlər”ə baxmaqla maraqlanırsınızsa).

Potensiometri lövhəyə aşağıdakı kimi bağlayırıq.

Mikrokontrolleri yandırırıq və işin nəticəsini qiymətləndiririk.

Qalan şey, hexləri gərginliyə çevirmək və məlumatların düzgünlüyünü bir test cihazı ilə yoxlamaqdır. Biz bu məqsədə sırf eksperimental yolla nail olacağıq. Gəlin vəziyyəti özümüz üçün asanlaşdıraq və ADC çıxışında sıfır potensialı 0x0000 dəyəri kimi götürək. Sonra artıq yazılmış proqramımızı işə salırıq, potensiometri maksimuma çeviririk və yaranan dəyərlərə baxırıq. Məsələn, mən 0x0FEC aldım. Sonra bir test cihazı götürürük və potensiometrdə real gərginliyi ölçürük. 4.78V aldım. İndi biz 4.78/0x0FEC-i bölürük (hesablama sistemləri ilə bağlı problemi olanlar üçün sizə pompalamağı məsləhət görürəm) və kvantlaşdırma addımını, yəni bir ADC çıxış dəyərinin uyğun gəldiyi gərginlik vahidini alırıq. Mən 0.0011727183513248 aldım, bu nömrədir. İndi biz sadəcə olaraq ADC-dən alınan nəticəni bu qiymətə vururuq və onu ekranda göstəririk. Bunu etmək üçün qlobal görünmə sahəsinə dəyişənlər əlavə edin (bu, main() funksiyasından kənarda olan hər şeydir).