- Какво е 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
Пълният код с демонстрационно видео е даден по-долу.