- Що таке ШІМ (імпульс з модуляцією)?
- ШІМ у STM32
- Потрібні компоненти
- Деталі контактів STM32
- Схема та з'єднання
- Програмування STM32
У попередній статті ми бачили про перетворення АЦП за допомогою STM32. У цьому підручнику ми дізнаємося про ШІМ (модуляція ширини імпульсу) в STM32 та про те, як ми можемо контролювати яскравість світлодіода або швидкість вентилятора постійного струму за допомогою техніки ШІМ.
Ми знаємо, що існує два типи сигналу: аналоговий та цифровий. Аналогові сигнали мають напруги (3 В, 1 В… тощо), а цифрові сигнали мають (1 'і 0). Виходи датчиків мають аналогові сигнали, і ці аналогові сигнали перетворюються в цифрові за допомогою АЦП, оскільки мікроконтролери розуміють лише цифрові. Після обробки цих значень АЦП вихід знову потрібно перетворити в аналогову форму для керування аналоговими пристроями. Для цього ми використовуємо певні методи, такі як ШІМ, цифрово-аналогові (ЦАП) перетворювачі тощо.
Що таке ШІМ (імпульс з модуляцією)?
ШІМ - це спосіб управління аналоговими пристроями за допомогою цифрових значень, таких як регулювання швидкості двигуна, яскравості світлодіода тощо. Ми знаємо, що двигун та світлодіод працюють на аналоговому сигналі. Але ШІМ не забезпечує чистого аналогового виходу, ШІМ виглядає як аналоговий сигнал, що подається короткими імпульсами, що забезпечується робочим циклом.
Робочий цикл ШІМ
Відсоток часу, протягом якого сигнал ШІМ залишається ВИСОКИМ (у часі), називається робочим циклом. Якщо сигнал завжди ввімкнений, він знаходиться у 100% робочому циклі, а якщо він завжди вимкнений, це 0% робочого циклу.
Цикл роботи = час включення / (час включення + час вимкнення)
ШІМ у STM32
STM32F103C8 має 15 штифтів ШІМ та 10 штифтів АЦП. Є 7 таймерів, і кожен вихід ШІМ забезпечується каналом, підключеним до 4 таймерів. Він має 16-бітову роздільну здатність ШІМ (2 16), тобто лічильники та змінні можуть бути до 65535. При тактовій частоті 72 МГц вихід ШІМ може мати максимальний період приблизно в одну мілісекунду.
- Отже, значення 65535 надає ПОВНУ ЯРКІСТЬ СВІТЛОДІОДУ І ПОВНУ ШВИДКІСТЬ вентилятора постійного струму (100% робочого циклу)
- Аналогічним чином значення 32767 надає ПОЛОВИНУ ЯРКОСТІ СВІТЛОДІАЛОНУ І ПОЛОВИНУ СКОРОСТІ вентилятора постійного струму (50% робочого циклу)
- А значення 13107 дає (20%) ЯРКІСТЬ І (20%) ШВИДКІСТЬ (20% робочого циклу)
У цьому посібнику ми використовуємо потенціометр та STM32, щоб змінювати яскравість світлодіода та швидкість вентилятора постійного струму методом ШІМ. РК-дисплей 16x2 використовується для відображення значення АЦП (0-4095) та модифікованої змінної (значення ШІМ), яка виводиться (0-65535).
Ось кілька прикладів ШІМ з іншими мікроконтролерами:
- Генерування ШІМ за допомогою мікроконтролера PIC з MPLAB та XC8
- Серводвигун з Raspberry Pi
- Світлодіодний диммер на основі Arduino з використанням ШІМ
- Широтно-імпульсна модуляція (ШІМ) за допомогою MSP430G2
Перевірте всі проекти, пов’язані з ШІМ, тут.
Потрібні компоненти
- STM32F103C8
- Вентилятор постійного струму
- Схема драйвера двигуна ULN2003
- Світлодіод (червоний)
- РК-дисплей (16x2)
- Потенціометр
- Макет
- Акумулятор 9В
- Провід перемички
Вентилятор постійного струму: Вентилятор постійного струму, який використовується тут, - це вентилятор BLDC від старого ПК. Він вимагає зовнішнього живлення, тому ми використовуємо акумулятор постійного струму 9 В
Схема драйвера двигуна ULN2003: використовується для приводу двигуна в одному напрямку, оскільки двигун односпрямований, а також для вентилятора потрібне зовнішнє живлення. Дізнайтеся більше про схему двигуна на основі ULN2003 тут. Нижче наведена піктограма ULN2003:
Висновки (IN1 - IN7) - це вхідні виводи, а (OUT 1 - OUT 7) - відповідні вихідні висновки. COM отримує позитивну напругу джерела, необхідну для вихідних пристроїв.
Світлодіод: використовується червоний кольоровий світлодіод, який випромінює ЧЕРВОНЕ світло. Можна використовувати будь-які кольори.
Потенціометри: використовуються два потенціометри, один призначений для дільника напруги для аналогового входу в АЦП, а інший - для управління яскравістю світлодіода.
Деталі контактів STM32
Як ми бачимо, ШІМ-штирі вказані у форматі хвилі (~), таких штифтів 15, штифти АЦП представлені зеленим кольором, є 10 штифтів АЦП, які використовуються для аналогових входів.
Схема та з'єднання
Поєднання STM32 з різними компонентами пояснюється нижче:
STM32 з аналоговим входом (АЦП)
Потенціометр, присутній на лівій стороні ланцюга, використовується як регулятор напруги, який регулює напругу з виводу 3,3 В. Вихід потенціометра, тобто центральний штифт потенціометра, підключений до штифта АЦП (PA4) STM32.
STM32 зі світлодіодом
Вихідний штир STM32 ШІМ (PA9) підключений до позитивного виводу світлодіода через послідовний резистор і конденсатор.
Світлодіод з резистором і конденсатором
Послідовно резистор і паралельно конденсатор з'єднані зі світлодіодом для генерації правильної аналогової хвилі з ШІМ-виходу, оскільки аналоговий вихід не є чистим, коли генерується безпосередньо з ШІМ-контакту.
STM32 з ULN2003 та ULN2003 з вентилятором
Вихідний штир ШИМ STM32 (PA8) підключений до вхідного штифта (IN1) мікросхеми ULN2003, а відповідний вихідний штифт (OUT1) ULN2003 підключений до негативного проводу вентилятора постійного струму.
Позитивний вивід вентилятора постійного струму підключений до виводу COM мікросхеми ULN2003, а зовнішній акумулятор (9 В постійного струму) також підключений до того самого виводу COM мікросхеми ULN2003. Контакт GND ULN2003 підключений до контакту GND STM32, а мінус акумулятора - той же контакт GND.
STM32 з РК-дисплеєм (16x2)
ЖК-номер |
Назва PIN-коду РК-дисплея |
Ім'я контакту STM32 |
1 |
Земля (Gnd) |
Земля (G) |
2 |
VCC |
5 В |
3 |
VEE |
Пін з центру потенціометра |
4 |
Вибір реєстру (RS) |
PB11 |
5 |
Читання / запис (RW) |
Земля (G) |
6 |
Увімкнути (EN) |
PB10 |
7 |
Біт даних 0 (DB0) |
Відсутнє підключення (NC) |
8 |
Біт даних 1 (DB1) |
Відсутнє підключення (NC) |
9 |
Біт даних 2 (DB2) |
Відсутнє підключення (NC) |
10 |
Біт даних 3 (DB3) |
Відсутнє підключення (NC) |
11 |
Біт даних 4 (DB4) |
PB0 |
12 |
Біт даних 5 (DB5) |
PB1 |
13 |
Біт даних 6 (DB6) |
ПК13 |
14 |
Біт даних 7 (DB7) |
ПК14 |
15 |
Позитивний світлодіод |
5 В |
16 |
Світлодіод негативний |
Земля (G) |
Потенціометр з правого боку використовується для контролю контрастності РК-дисплея. У наведеній вище таблиці показано зв’язок між РК-дисплеєм та STM32.
Програмування STM32
Як і в попередньому навчальному посібнику, ми запрограмували STM32F103C8 за допомогою Arduino IDE через порт USB без використання програміста FTDI. Щоб дізнатися про програмування STM32 за допомогою Arduino IDE, перейдіть за посиланням. Ми можемо продовжувати програмування, як у Arduino. Повний код наведено в кінці.
У цьому кодуванні ми збираємося взяти вхідне аналогове значення з ADC штифта (PA4), який підключений до центрального штифта лівого потенціометра, а потім перетворити аналогове значення (0-3,3 В) в цифровий або цілий формат (0-4095). Це цифрове значення надається як вихід ШІМ для управління яскравістю світлодіодів та швидкістю вентилятора постійного струму. РК-дисплей 16x2 використовується для відображення АЦП та відображеного значення (вихідне значення ШІМ).
Спочатку нам потрібно включити файл заголовка РК-дисплея, оголосити штифти РК-дисплея та ініціалізувати їх, використовуючи код нижче. Дізнайтеся більше про взаємодію РК із STM32 тут.
#включати
Далі оголосіть і визначте імена контактів, використовуючи штифт STM32
const int analoginput = PA4; // Вхід від потенціометра const int led = PA9; // Світлодіодний вихід const int fan = PA8; // вихід вентилятора
Тепер всередині установки () нам потрібно показати кілька повідомлень і очистити їх через кілька секунд і вказати штифт INPUT та вихідні штифти ШІМ
lcd.begin (16,2); // Підготовка РК-дисплея lcd.clear (); // Очищає LCD lcd.setCursor (0,0); // Встановлює курсор у рядку0 та стовпці0 lcd.print ("CIRCUIT DIGEST"); // Відображає Circuit Digest lcd.setCursor (0,1); // Встановлює курсор у стовпці0 та рядку1 lcd.print ("ШІМ із використанням STM32"); // Відображає ШІМ із затримкою STM32 (2000); // Час затримки lcd.clear (); // Очищає РК- режим (аналоговий вхід, ВХІД); // встановлення аналогового режиму виводу як INPUT pinMode (світлодіодний, ШІМ); // встановити режим виводу, який ведеться як вихідний ШІМ pinMode (вентилятор, ШІМ); // встановити штифтовий вентилятор як вихід ШІМ
Штифт аналогового входу (PA4) встановлюється як INPUT за допомогою pinMode ( аналоговий вхід , INPUT), світлодіодний штифт встановлюється як ШІМ-вихід за допомогою pinMode (світлодіод, ШІМ), а штифт вентилятора встановлюється як ШІМ-вихід за допомогою pinMode (вентилятор, ШІМ) . Тут вихідні штифти ШІМ підключені до світлодіодів (PA9) та вентилятора (PA8).
Далі у функції void loop () ми зчитуємо аналоговий сигнал з АЦП (PA4) і зберігаємо його у цілочисельній змінній, яка перетворює аналогову напругу в цифрові цілі значення (0-4095), використовуючи нижче код int valueadc = analogRead (analoginput);
Важливо зазначити, що тут є ШІМ-шпильки, тобто канали STM32 мають 16-бітову роздільну здатність (0-65535), тому нам потрібно зіставити це з аналоговими значеннями за допомогою функції map, як показано нижче
int result = map (valueadc, 0, 4095, 0, 65535).
Якщо картографування не використовується, ми не отримаємо повну швидкість вентилятора або повну яскравість світлодіода, змінюючи потенціометр.
Потім ми записуємо вихід ШІМ на світлодіод за допомогою pwmWrite (світлодіод, результат) і ШІМ-вихід для вентилятора за допомогою функцій pwmWrite (вентилятор, результат ).
Нарешті, ми відображаємо значення аналогового входу (значення АЦП) та вихідні значення (значення ШІМ) на РК-дисплеї, використовуючи наступні команди
lcd.setCursor (0,0); // Встановлює курсор у рядку0 та стовпці0 lcd.print ("Значення ADC ="); // друкує слова “” lcd.print (valueadc); // відображає valueadc lcd.setCursor (0,1); // Встановлює курсор у стовпці0 та рядку1 lcd.print ("Output ="); // друкує слова у "" lcd.print (результат); // відображає результат значення
Повний код із демонстраційним відео наведено нижче.