В этой статье мы рассмотрим подключение оптопары к микроконтроллеру ATmega8 (семейство AVR). Оптопары представляют собой устройства, предназначенные для изоляции электронных и электрических схем. Это простое устройство может изолировать чувствительную электронику от "грубой" электроники такой, к примеру, как электродвигатели, при этом сохраняя контроль над источником.
В данном примере мы будем управлять скоростью вращения электродвигателя переменного тока (конкретно вентилятора) с помощью логического управления от микроконтроллера. Мы могли бы это сделать и с помощью простого соединения (без использования оптопары), но тогда бы нам пришлось столкнуться с появлением шумов в схеме управления скоростью вращения электродвигателем. Поскольку это двигатель переменного тока нам бы пришлось использовать сложные фильтрующие схемы чтобы избавиться от этого шума. Но с помощью оптопары мы можем избежать прямого контакта микроконтроллера с электродвигателем и при этом сохранить полный контроль над системой.
Оптоэлектронные устройства, как следует из их названия, имеют в своем составе триггерную систему, управляемую с помощью света. Мы передаем сигнал на светоизлучающее устройство на источнике, а на приемном конце мы имеем триггерный переключатель, работающий от света. В данном проекте мы будем подключать оптопару 4N25 к микроконтроллеру ATmega8. Когда выключатель на стороне контроллера будет нажат, светодиод оптопары будет зажигаться.
Необходимые компоненты
Аппаратное обеспечение
- Микроконтроллер ATmega8 (купить на AliExpress).
- Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
- Оптопара 4N25.
- Светодиод (купить на AliExpress).
- Резистор 1 кОм (3 шт.) (купить на AliExpress).
- Источник питания с напряжением 5 Вольт.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Программное обеспечение
- Atmel Studio версии 6.1 (или выше).
- Progisp или flash magic (необязательно).
Работа схемы
Схема устройства приведена на следующем рисунке.
Прежде чем двигаться дальше, рассмотрим принципы работы оптопары. Внутренняя схема оптопары приведена на следующем рисунке.
Контакты PINA и PINC подсоединяются к источнику. Контакты PINB, PINC, PINE подсоединяются к нагрузке.
Из представленного рисунка видно, что оптопара состоит из светодиода на стороне источника и фототранзистора на стороне нагрузки. Система заключена в замкнутый корпус, что увеличивает эффективность работы фототранзистора.
Когда от источника поступает сигнал на светодиод оптопары он испускает свет и фототранзистор, расположенный рядом со светодиодом, срабатывает и приводит в исполнение подсоединенную к его выходам цепь. Таким образом, управляющий сигнал от микроконтроллера преобразуется в свет, который заставляет сработать фототранзистор и тем самым подать необходимый сигнал в управляемую нагрузку (в представленной схеме нагрузкой является светодиод, но в общем случае подобным образом можно управлять и электродвигателем).
Эквивалентную электрическую схему оптопары можно изобразить следующим образом.
При нажатии кнопки, подсоединенной к микроконтроллеру, он подает управляющий импульс на светодиод оптопары (в эквивалентной схеме замещенный диодом), что заставляет сработать транзистор и зажечь подсоединенный к нему светодиод (в денном случае светодиод является нагрузкой оптопары). Более детально принцип работы данной схемы рассмотрен в комментариях к представленной программе.
Исходный код программы на языке С (Си) с пояснениями
Программа для рассматриваемой схемы подключения оптопары к микроконтроллеру AVR ATmega8 представлена следующим фрагментом кода на языке С (Си). Комментарии к коду программу поясняют принцип работы отдельных команд.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <avr/io.h> // заголовок чтобы задействовать контроль данных на контактах #define F_CPU 1000000UL // задание тактовой частоты микроконтроллера #include <util/delay.h> // заголовок чтобы задействовать функции задержки в программе int main(void) { DDRD = 0x00; // установка portd на ввод данных DDRB = 0xFF; // установка PORTB на вывод данных while(1) { if (bit_is_set(PIND,0)) // если кнопка нажата { PORTB^=1<<0; // переключаем логический уровень на контакте pin0 PORTB _delay_ms(200); // задержка 200ms _delay_ms(200); } } } |