На ринку існують двоколірні світлодіоди. Влаштовані вони так: усередині корпусу встановлені два світлодіоди різного кольору, з'єднаних паралельно але в різній полярності. Таким чином, якщо прикласти напругу однієї полярності - світиться один кристал і світлодіод випромінює, наприклад, червоне світло. Якщо змінити полярність - загориться інший кристал, і стане горіти зелений колір. Зрозуміло, що протилежний світлодіод не пропускає струм не своюполярності, і не горить.
Це дозволяє одним світлодіодом відображати, наприклад, два стану якоїсь системи: зелений для нормальної роботи і червоний для індикації помилки. Досить часто такі світлодіоди ставляться всередину кнопки, і натискання кнопки дублюється переморгуванням світлодіода, або перемиканням його в інший колір (звичайно, це робиться зовнішнім МК).
Але не всі знають, що таким світлодіодом можна показувати ще і третій колір! Ніякої rocket science, потрібно просто швидко перемикати світлодіод з одного кольору в інший. Я покажу, як це зробити на STM32 - спочатку неправильно, а потім правильно.
Адже нам важлива тільки різниця потенціалів на висновках світлодіода? Тому найзручніше вчинити так: підключимо світлодіод до двох ногах введення-виведення, для включення одного кольору подамо «1» на першу ногу і «0» на другу. На светодиоде, таким чином, буде напруга +3,3, і світиться зелений колір. Якщо ж поміняти полярність, подати «0» на першу ногу і «1» на другу - на світлодіоді вийде напруга -3,3В, і загориться червоний колір. Звичайно, не можна забувати про струмообмежувальні резистори, який не дасть струму піднятися вище 10-20мА.
Неправильний, але простий метод
Все дуже просто: підключаємо світлодіод через 330Ом резистор до яких-небудь ніжок введення-виведення, і в циклі їх включаємо і вимикаємо. Я використовую PB0 і PB2 на платі STM32VLDiscovery.
Код буде дуже простим:
Більш складний, але правильний метод
Скористаємося таймерами в кристалі STM32! Вони можуть взяти на себе реалізацію всіх цих затримок і циклів, розвантаживши від них ядро. Достатньо всього один раз налаштувати таймер, включити його - і можна займатися своїми справами, зрідка відволікаючись на переривання.
Регулювання яскравості двоколірного світлодіода
З двоколірними світлодіодами завжди виникає проблема - яскравість кристалів різна, і якщо включати їх з однаковою скважностью (наприклад, 50% часу червоний, 50% часу зелений) - кольори змішуються неточно, і виходить не те що ми хотіли. Червоні світлодіоди завжди виглядають яскравіше, ніж зелені - і виходить не жовтий і навіть не помаранчевий колір, а практично повністю червоний.
Очевидний програмний спосіб регулювання яскравості - поставити різні тривалості затримок: в першому прикладі для цього достатньо змінити дефайни del1 і del2, у другому прикладі потрібно завантажувати в регістр ARR різні значення на різних етапах. Але це все зрозуміло і питань не виникає.
Апаратний спосіб регулювання для кого-то може бути не настільки очевидним. Зрозуміло що можна змінити опір струмообмежувальні резистора, але так зміниться яскравість обох кристалів. Тому зробимо трохи хитріше - пустимо струм в одному напрямку по одному резистору, а в іншому напрямку - по іншому. Це, звичайно, дуже легко зробити двома діодами.