- Что такое АЦП?
- АЦП в ARM7-LPC2148
- Контакты АЦП в ARM7-LPC2148
- Регистры АЦП в ARM7-LPC2148
- Регистр ADxCR в LPC2148
- ADxGDR: глобальный регистр данных ADC
- Необходимые компоненты
- Принципиальная электрическая схема
- Программирование ARM7-LPC2148 для АЦП
В мире электроники на рынке существует множество разновидностей аналоговых датчиков, которые используются для измерения температуры, скорости, смещения, давления и т. Д. Аналоговые датчики используются для получения выходного сигнала, который постоянно изменяется с течением времени. Эти сигналы от аналоговых датчиков, как правило, очень малы по величине от нескольких микровольт (мкВ) до нескольких милливольт (мВ), поэтому требуется какое-то усиление. Для использования этих аналоговых сигналов в микроконтроллере нам необходимо преобразовать аналоговый сигнал в цифровой, поскольку микроконтроллер понимает и обрабатывает только цифровые сигналы. Таким образом, большая часть микроконтроллеров имеет встроенную важную функцию, называемую АЦП (аналого-цифровой преобразователь). Наш микроконтроллер ARM7-LPC2148 также имеет функцию АЦП.
В этом руководстве мы увидим, как использовать АЦП в ARM7-LPC2148, подав переменное напряжение на аналоговый вывод и отображая его на ЖК-экране 16x2 после аналого-цифрового преобразования. Итак, давайте начнем с краткого введения об АЦП.
Что такое АЦП?
Как было сказано ранее, АЦП означает аналогово-цифровое преобразование и используется для преобразования аналоговых значений из реального мира в цифровые значения, такие как единицы и нули. Так что же это за аналоговые значения? Это те, которые мы видим в нашей повседневной жизни, такие как температура, скорость, яркость и т. Д. Эти параметры измеряются как аналоговые напряжения соответствующими датчиками, а затем эти аналоговые значения преобразуются в цифровые значения для микроконтроллеров.
Предположим, что диапазон нашего АЦП составляет от 0 В до 3,3 В, и у нас есть 10-разрядный АЦП, это означает, что наше входное напряжение 0–3,3 В будет разделено на 1024 уровня дискретных аналоговых значений (2 10 = 1024). Значение 1024 - это разрешение для 10-битного АЦП, аналогично для 8-битного АЦП разрешение будет 512 (28), а для 16-битного АЦП - 65 536 (216). LPC2148 имеет АЦП с разрешением 10 бит.
При этом, если фактическое входное напряжение составляет 0 В, тогда АЦП микроконтроллера считывает его как 0, а если оно составляет 3,3 В, микроконтроллер считывает 1024, а если оно находится где-то посередине, например, 1,65 В, тогда микроконтроллер будет читать 512. Мы можем использовать приведенное ниже. формулы для расчета цифрового значения, которое будет считываться MCU на основе разрешения АЦП и рабочего напряжения.
(Разрешение АЦП / Рабочее напряжение) = (Цифровое значение АЦП / Фактическое значение напряжения)
Как, например, если опорное напряжение 3v:
Мы подробно объяснили ADC в предыдущей статье.
АЦП в ARM7-LPC2148
- LPC2148 содержит два аналого-цифровых преобразователя.
- Эти преобразователи представляют собой одиночные 10-битные аналого-цифровые преобразователи последовательного приближения.
- В то время как ADC0 имеет шесть каналов, ADC1 имеет восемь каналов.
- Следовательно, общее количество доступных входов АЦП для LPC2148 равно 14.
- Он преобразует входное напряжение только в диапазоне (от 0 до 3,3 В). Оно не должно превышать 3.3V опорного напряжения. Так как это повредит ИС, а также даст неопределенные значения.
Некоторые важные особенности ADC в LPC2148
- Каждый преобразователь способен выполнять более 400000 10-битных выборок в секунду.
- Каждый аналоговый вход имеет специальный регистр результатов, чтобы уменьшить накладные расходы на прерывание.
- Режим пакетного преобразования для одного или нескольких входов.
- Дополнительное преобразование при переходе на входной вывод или сигнал согласования таймера.
- Команда Global Start для обоих конвертеров.
Также проверьте, как использовать АЦП в других микроконтроллерах:
- Как использовать АЦП в Arduino Uno?
- Взаимодействие ADC0808 с микроконтроллером 8051
- Использование модуля АЦП микроконтроллера PIC
- Учебник Raspberry Pi ADC
- Как использовать АЦП в MSP430G2 - Измерение аналогового напряжения
- Как использовать АЦП в STM32F103C8
Контакты АЦП в ARM7-LPC2148
Как уже было сказано ранее, в ARM7-LPC2148 есть два канала ADC0 с 6 выводами аналогового ввода и ADC1 с 8 выводами аналогового ввода. Всего для аналоговых входов 14 контактов. На диаграмме ниже показаны контакты, доступные для аналогового входа.
Поскольку входные контакты АЦП мультиплексированы с другими контактами GPIO. Нам нужно включить их, настроив регистр PINSEL для выбора функции ADC.
В таблице ниже показаны контакты АЦП и соответствующий номер канала АЦП в LPC2148. AD0 - канал 0, а AD1 - канал 1
LPC2148 Штифт |
Канал АЦП Нет |
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 |
Регистры АЦП в ARM7-LPC2148
Регистры используются в программировании для использования функции аналого-цифрового преобразования в LPC2148.
Ниже приведен список регистров, используемых в LPC2148 для аналого-цифрового преобразования.
1. ADCR: аналого-цифровой регистр управления
Использование: Этот регистр используется для настройки аналого-цифрового преобразователя в LPC2148.
2. ADGDR: аналого-цифровой глобальный регистр данных
Использование: в этом регистре есть бит DONE для аналого-цифрового преобразователя, и здесь сохраняется РЕЗУЛЬТАТ преобразования.
3. ADINTERN: аналого-цифровой регистр разрешения прерывания.
Использование: Это регистр разрешения прерывания.
4. ADDR0 - ADDR7: регистр данных аналого-цифрового канала
Использование: Этот регистр содержит аналого-цифровое значение для соответствующих каналов.
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 |
BURST |
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) делится на это значение плюс один, чтобы получить тактовую частоту, необходимую для аналого-цифрового преобразователя, которая должна быть меньше или равна 4,5 МГц, поскольку мы используем метод последовательного приближения в LPC2148.
3. BURST: бит 16 используется для режима BURST преобразования.
Настройка 1: АЦП выполнит преобразование для всех каналов, выбранных в битах SEL.
Настройка 0: отключит режим преобразования BURST.
4. CLCKS: биты от (17 до 19) трех битов используются для выбора разрешения и количества тактов для аналого-цифрового преобразования в пакетном режиме, поскольку это режим непрерывного аналого-цифрового преобразования.
Значение для битов (от 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.
- АЦП в рабочем режиме
6. СТАРТ: биты от (24 до 26) предназначены для СТАРТА. Когда режим преобразования BURST выключен установкой 0, эти биты START полезны, когда следует начинать аналого-цифровое преобразование. START также используется для преобразования с контролем фронта. То есть, когда есть вход в вывод CAP или MAT LPC2148, АЦП начинает преобразование. Давайте проверим приведенную ниже таблицу
Значение битов (от 24 до 26) |
Пины LPC2148 |
Функция АЦП |
000 |
Используется для установки АЦП в режим PDN Нет старта |
|
001 |
Начать аналого-цифровое преобразование |
|
010 |
CAP0.2 / MAT0.2 |
Начать аналого-цифровое преобразование на EDGE, выбранном на контакте 27 (восходящий или падающий) на контактах 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 для каналов 0 и 1 АЦП соответственно.
Это 32-битный регистр, содержащий РЕЗУЛЬТАТ аналого-цифрового преобразования, а также бит DONE, который указывает, что аналого-цифровое преобразование выполнено. В таблице ниже указаны битовые поля для регистра ADGDR.
31 год |
30 |
29:27 |
26:24 |
23:16 |
15: 6 |
5: 0 |
СДЕЛАННЫЙ |
ВЫПОЛНЕНИЕ |
ЗАРЕЗЕРВИРОВАННЫЙ |
CHN |
ЗАРЕЗЕРВИРОВАННЫЙ |
РЕЗУЛЬТАТ |
ЗАРЕЗЕРВИРОВАННЫЙ |
1. РЕЗУЛЬТАТ: Эти биты (с 6 по 15) содержат результат аналого-цифрового преобразования для выбранного канала в регистре ADCR SEL. Значение считывается только после завершения аналого-цифрового преобразования, и это указывается битом DONE.
ПРИМЕР: Для результата 10-битного АЦП сохраненное значение изменяется от (0 до 1023).
2. КАНАЛ: Эти биты с 24 по 26 содержат номер канала, для которого выполняется аналого-цифровое преобразование. Преобразованное цифровое значение присутствует в бите RESULT.
ПРИМЕР: 000 - для канала 0 АЦП, 001 - для канала 1 АЦП и т. Д.
3. OVERRUN: 30- й бит OVERRUN используется в BURST-режиме. При установке 1 предыдущее преобразованное значение АЦП перезаписывается вновь преобразованным значением АЦП. Когда регистр читается, он сбрасывает бит ПЕРЕПОЛНЕНИЯ.
4. DONE: 31-й бит предназначен для DONE.
Набор 1: когда аналого-цифровое преобразование завершено.
Установить 0: когда регистр читается и записывается ADCR.
Мы узнали о важных регистрах, которые используются в ADC в LPC2148. Теперь приступим к использованию ADC в ARM7.
Необходимые компоненты
Оборудование
- ARM7-LPC2148 Микроконтроллер
- ИС регулятора напряжения 3.3В
- ИС регулятора напряжения 5В
- Потенциометр 10K - 2 шт.
- LED (любой цвет)
- ЖК-дисплей (16X2)
- Аккумулятор 9В
- Макетная плата
- Подключение проводов
Программного обеспечения
- Keil uVision5
- Инструмент Magic Flash
Принципиальная электрическая схема
В таблице ниже показаны схемы соединений между ЖК-дисплеем и ARM7-LPC2148.
ARM7-LPC2148 |
ЖК-дисплей (16x2) |
P0.4 |
RS (выбор регистра) |
P0.6 |
E (включить) |
P0.12 |
D4 (вывод данных 4) |
P0.13 |
D5 (вывод данных 5) |
P0.14 |
D6 (контакт данных 6) |
P0.15 |
D7 (вывод данных 7) |
Узнайте больше об использовании ЖК-дисплея с ARM 7 - LPC2148.
ВАЖНО: Здесь мы используем две микросхемы регулятора напряжения: одна для ЖК-дисплея 5 В, а другая 3,3 В для аналогового входа, который можно изменять с помощью потенциометра.
Соединения между регулятором напряжения 5 В с ЖК-дисплеем и ручкой ARM7
ИС регулятора напряжения 5В |
Функция булавки |
ЖК-дисплей и ARM-7 LPC2148 |
1. левый штифт |
+ Ve от батареи Вход 9В |
NC |
2. центральный штифт |
- Ve от аккумулятора |
VSS, R / W, K ЖК-дисплея GND ARM7 |
3. правая булавка |
Регулируемый выход +5 В |
ВДД, А ЖК + 5В ARM7 |
Потенциометр с ЖК-дисплеем
Потенциометр используется для изменения контрастности ЖК-дисплея. Поток имеет три контакта: левый контакт (1) подключен к + 5V, а центральный (2) - к VEE или V0 ЖК-модуля, а правый контакт (3) подключен к GND. Мы можем настроить контраст, повернув ручку.
Соединение между LPC2148 и потенциометром с регулятором напряжения 3,3 В
ИС регулятора напряжения 3.3V |
Функция булавки |
АРМ-7 LPC2148 |
1. левый штифт |
- Ve от аккумулятора |
Контакт GND |
2. центральный штифт |
Регулируемый выход + 3,3 В |
К входу потенциометра и выходу потенциометра на P0.28 |
3. правая булавка |
+ Ve от батареи Вход 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 (регистр управления АЦП).
AD0CR = 0x00200402; // Устанавливает операцию АЦП как 10 бит / 11 CLK для преобразования (000)
3. Запустите преобразование, записав значение в биты START в ADxCR.
Здесь я записал в 24- й бит регистра AD0CR.
AD0CR = AD0CR - (1 << 24);
4. Теперь, чтобы проверить Бит (31th) соответствующих ADxDRy (данные АЦП регистр), поскольку она изменяется от 0 до 1. Таким образом, мы используем в то время как цикл постоянно проверять, если преобразование выполняется на 31 - й бит регистра данных.
пока (! (AD0DR1 & 0x80000000));
5. После того, как бит выполнения установлен в 1, преобразование выполнено успешно, затем мы считываем результат из того же регистра данных АЦП AD0DR1 и сохраняем значение в переменной.
adcvalue = AD0DR1;
Затем мы используем формулу для преобразования цифрового значения в напряжение и сохраняем его в переменной с именем Voltage .
напряжение = ((adcvalue / 1023.0) * 3.3);
5. Следующие строки используются для отображения цифровых значений (от 0 до 1023) после аналого-цифрового преобразования.
adc = adcvalue; sprintf (displayadc, "adcvalue =% f", adc); LCD_DISPLAY (дисплей ADC); // Отображаем значение АЦП (от 0 до 1023)
6. Следующие строки используются для отображения входного аналогового напряжения (от 0 до 3,3 В) после аналого-цифрового преобразования и после шага 5.
LCD_SEND (0xC0); sprintf (значение напряжения, «Напряжение =%. 2f В», напряжение); LCD_DISPLAY (значение напряжения); // Дисплей (входное аналоговое напряжение)
7. Теперь нам нужно отобразить входное напряжение и цифровые значения на ЖК-дисплее. Перед этим мы должны инициализировать ЖК-дисплей и использовать соответствующие команды для отправки сообщения на дисплей.
Код ниже используется для инициализации ЖК-дисплея.
void LCD_INITILIZE (void) // Функция для подготовки ЖК-дисплея { IO0DIR = 0x0000FFF0; // Устанавливает вывод P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 как OUTPUT delay_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
Полный код с демонстрационным видео приведен ниже.