- Що таке АЦП?
- АЦП в ARM7-LPC2148
- Шпильки ADC в ARM7-LPC2148
- Реєстрації ADC в ARM7-LPC2148
- Реєстрація ADxCR у LPC2148
- ADxGDR: Глобальний реєстр даних ADC
- Потрібні компоненти
- Кругова діаграма
- Програмування ARM7-LPC2148 для АЦП
У світі електроніки на ринку існує безліч різновидів аналогових датчиків, які використовуються для вимірювання температури, швидкості, переміщення, тиску тощо. Аналогові датчики використовуються для отримання вихідних даних, які постійно змінюються з часом. Ці сигнали від аналогових датчиків, як правило, мають дуже мале значення від декількох мікровольт (мкВ) до декількох мілівольт (мВ), тому потрібна якась форма посилення. Для використання цих аналогових сигналів у мікроконтролері нам потрібно перетворити аналоговий сигнал у цифровий, оскільки мікроконтролер розуміє та обробляє лише цифрові сигнали. Отже, більшість мікроконтролерів мають вбудовану важливу функцію, яка називається ADC (аналого-цифровий перетворювач). Наш мікроконтролер ARM7-LPC2148 також має функцію АЦП.
У цьому посібнику ми побачимо, як використовувати АЦП в ARM7-LPC2148, подаючи різну напругу на аналоговий штифт і відображати його на РК-екрані 16x2 після аналогового на цифрове перетворення. Отже, почнемо з короткого вступу про АЦП.
Що таке АЦП?
Як було сказано раніше, АЦП розшифровується як перетворення аналогового в цифрове, і він використовується для перетворення аналогових значень із реального світу в цифрові значення, такі як 1 і 0. То що це за аналогові значення? Це ті, які ми бачимо у своєму повсякденному житті, такі як температура, швидкість, яскравість тощо. Ці параметри вимірюються як аналогові напруги відповідними датчиками, а потім ці аналогові значення перетворюються у цифрові значення для мікроконтролерів.
Припустимо, що наш діапазон АЦП становить від 0 В до 3,3 В, і ми маємо 10-бітний АЦП, це означає, що наша вхідна напруга 0-3,3 Вольта буде розділена на 1024 рівні дискретних аналогових значень (2 10 = 1024). Значення 1024 - це роздільна здатність для 10-бітового АЦП, аналогічно для 8-бітового АЦП дозвіл буде 512 (28), а для 16-бітного АЦП - 65 536 (216). LPC2148 має 10-бітний АЦП з роздільною здатністю.
Якщо це фактична вхідна напруга 0 В, то АЦП MCU зчитує його як 0, а якщо воно становить 3,3 V, MCU буде читати 1024, а якщо це десь посередині, як 1,65 V, тоді MCU буде читати 512. Ми можемо використовувати нижче формули для розрахунку цифрового значення, яке буде зчитуватися MCU на основі роздільної здатності АЦП та робочої напруги.
(Дозвіл АЦП / робоча напруга) = (Цифрове значення АЦП / Фактичне значення напруги)
Як, наприклад, якщо опорна напруга становить 3 В:
Ми детально пояснили АЦП у попередній статті.
АЦП в ARM7-LPC2148
- LPC2148 містить два аналого-цифрових перетворювача.
- Ці перетворювачі є одинарними 10-бітними послідовними наближеними аналоговими до цифрових перетворювачами.
- Хоча ADC0 має шість каналів, ADC1 має вісім каналів.
- Отже, загальна кількість доступних входів АЦП для LPC2148 становить 14.
- Він перетворює вхідну напругу лише в діапазоні (від 0 до 3,3 В). Він не повинен перевищувати 3,3 В опорної напруги. Оскільки це пошкодить ІС, а також забезпечить невизначені значення.
Деякі важливі особливості АЦП у LPC2148
- Кожен перетворювач здатний виконувати більше 400000 10-бітових вибірок в секунду.
- Кожен аналоговий вхід має виділений регістр результатів для зменшення накладних витрат на переривання.
- Режим серійного перетворення для одного або декількох входів.
- Необов’язкове перетворення при переході на вхідний штифт або сигнал відповідності таймера.
- Команда Global Start для обох перетворювачів.
Також перевірте, як використовувати АЦП в інших мікроконтролерах:
- Як використовувати АЦП в Arduino Uno?
- Зв'язок ADC0808 з мікроконтролером 8051
- Використання модуля АЦП мікроконтролера PIC
- Підручник з ADC Raspberry Pi
- Як використовувати АЦП в MSP430G2 - Вимірювання аналогової напруги
- Як користуватися АЦП в STM32F103C8
Шпильки ADC в ARM7-LPC2148
Як розповідав Earliar, в ARM7-LPC2148 є два канали ADC0 з 6 аналоговими вхідними штифтами і ADC1 з 8 аналоговими вхідними штифтами. Отже, є 14 контактів для аналогових входів. На наведеній нижче схемі показані контакти, доступні для аналогового введення.
Оскільки вхідні висновки АЦП мультиплексуються з іншими виводами GPIO. Нам потрібно ввімкнути їх, налаштувавши регістр PINSEL для вибору функції АЦП.
У таблиці нижче наведені висновки АЦП та відповідний номер каналу АЦП у LPC2148. AD0 - це канал 0, а AD1 - канал 1
LPC2148 Штифт |
Номер каналу АЦП |
P0.28 |
AD0.1 |
P0.29 |
AD0.2 |
P0.30 |
AD0.3 |
P0.25 |
AD0.4 |
Р0.4 |
AD0.6 |
P0.5 |
AD0.7 |
P0.6 |
AD1.0 |
P0.8 |
AD1.1 |
P0.10 |
AD1.2 |
Р0.12 |
AD1.3 |
P0.13 |
AD1.4 |
Р0.15 |
AD1,5 |
P0.21 |
AD1.6 |
P0.22 |
AD1.7 |
Реєстрації ADC в ARM7-LPC2148
Регістри використовуються при програмуванні для використання функції перетворення АЦП у LPC2148.
Нижче наведено список регістрів, які використовуються в LPC2148 для АЦП перетворення
1. ADCR: Регістр аналогового цифрового управління
Використання: Цей регістр використовується для налаштування АЦП у LPC2148
2. ADGDR: аналоговий цифровий глобальний реєстр даних
Використання: Цей регістр має ВИКОНАНИЙ біт для АЦП, і РЕЗУЛЬТАТ перетворення зберігається тут
3. ADINTERN: Реєстр увімкнення аналогового та цифрового переривань
Використання: Це реєстр увімкнення переривань.
4. ADDR0 - ADDR7: Регістр даних аналогових цифрових каналів
Використання: Цей регістр містить значення A / D для відповідних каналів.
5. ADSTAT: аналог цифрового реєстру статусу.
Використання: Цей регістр містить прапор DONE для відповідного каналу ADC, а також прапор OVERRUN для відповідного каналу ADC.
У цьому підручнику ми використовуватимемо лише регістри ADCR та ADGDR. Подивимось про них докладно
Реєстрація ADxCR у LPC2148
AD0CR і AD1CR для каналу 0 та каналу 1 відповідно. Це 32-розрядний регістр. Нижче в таблиці вказані бітові поля для реєстру ADCR.
31:28 |
27 |
26:24 |
23:22 |
21 |
20 |
19:17 |
16 |
15: 8 |
7: 0 |
ЗАРЕЗЕРВОВАНИЙ |
КРАЙ |
СТАРТ |
ЗАРЕЗЕРВОВАНИЙ |
PDN |
ЗАРЕЗЕРВОВАНИЙ |
CLKS |
ПОРИВ |
CLCKDIV |
SEL |
Давайте подивимося, як налаштувати окремі регістри
1. SEL: Біти від (0 до 7) використовуються для вибору каналу для перетворення АЦП. Для кожного каналу виділяється один біт. Наприклад, встановлення біта-0 змусить АЦП взяти зразок AD0.1 для перетворення. А встановлення біта -1 зробить AD0,1; аналогічним чином установка біта-7 зробить перетворення для AD0.7. Важливим кроком є наявність PINSEL відповідно до порту, який ми використовуємо, наприклад PINSEL0 для PORT0 у PLC2148.
2. CLCKDIV: Біти від (8 до 15) призначені для годинникового дільника. Тут годинник APB (ARM Peripheral Bus clock) ділиться на це значення плюс одиниця для отримання тактової частоти, необхідної для цифрового цифрового перетворювача, яка повинна бути менше або дорівнює 4,5 МГц, оскільки ми використовуємо метод послідовного наближення в LPC2148.
3. BURST: Біт 16 використовується для режиму BURST перетворення.
Параметр 1: АЦП виконає перетворення для всіх каналів, вибраних у бітах SEL.
Налаштування 0: Вимкне режим перетворення BURST.
4. CLCKS: Біти від (17 до 19) трьох бітів використовуються для вибору роздільної здатності та кількості тактових частот для A / D перетворення в режимі серійної передачі, оскільки це режим безперервного A / D перетворення.
Значення для бітів (від 17 до 19) |
Біти (точність) |
Ні годинника |
000 |
10 |
11 |
001 |
9 |
10 |
010 |
8 |
9 |
011 |
7 |
8 |
100 |
6 |
7 |
101 |
5 |
6 |
110 |
4 |
5 |
111 |
3 |
4 |
5. PDN: Біт 21 призначений для вибору режиму відключення АЦП в LPC2148.
- A / D знаходиться в режимі PDN.
- A / D знаходиться в робочому режимі
6. СТАРТ: Біти від (24 до 26) призначені для СТАРТУ. Коли режим перетворення BURST вимкнений, встановивши 0, ці біти START корисні для того, коли починати A / D перетворення. START також використовується для керованого перетворення. Саме тоді, коли на вході CAP або MAT висновок LPC2148 є ввід, A / D починає перетворювати. Давайте перевіримо таблицю нижче
Значення для бітів (від 24 до 26) |
Шпильки LPC2148 |
Функція АЦП |
000 |
Використовується для встановлення АЦП в режимі PDN Без старту |
|
001 |
Почати АЦП перетворення |
|
010 |
CAP0.2 / MAT0.2 |
Почати АЦП на EDGE, обраному на штифті 27 (Піднімання або Падіння) на штифтах CAP / MAT LPC2148 |
011 |
CAP0.0 / MAT0.0 |
|
100 |
МАТ0.1 |
|
101 |
МАТ0.3 |
|
110 |
МАТ1.0 |
|
111 |
МАТ1.1 |
7. EDGE: 27- й біт для EDGE використовується лише тоді, коли біт START містить 010-111. Він починає перетворення, коли є введення CAP або MAT, про що ви можете побачити в таблиці вище.
Налаштування : 0 - На падаючому краї
1 - На Rising Edge
ADxGDR: Глобальний реєстр даних ADC
AD0GDR & AD1GDR для ADC Channel 0 і ADC Channel 1 відповідно.
Це 32-розрядний регістр, що містить РЕЗУЛЬТАТ A / D перетворення, а також біт DONE, який вказує, що A / D перетворення виконано. Нижче в таблиці вказані бітові поля для реєстру ADGDR.
31 |
30 |
29:27 |
26:24 |
23:16 |
15: 6 |
5: 0 |
ГОТОВО |
ПЕРЕБІГ |
ЗАРЕЗЕРВОВАНИЙ |
CHN |
ЗАРЕЗЕРВОВАНИЙ |
РЕЗУЛЬТАТ |
ЗАРЕЗЕРВОВАНИЙ |
1. РЕЗУЛЬТАТ: Ці біти (від 6 до 15) містять результат АЦП для обраного каналу в регістрі ADCR SEL. Значення зчитується лише після завершення A / D перетворення, і це позначається бітом DONE.
ПРИКЛАД: Для 10-бітного результату АЦП збережене значення варіюється від (0 до 1023).
2. КАНАЛ: Ці біти від 24 до 26 містять номер каналу, для якого виконується A / D перетворення. Перетворене цифрове значення присутнє в біті RESULT.
ПРИКЛАД: 000 - для каналу АЦП 0, а 001 - для каналу АЦП 1 тощо
3. OVERRUN: 30- й біт для OVERRUN використовується в режимі BURST. Коли встановлено 1, попереднє перетворене значення ADC замінюється новим перетвореним значенням ADC. Коли регістр читається, він очищає біт OVERRUN.
4. ГОТОВО: 31-й біт призначений для ГОТОВОГО біта.
Набір 1: Коли A / D перетворення завершено.
Встановити 0: Коли реєстр читається та ADCR записується.
Ми бачили про важливі регістри, які використовуються в АЦП в LPC2148. Тепер давайте почнемо використовувати АЦП в ARM7.
Потрібні компоненти
Апаратне забезпечення
- Мікроконтролер ARM7-LPC2148
- Схема регулятора напруги 3,3 В
- Схема регулятора напруги 5В
- Потенціометр 10K - 2 No
- Світлодіод (будь-який колір)
- РК-дисплей (16X2)
- 9 В акумулятор
- Макет
- Підключення проводів
Програмне забезпечення
- Keil uVision5
- Magic Flash Tool
Кругова діаграма
У таблиці нижче наведено схеми з'єднань між РК та ARM7-LPC2148.
ARM7-LPC2148 |
РК-дисплей (16x2) |
Р0.4 |
RS (Вибір реєстру) |
P0.6 |
E (Увімкнути) |
Р0.12 |
D4 (контакт 4) |
P0.13 |
D5 (штифт даних 5) |
Р0.14 |
D6 (штифт даних 6) |
Р0.15 |
D7 (штифт даних 7) |
Дізнайтеся більше про використання РК-дисплея з ARM 7 - LPC2148.
ВАЖЛИВО: Тут ми використовуємо дві мікросхеми регулятора напруги, одну для РК-дисплея 5 В та іншу 3,3 В для аналогового входу, які можна змінювати за допомогою потенціометра.
З'єднання між 5V регулятором напруги з LCD та ARM7 Stick
Схема регулятора напруги 5В |
Функція штифта |
LCD & ARM-7 LPC2148 |
1. лівий штифт |
+ Ве від входу акумулятора 9 В |
NC |
2. центральний штифт |
- Ві від батареї |
VSS, R / W, K РК-дисплея GND ARM7 |
3. правий штифт |
Регульований вихід на 5 В |
VDD, A РК-дисплея + 5 В ARM7 |
Потенціометр з РК-дисплеєм
Потенціометр використовується для зміни контрастності РК-дисплея. Горщик має три штирі, лівий штифт (1) підключений до + 5 В, а центр (2) до VEE або V0 РК-модуля, а правий штифт (3) підключений до GND. Ми можемо регулювати контрастність, повертаючи ручку.
З'єднання між LPC2148 та потенціометром з регулятором напруги 3,3 В
Схема регулятора напруги 3,3 В |
Функція штифта |
ARM-7 LPC2148 |
1. лівий штифт |
- Ві від батареї |
Штифт GND |
2. центральний штифт |
Регульований вихід на 3,3 В. |
На потенціометр Вхід і вихід потенціометра на P0.28 |
3. правий штифт |
+ Ве від входу акумулятора 9 В |
NC |
Програмування ARM7-LPC2148 для АЦП
Для програмування ARM7-LPC2148 нам потрібен інструмент keil uVision & Flash Magic. Ми використовуємо USB-кабель для програмування ARM7 Stick через порт Micro USB. Ми пишемо код за допомогою Keil і створюємо шістнадцятковий файл, а потім шістнадцятковий файл перепрошивається на ARM7 за допомогою Flash Magic. Щоб дізнатись більше про встановлення keil uVision та Flash Magic та їх використання, перейдіть за посиланням Початок роботи з мікроконтролером ARM7 LPC2148 та запрограмуйте його за допомогою Keil uVision.
У цьому посібнику ми перетворюємо аналогову вхідну напругу (від 0 до 3,3 В) у цифрове значення за допомогою АЦП в LPC2148 і відображаємо аналогову напругу на РК-дисплеї (16x2). Для зміни вхідної аналогової напруги буде використовуватися потенціометр.
Щоб дізнатись більше про взаємодію РК-дисплея з 4-бітним режимом ARM7-LPC2148, перейдіть за цим посиланням.
Повний код для використання АЦП з ARM 7 наведено в кінці цього уроку, тут ми пояснюємо кілька частин.
Етапи, пов'язані з програмуванням LPC2148-ADC
1. Регістр PINSEL використовується для вибору контакту порту LPC2148 та функції АЦП як аналогового входу.
PINSEL1 = 0x01000000; // Виберіть P0.28 як AD0.1
2. Виберіть годинник і бітову точність для перетворення, записавши значення в ADxCR (контрольний регістр ADC).
AD0CR = 0x00200402; // Встановлює роботу ADC як 10-біт / 11 CLK для перетворення (000)
3. Почніть перетворення, записавши значення в біти START в ADxCR.
Тут я написав до 24- го розряду реєстру AD0CR.
AD0CR = AD0CR - (1 << 24);
4. Тепер, щоб перевірити Біт (31th) відповідних ADxDRy (дані АЦП регістр), оскільки вона змінюється від 0 до 1. Таким чином, ми використовуємо в той час як цикл постійно перевіряти, якщо перетворення виконується на 31 - й біт регістра даних.
поки (! (AD0DR1 & 0x80000000));
5. Після того, як для зробленого біта встановлено значення 1, перетворення успішне, далі ми зчитуємо результат з того ж реєстру даних ADC AD0DR1 і зберігаємо значення у змінній.
adcvalue = AD0DR1;
Далі ми використовуємо формулу для перетворення цифрового значення у напругу та зберігання у змінній з назвою напруга .
напруга = ((adcvalue / 1023.0) * 3.3);
5. Наступні рядки використовуються для відображення цифрових значень (від 0 до 1023) після аналого-цифрового перетворення.
adc = adcvalue; sprintf (displayadc, "adcvalue =% f", adc); LCD_DISPLAY (displayadc); // Відображення значення АЦП (від 0 до 1023)
6. Наступні рядки використовуються для відображення вхідної аналогової напруги (від 0 до 3,3 В) після аналого-цифрового перетворення та після кроку 5.
LCD_SEND (0xC0); sprintf (voltvalue, "Напруга =%. 2f V", напруга); LCD_DISPLAY (voltvalue); // Відображення (вхідна аналогова напруга)
7. Тепер ми повинні відобразити вхідну напругу та цифрові значення на РК-дисплеї. До цього ми повинні ініціалізувати РК-дисплей і використовувати відповідні команди для надсилання повідомлення на дисплей.
Нижче наведений код використовується для ініціалізації РК-дисплея
void LCD_INITILIZE (void) // Функція підготовки РК-дисплея { IO0DIR = 0x0000FFF0; // Встановлює штифт P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 як ВИХІД затримки_ms (20); LCD_SEND (0x02); // Ініціалізація рідкокристалічного дисплея в 4-розрядному режимі роботи LCD_SEND (0x28); // 2 рядки (16X2) LCD_SEND (0x0C); // Відображення на курсорі вимкнено LCD_SEND (0x06); // Курс автоматичного збільшення LCD_SEND (0x01); // Відобразити чіткий LCD_SEND (0x80); // Перший рядок перша позиція }
Нижче наведений код використовується для відображення значень на РК-дисплеї
недійсний LCD_DISPLAY (символ * ТЗД) // Функція друку символів послав по одному { uint8_t я = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Надсилає верхній гриз IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH для друку даних IO0CLR = 0x00000020; // RW LOW Режим запису delay_ms (2); IO0CLR = 0x00000040; // EN = 0, RS та RW без змін (тобто RS = 1, RW = 0) delay_ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Надсилає нижній гриз IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; delay_ms (2); IO0CLR = 0x00000040; delay_ms (5); i ++; } }
Функція нижче використовується для створення затримки
void delay_ms (uint16_t j) // Функція затримки в мілісекундах { uint16_t x, i; для (i = 0; i
Повний код із демонстраційним відео наведено нижче.