- Какво е ADC?
 - ADC в ARM7-LPC2148
 - ADC щифтове в ARM7-LPC2148
 - ADC регистрира в ARM7-LPC2148
 - ADxCR се регистрира в LPC2148
 - ADxGDR: Регистър за глобални данни на ADC
 - Необходими компоненти
 - Електрическа схема
 - Програмиране ARM7-LPC2148 за ADC
 
В света на електрониката има много разновидности на аналогови сензори на пазара, които се използват за измерване на температура, скорост, изместване, налягане и т.н. Аналоговите сензори се използват за производство на изход, който непрекъснато се променя с течение на времето. Тези сигнали от аналогови сензори са склонни да имат много малка стойност от няколко микроволта (uV) до няколко миливолта (mV), така че е необходима някаква форма на усилване. За използването на тези аналогови сигнали в микроконтролера трябва да преобразуваме аналоговия сигнал в цифров сигнал, тъй като микроконтролерът разбира и обработва само цифрови сигнали. Така че по-голямата част от микроконтролера има вградена важна функция, наречена ADC (аналогово-цифров преобразувател). Нашият микроконтролер ARM7-LPC2148 също има функция ADC.
В този урок ще видим как да използваме ADC в ARM7-LPC2148 чрез подаване на променливо напрежение към аналогов щифт и да го покажем на 16x2 LCD екран след аналогово в цифрово преобразуване. Затова нека започнем с кратко въведение за ADC.
Какво е ADC?
Както беше казано по-рано, ADC означава аналогово към цифрово преобразуване и се използва за преобразуване на аналогови стойности от реалния свят в цифрови стойности като 1 и 0. И така, какви са тези аналогови стойности? Това са тези, които виждаме в ежедневния си живот като температура, скорост, яркост и т.н. Тези параметри се измерват като аналогови напрежения от съответните сензори и след това тези аналогови стойности се преобразуват в цифрови стойности за микроконтролери.
Нека приемем, че нашият диапазон на ADC е от 0V до 3.3V и имаме 10-битов ADC, това означава, че нашето входно напрежение 0-3.3 волта ще бъде разделено на 1024 нива на дискретни аналогови стойности (2 10 = 1024). Значение 1024 е резолюцията за 10-битов ADC, подобно за 8-битовата ADC резолюция ще бъде 512 (28) и за 16-битова ADC резолюция ще бъде 65 536 (216). LPC2148 има 10-битова разделителна способност ADC.
С това, ако действителното входно напрежение е 0V, тогава ADC на MCU ще го прочете като 0 и ако е 3.3V, MCU ще отчете 1024 и ако е някъде между 1,65v, тогава MCU ще прочете 512. Можем да използваме по-долу формули за изчисляване на цифровата стойност, която ще бъде прочетена от MCU въз основа на разделителната способност на ADC и работното напрежение.
[Разделителна способност на ADC / Работно напрежение] = (Цифрова стойност на ADC / Действителна стойност на напрежението)
Като например, ако референтното напрежение е 3v:

Обяснихме ADC подробно в предишната статия.
ADC в ARM7-LPC2148
- LPC2148 съдържа два аналогово-цифрови преобразувателя.
 - Тези преобразуватели са единични 10-битови последователни сближаващи аналогови към цифрови преобразуватели.
 - Докато ADC0 има шест канала, ADC1 има осем канала.
 - Следователно общият брой на наличните ADC входове за LPC2148 е 14.
 - Той преобразува входното напрежение само в диапазона (от 0 до 3.3V). То не трябва да надвишава 3.3V референтното напрежение. Тъй като това ще навреди на интегралната схема и ще осигури несигурни стойности.
 
Някои важни характеристики на ADC в LPC2148
- Всеки преобразувател може да изпълнява над 400000 10-битови проби в секунда.
 - Всеки аналогов вход има специален регистър на резултатите за намаляване на режийните прекъсвания.
 - Режим на серийно преобразуване за единични или множество входове.
 - По избор преобразуване при преход на входен щифт или сигнал за съвпадение на таймера.
 - Команда Global Start за двата преобразувателя.
 
Също така проверете как да използвате ADC в други микроконтролери:
- Как да използвам ADC в Arduino Uno?
 - Връзка ADC0808 с 8051 микроконтролер
 - Използване на модул ADC на микроконтролера PIC
 - Raspberry Pi ADC Урок
 - Как да използвам ADC в MSP430G2 - Измерване на аналогово напрежение
 - Как да използвам ADC в STM32F103C8
 
ADC щифтове в ARM7-LPC2148
Както казах Earliar, в ARM7-LPC2148 има два канала ADC0 с 6 аналогови входни щифта и ADC1 с 8 аналогови входни щифта. Така че напълно има 14 пина за аналогови входове. Диаграмата по-долу показва щифтовете, които са налични за аналогов вход.

Тъй като входните щифтове ADC се мултиплексират с други GPIO щифтове. Трябва да ги активираме, като конфигурираме регистъра PINSEL, за да изберем функцията ADC.
Таблицата по-долу показва щифтове на ADC и уважаван номер на ADC канал в LPC2148. AD0 е канал 0, а AD1 е канал 1
| 
 LPC2148 ПИН  | 
 Номер на ADC канал  | 
| 
 P0.28  | 
 AD0.1  | 
| 
 P0.29  | 
 AD0.2  | 
| 
 P0.30  | 
 AD0.3  | 
| 
 P0.25  | 
 AD0.4  | 
| 
 P0.4  | 
 AD0.6  | 
| 
 P0.5  | 
 AD0.7  | 
| 
 P0.6  | 
 AD1.0  | 
| 
 P0.8  | 
 AD1.1  | 
| 
 P0.10  | 
 AD1.2  | 
| 
 P0.12  | 
 AD1.3  | 
| 
 P0.13  | 
 AD1.4  | 
| 
 P0.15  | 
 AD1.5  | 
| 
 P0.21  | 
 AD1.6  | 
| 
 P0.22  | 
 AD1.7  | 
ADC регистрира в ARM7-LPC2148
Регистри се използват при програмиране за използване на функция за A / D преобразуване в LPC2148.
По-долу е даден списък на регистрите, използвани в LPC2148 за A / D преобразуване
1. ADCR: Регистър за аналогово към цифрово управление
Употреба: Този регистър се използва за конфигуриране на A / D конвертора в LPC2148
2. ADGDR: Аналогов към цифров глобален регистър за данни
Използване: Този регистър има ГОТОВ бит за A / D конвертор и РЕЗУЛТАТЪТ от преобразуването се съхранява тук.
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) се използват за избор на канал за ADC преобразуване. За всеки канал се отделя по един бит. Например настройването на Bit-0 ще накара ADC да вземе пример AD0.1 за преобразуване. И задаването на бит -1 ще направи AD0.1; по подобен начин бит-7 ще направи преобразуването за AD0.7. Важна стъпка е, че имаме PINSEL според порта, който използваме, например PINSEL0 за PORT0 в PLC2148.
2. CLCKDIV: Битовете от (8 до 15) са за делител на часовника. Тук часовникът APB (ARM Peripheral Bus clock) е разделен на тази стойност плюс една, за да се получи тактовата честота, необходима за A / D преобразувателя, която трябва да бъде по-малка или равна на 4,5 MHz, тъй като ние използваме метод на последователно сближаване в LPC2148.
3. BURST: Битът 16 се използва за режим на BURST преобразуване.
Настройка 1: ADC ще направи преобразуването за всички канали, които са избрани в 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 е за избор на режим на изключване на ADC в LPC2148.
- A / D е в режим PDN.
 - A / D е в работен режим
 
6. СТАРТ: Битовете от (24 до 26) са за СТАРТ. Когато режимът на преобразуване BURST е ИЗКЛЮЧЕН чрез настройка 0, тези битове START са полезни за това кога да започне A / D преобразуването. START се използва и за преобразуване с ръбово управление. Тогава има вход в CAP или MAT щифт на LPC2148, A / D започва да преобразува. Нека проверим таблицата по-долу
| 
 Стойност за битове (24 до 26)  | 
 ПИН на LPC2148  | 
 Функция на ADC  | 
| 
 000  | 
 Използва се за настройка на ADC в режим PDN Няма старт  | 
|
| 
 001  | 
 Започнете A / D преобразуване  | 
|
| 
 010  | 
 CAP0.2 / MAT0.2  | 
 Започнете A / D преобразуване на EDGE, избран на щифт 27 (Rising or Falling) на CAP / MAT щифтове на LPC2148  | 
| 
 011  | 
 CAP0.0 / MAT0.0  | 
|
| 
 100  | 
 MAT0.1  | 
|
| 
 101  | 
 MAT0.3  | 
|
| 
 110  | 
 MAT1.0  | 
|
| 
 111  | 
 MAT1.1  | 
7. EDGE: 27 -ият бит е за EDGE се използва само когато битът START съдържа 010-111. Той започва преобразуване, когато има CAP или MAT вход, който можете да видите по-горе в таблицата за това.
Настройка : 0 - На падащ ръб
1 - На изгряващ ръб
ADxGDR: Регистър за глобални данни на ADC
AD0GDR и AD1GDR за ADC канал 0 и ADC канал 1 съответно.
Това е 32-битов регистър, съдържащ РЕЗУЛТАТА от A / D преобразуване, а също и ГОТОВ бит, което показва, че A / D преобразуването е извършено. Под таблицата са посочени битовите полета за ADGDR регистър.
| 
 31  | 
 30  | 
 29:27  | 
 26:24  | 
 23:16  | 
 15: 6  | 
 5: 0  | 
| 
 СВЪРШЕН  | 
 ПРЕКРАТЯВАНЕ  | 
 РЕЗЕРВИРАН  | 
 CHN  | 
 РЕЗЕРВИРАН  | 
 РЕЗУЛТАТ  | 
 РЕЗЕРВИРАН  | 
1. РЕЗУЛТАТ: Тези битове (6 до 15) съдържат резултата от A / D преобразуване за избрания канал в ADCR SEL регистъра. Стойността се чете само след превръщането на A / D е завършен и това е обозначено с DONE малко.
ПРИМЕР: За 10-битов ADC резултат запазената стойност варира от (0 до 1023).
2. КАНАЛ: Тези битове 24 до 26 съдържат номера на канала, за който се извършва A / D преобразуването. Преобразуваната цифрова стойност присъства в бита RESULT.
ПРИМЕР: 000 е за ADC канал 0 и 001 е за ADC канал 1 и т.н.
3. OVERRUN: 30 -тият бит за OVERRUN се използва в режим BURST. Когато е зададено 1, предишната преобразувана стойност на ADC се заменя с новопреобразуваната стойност на ADC. Когато регистърът се чете, той изчиства бита OVERRUN.
4. ГОТОВО: 31-ият бит е за ГОТОВ бит.
Комплект 1: Когато A / D преобразуването приключи.
Задайте 0: Когато регистърът се чете и ADCR се записва.
Видяхме за важните регистри, които се използват в ADC в LPC2148. Сега нека започнем да използваме ADC в ARM7.
Необходими компоненти
Хардуер
- Микроконтролер ARM7-LPC2148
 - 3.3V регулатор на напрежение IC
 - 5V регулатор на напрежение IC
 - 10K потенциометър - 2 бр
 - LED (всеки цвят)
 - LCD дисплей (16X2)
 - 9V батерия
 - Макет
 - Свързване на проводници
 
Софтуер
- Keil uVision5
 - Magic Flash Tool
 
Електрическа схема


Таблицата по-долу показва верижните връзки между LCD и ARM7-LPC2148.
| 
 ARM7-LPC2148  | 
 LCD (16x2)  | 
| 
 P0.4  | 
 RS (Избор на регистър)  | 
| 
 P0.6  | 
 E (Активиране)  | 
| 
 P0.12  | 
 D4 (ПИН за данни 4)  | 
| 
 P0.13  | 
 D5 (ПИН за данни 5)  | 
| 
 P0.14  | 
 D6 (ПИН за данни 6)  | 
| 
 P0.15  | 
 D7 (ПИН за данни 7)  | 
Научете повече за използването на LCD с ARM 7 - LPC2148.
ВАЖНО: Тук използваме две интегрални схеми на регулатора на напрежение, една за 5V LCD дисплей и друга 3.3V за аналогов вход, които могат да се променят с потенциометър.
Връзки между 5V регулатор на напрежение с LCD и ARM7 Stick
| 
 5V регулатор на напрежение IC  | 
 ПИН функция  | 
 LCD & ARM-7 LPC2148  | 
| 
 1. Ляв щифт  | 
 + Ve от батерия 9V вход  | 
 NC  | 
| 
 2. Централен щифт  | 
 - Ве от батерия  | 
 VSS, R / W, K на LCD GND на ARM7  | 
| 
 3. Десен щифт  | 
 Регулиран + 5V изход  | 
 VDD, A на LCD + 5V на ARM7  | 
Потенциометър с LCD
Потенциометър се използва за промяна на контраста на LCD дисплея. Потът има три щифта, левият щифт (1) е свързан към + 5V и център (2) към VEE или V0 на LCD модула, а десният щифт (3) е свързан към GND. Можем да регулираме контраста, като завъртим копчето.
Връзка между LPC2148 и потенциометър с регулатор на напрежение 3.3V
| 
 3.3V регулатор на напрежение IC  | 
 ПИН функция  | 
 ARM-7 LPC2148  | 
| 
 1. Ляв щифт  | 
 - Ве от батерия  | 
 GND щифт  | 
| 
 2. Централен щифт  | 
 Регулиран + 3.3V изход  | 
 Към потенциометър Вход и изход на потенциометър до P0.28  | 
| 
 3. Десен щифт  | 
 + Ve от батерия 9V вход  | 
 NC  | 
Програмиране ARM7-LPC2148 за ADC
За да програмираме ARM7-LPC2148, се нуждаем от инструмента keil uVision & Flash Magic. Използваме USB кабел за програмиране на ARM7 Stick чрез микро USB порт. Пишем код с помощта на Keil и създаваме шестнадесетичен файл и след това HEX файлът се мига на ARM7 стик с помощта на Flash Magic. За да научите повече за инсталирането на keil uVision и Flash Magic и как да ги използвате, следвайте връзката Първи стъпки с ARM7 LPC2148 Microcontroller и го програмирайте с Keil uVision.
В този урок ние преобразуваме аналоговото входно напрежение (0 до 3.3V) в цифрова стойност, като използваме ADC в LPC2148 и показваме аналоговото напрежение на LCD дисплей (16x2). Потенциометър ще се използва за промяна на входното аналогово напрежение.
За да научите повече за свързването на LCD с ARM7-LPC2148 4-битов режим, следвайте тази връзка.
В пълния код за използване на ADC с ARM 7 е дадена в края на този урок, ние сме тук обяснява няколко части от него.
Стъпки, включени в програмирането на LPC2148-ADC
1. Регистърът PINSEL се използва за избор на извода на порта на LPC2148 и функцията ADC като аналогов вход.
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. Сега трябва да проверим ГОТОВИЯ бит (31-и) на съответния ADxDRy (ADC регистър на данни), тъй като той се променя от 0 на 1. Така че ние използваме цикъл while, за да проверяваме постоянно дали преобразуването е извършено на 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); // Показване на ADC стойност (0 до 1023)
6. Следващите редове се използват за показване на входно аналогово напрежение (0 до 3.3V) след аналогово-цифрово преобразуване и след стъпка 5.
LCD_SEND (0xC0); sprintf (voltvalue, "Напрежение =%. 2f V", напрежение); LCD_DISPLAY (волтова стойност); // Дисплей (входно аналогово напрежение)
7. Сега трябва да покажем входното напрежение и цифровите стойности на LCD дисплея. Преди това трябва да инициализираме LCD дисплея и да използваме подходящи команди за изпращане на съобщение за показване.
Кодът по-долу се използва за инициализиране на LCD дисплея
void LCD_INITILIZE (void) // Функция за подготовка на LCD { IO0DIR = 0x0000FFF0; // Задава ПИН P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 като OUTPUT delay_ms (20); LCD_SEND (0x02); // Инициализиране на lcd в 4-битов режим на работа LCD_SEND (0x28); // 2 реда (16X2) LCD_SEND (0x0C); // Показване на курсора на разстояние LCD_SEND (0x06); // Автоматично увеличаване на курсора LCD_SEND (0x01); // Показване на ясен LCD_SEND (0x80); // Първа позиция първа позиция }
Кодът по-долу се използва за показване на стойностите на LCD
нищожен LCD_DISPLAY (Чар * съобщ) // Функция за отпечатване на героите изпратен един по един { uint8_t I = 0; докато (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
Пълният код с демонстрационно видео е даден по-долу.
