- ШИМ (широтно-импульсная модуляция)
- Контакты PWM в ARM7-LPC2148
- Регистры ШИМ в ARM7-LPC2148
- Необходимые компоненты
- Принципиальная схема и подключения
- Программирование ARM7-LPC2148 для ШИМ
- Шаги, связанные с программированием LPC2148 для ШИМ и АЦП
Как мы знаем, микроконтроллеры принимают аналоговый ввод от аналоговых датчиков и используют АЦП (аналого-цифровой преобразователь) для обработки этих сигналов. Но что, если микроконтроллер хочет создавать аналоговый сигнал для управления устройствами с аналоговым управлением, такими как серводвигатель, двигатель постоянного тока и т. Д.? Микроконтроллеры не производят выходное напряжение, такое как 1 В, 5 В, вместо этого они используют метод, называемый ШИМ, для управления аналоговыми устройствами. Примером ШИМ является охлаждающий вентилятор нашего ноутбука (двигатель постоянного тока), скорость которого необходимо регулировать в соответствии с температурой, и то же самое реализовано с помощью метода широтно-импульсной модуляции (ШИМ) на материнских платах.
В этом уроке мы будем управлять яркостью светодиода с помощью ШИМ микроконтроллера ARM7-LPC2148.
ШИМ (широтно-импульсная модуляция)
ШИМ - это хороший способ управления аналоговыми устройствами с использованием цифровых значений, таких как управление скоростью двигателя, яркостью светодиода и т. Д. Хотя ШИМ не обеспечивает чисто аналоговый выход, но он генерирует приличные аналоговые импульсы для управления аналоговыми устройствами. ШИМ фактически модулирует ширину прямоугольной пульсовой волны, чтобы получить изменение среднего значения результирующей волны.
Рабочий цикл ШИМ
Процент времени, в течение которого сигнал ШИМ остается ВЫСОКИМ (по времени), называется рабочим циклом. Если сигнал всегда включен, это 100% рабочий цикл, а если он всегда выключен, это 0% рабочего цикла.
Рабочий цикл = время включения / (время включения + время выключения)
Контакты PWM в ARM7-LPC2148
На изображении ниже показаны выходные контакты PWM ARM7-LPC2148. Всего шесть контактов для PWM.
ШИМ канал |
Контакты порта LPC2148 |
PWM1 |
P0.0 |
ШИМ2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
Регистры ШИМ в ARM7-LPC2148
Перед тем, как приступить к нашему проекту, нам нужно узнать о регистрах PWM в LPC2148.
Вот список регистров, используемых в LPC2148 для ШИМ
1. PWMPR: регистр предварительного масштабирования PWM
Использование: Это 32-битный регистр. Он содержит количество раз (минус 1), которое PCLK должен выполнить, прежде чем увеличивать счетчик таймера ШИМ (фактически он содержит максимальное значение счетчика предварительного масштабирования).
2. PWMPC: счетчик предделителя PWM
Использование: Это 32-битный регистр . Он содержит увеличивающееся значение счетчика. Когда это значение равно значению PR плюс 1, счетчик таймера ШИМ (TC) увеличивается.
3. PWMTCR: Регистр управления таймером ШИМ.
Использование: он содержит управляющие биты включения счетчика, сброса счетчика и разрешения ШИМ. Это 8-битный регистр.
7: 4 |
3 |
2 |
1 |
0 |
ЗАРЕЗЕРВИРОВАННЫЙ |
ШИМ ВКЛЮЧИТЬ |
ЗАРЕЗЕРВИРОВАННЫЙ |
СБРОС СЧЕТЧИКА |
СЧЕТЧИК ВКЛЮЧИТЬ |
- Включение ШИМ: (Бит-3)
0 - ШИМ отключен
1 - ШИМ включен
- Включение счетчика: (Бит-0)
0 - отключить счетчики
1 - включить счетчик
- Сброс счетчика: (Бит-1)
0 - Ничего не делать.
1- Сбрасывает PWMTC и PWMPC по положительному фронту PCLK.
4. PWMTC: счетчик таймера PWM
Использование: Это 32-битный регистр. Он содержит текущее значение увеличивающегося таймера ШИМ. Когда счетчик предварительного делителя (ПК) достигает значения регистра предварительного делителя (PR) плюс 1, этот счетчик увеличивается.
5. PWMIR: регистр прерывания PWM
Использование: это 16-битный регистр. Он содержит флаги прерывания для каналов согласования ШИМ 0-6. Флаг прерывания устанавливается, когда для этого канала возникает прерывание (прерывание MRx), где X - номер канала (от 0 до 6).
6. PWMMR0-PWMMR6: Регистр совпадения ШИМ
Использование: Это 32-битный регистр . Фактически группа Match Channel позволяет установить 6 выходов PWM с односторонним управлением или 3 выхода с двухфазным управлением. Вы можете изменить семь каналов соответствия, чтобы настроить эти выходы ШИМ в соответствии с вашими требованиями в ШИМПКР.
7. PWMMCR: Регистр управления согласованием PWM.
Использование: Это 32-битный регистр. Он содержит биты прерывания, сброса и остановки, которые управляют выбранным каналом согласования. Между регистрами совпадения ШИМ и счетчиками таймера ШИМ происходит совпадение.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
ЗАРЕЗЕРВИРОВАННЫЙ |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
Здесь x от 0 до 6
- PWMMRxI (бит-0)
РАЗРЕШЕНИЕ ИЛИ ОТКЛЮЧЕНИЕ прерываний ШИМ
0- Отключить прерывания PWM Match.
1- Включить прерывание PWM Match.
- PWMMRxR: (Бит-1)
RESET PWMTC - значение счетчика таймера всякий раз, когда оно соответствует PWMRx
0- Ничего не делать.
1- Сбрасывает PWMTC.
- PWMMRxS: (бит 2)
ОСТАНОВИТЬ PWMTC и PWMPC, когда PWMTC достигает значения регистра соответствия
0- Отключить функцию остановки PWM.
1- Включите функцию остановки PWM.
8. PWMPCR: Регистр управления ШИМ
Использование: Это 16-битный регистр. Он содержит биты, которые разрешают выходы PWM 0-6 и выбирают одно- или двухфазное управление для каждого выхода.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
НЕ ИСПОЛЬЗУЕТСЯ |
PWMENA6-PWMENA1 |
НЕ ИСПОЛЬЗУЕТСЯ |
PWMSEL6-PWMSEL2 |
НЕ ИСПОЛЬЗУЕТСЯ |
- PWMSELx (x: от 2 до 6)
- Односторонний режим для PWMx
- 1- Режим двойного фронта для PWMx.
- PWMENAx (x: от 1 до 6)
- PWMx Disable.
- 1- PWMx включен.
9. PWMLER: регистр включения защелки PWM.
Использование: это 8-битный регистр. Он содержит биты Match x Latch для каждого Match Channel.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
НЕ ИСПОЛЬЗУЕТСЯ |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: от 0 до 6):
0 - Отключить загрузку новых значений Match
1 - Загрузить новые значения Match из (PWMMRx) PWMMatch Register при сбросе таймера.
Теперь давайте приступим к построению аппаратной части, чтобы продемонстрировать широтно-импульсную модуляцию в микроконтроллере ARM.
Необходимые компоненты
Оборудование
- ARM7-LPC2148 Микроконтроллер
- ИС регулятора напряжения 3.3V
- Потенциометр 10k
- LED (любой цвет)
- ЖК-дисплей (16x2) Дисплейный модуль
- Макетная плата
- Подключение проводов
Программного обеспечения
- Keil uVision5
- Инструмент Flash Magic
Принципиальная схема и подключения
Соединения между ЖК-дисплеем и 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) |
GND |
VSS, R / W, K |
+ 5В |
ВДД, А |
Соединение между светодиодом и ARM7-LPC2148
Светодиод ANODE подключен к выходу PWM (P0.0) LPC2148, а контакт CATHODE светодиода подключен к контакту GND LPC2148.
Соединение ARM7-LPC2148 с потенциометром с регулятором напряжения 3,3 В
ИС регулятора напряжения 3.3V |
Функция булавки |
ARM-7 LPC2148 контакт |
1. левый штифт |
- Ve от GND |
Контакт GND |
2. центральный штифт |
Регулируемый выход + 3,3 В |
К входу потенциометра и выходу потенциометра на P0.28 LPC2148 |
3. правая булавка |
+ Ve от 5В ВВОД |
+ 5В |
Следует отметить
1. Стабилизатор напряжения 3,3 В здесь используется для подачи аналогового входного значения на вывод АЦП (P0.28) LPC2148, и поскольку мы используем мощность 5 В, нам необходимо регулировать напряжение с помощью регулятора напряжения 3,3 В.
2. Потенциометр используется для изменения напряжения в диапазоне (от 0 В до 3,3 В) для обеспечения аналогового входа (АЦП) на вывод P0.28 LPC2148.
Программирование 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».
В этом уроке мы будем использовать технику АЦП и ШИМ для управления яркостью светодиода. Здесь LPC2148 получает аналоговый вход (от 0 до 3,3 В) через входной контакт АЦП P0.28, затем этот аналоговый вход преобразуется в цифровое значение (от 0 до 1023). Затем это значение снова преобразуется в цифровое значение (0 - 255), так как выход ШИМ LPC2148 имеет только 8-битное разрешение (2 8). Светодиод подключается к выводу P0.0 PWM, а яркость светодиода можно регулировать с помощью потенциометра. Чтобы узнать больше об АЦП в ARM7-LPC2148, перейдите по ссылке.
Шаги, связанные с программированием LPC2148 для ШИМ и АЦП
Шаг 1: - Самое первое, что нужно сделать, это настроить ФАПЧ для генерации тактовых импульсов, так как она устанавливает системные и периферийные часы LPC2148 в соответствии с потребностями программистов. Максимальная тактовая частота для LPC2148 составляет 60 МГц. Следующие строки используются для настройки генерации тактовой частоты ФАПЧ.
void initilizePLL (void) // Функция для использования PLL для генерации часов { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; пока (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
Шаг 2: - Следующее, что нужно сделать, это выбрать контакты PWM и функцию PWM LPC2148 с помощью регистра PINSEL. Мы используем PINSEL0, поскольку мы используем P0.0 для вывода PWM LPC2148.
PINSEL0 = 0x00000002; // Установка вывода P0.0 для вывода ШИМ
Шаг 3: - Затем нам нужно СБРОСИТЬ таймеры с помощью PWMTCR (Регистр управления таймером).
PWMTCR = (1 << 1); // Установка регистра управления таймером ШИМ как сброс счетчика
Затем установите значение предварительного масштабирования, которое определяет разрешение ШИМ. Я ставлю на ноль
PWMPR = 0X00; // Установка значения предварительного масштабирования ШИМ
Шаг 4: - Затем нам нужно установить PWMMCR (регистр управления согласованием PWM), поскольку он устанавливает такие операции, как сброс, прерывания для PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // Установка регистра управления согласованием ШИМ
Шаг 5: - Максимальный период канала ШИМ устанавливается с помощью ШИММР.
PWMMR0 = значение PWM; // Выдача значения ШИМ Максимальное значение
В нашем случае максимальное значение 255 (для максимальной яркости)
Шаг 6: - Затем нам нужно установить Latch Enable для соответствующих регистров совпадения с помощью PWMLER
PWMLER = (1 << 0); // Защелка Enalbe PWM
(Мы используем PWMMR0) Итак, активируйте соответствующий бит, установив 1 в PWMLER.
Шаг 7: - Чтобы включить вывод ШИМ на вывод, нам нужно использовать PWMTCR для включения счетчиков таймера ШИМ и режимов ШИМ.
PWMTCR = (1 << 0) - (1 << 3); // Включение счетчика ШИМ и ШИМ
Шаг 8: - Теперь нам нужно получить значения потенциометра для установки рабочего цикла ШИМ с вывода P0.28 АЦП. Поэтому мы используем модуль АЦП в LPC2148 для преобразования аналогового входа потенциометров (от 0 до 3,3 В) в значения АЦП (от 0 до 1023).
Здесь мы преобразуем значения от 0-1023 до 0-255, разделив их на 4, поскольку ШИМ LPC2148 имеет 8-битное разрешение (2 8).
Шаг 9: - Для выбора вывода P0.28 АЦП в LPC2148 мы используем
PINSEL1 = 0x01000000; // Установка P0.28 как ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // Установка часов и PDN для аналого-цифрового преобразования
Следующие строки фиксируют аналоговый вход (от 0 до 3,3 В) и преобразуют его в цифровое значение (от 0 до 1023). Затем эти цифровые значения делятся на 4, чтобы преобразовать их в (от 0 до 255), и, наконец, подаются как выход ШИМ на вывод P0.0 LPC2148, к которому подключен светодиод.
AD0CR - = (1 << 1); // Выбираем канал AD0.1 в регистре АЦП delaytime (10); AD0CR - = (1 << 24); // Запускаем аналого- цифровое преобразование while ((AD0DR1 & (1 << 31)) == 0); // Проверяем бит DONE в регистре данных АЦП adcvalue = (AD0DR1 >> 6) & 0x3ff; // Получаем РЕЗУЛЬТАТ из регистра данных АЦП dutycycle = adcvalue / 4; // формула для получения значений рабочего цикла от (0 до 255) PWMMR1 = dutycycle; // устанавливаем значение рабочего цикла в регистр совпадения ШИМ PWMLER - = (1 << 1); // Включение вывода ШИМ со значением рабочего цикла
Шаг 10: - Затем мы отображаем эти значения на ЖК-дисплее (16X2). Итак, мы добавляем следующие строки для инициализации модуля ЖК-дисплея
Void LCD_INITILIZE (void) // Функция для подготовки ЖК-дисплея { IO0DIR = 0x0000FFF0; // Устанавливает вывод P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 как время задержки ВЫХОДА (20); LCD_SEND (0x02); // Инициализируем ЖК- дисплей в 4-битном режиме работы LCD_SEND (0x28); // 2 строки (16X2) LCD_SEND (0x0C); // Отображение выключенного курсора LCD_SEND (0x06); // Курсор автоматического увеличения LCD_SEND (0x01); // Очистить дисплей LCD_SEND (0x80); // Первая строка первая позиция }
Поскольку мы подключили ЖК-дисплей в 4-битном режиме к LPC2148, нам нужно отправить значения, которые будут отображаться как полубайт за полубайтом (верхний полубайт и нижний полубайт). Итак, используются следующие строки.
void LCD_DISPLAY (char * msg) // Функция для печати символов, отправленных один за другим { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Отправляет верхний полубайт IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH для печати данных IO0CLR = 0x00000020; // RW LOW Режим записи delaytime (2); IO0CLR = 0x00000040; // EN = 0, RS и RW без изменений (т.е. RS = 1, RW = 0) delaytime (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Отправляет младший полубайт IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; задержка (2); IO0CLR = 0x00000040; задержка (5); i ++; } }
Чтобы отобразить эти значения АЦП и ШИМ, мы используем следующие строки в функции int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", adcvalue); LCD_DISPLAY (дисплей ADC); // Отображение значения АЦП (от 0 до 1023) LCD_SEND (0xC0); sprintf (ledoutput, «PWM OP =%. 2f», яркость); LCD_DISPLAY (ledoutput); // Отображение значений рабочего цикла от (0 до 255)
Полный код и видео-описание учебника приведены ниже.