В данной статье мы рассмотрим подключение реле к микроконтроллеру PIC16F877A. Реле представляет собой механическое устройство, предназначенное для управления мощными электрическими цепями с помощью маломощных. Реле обеспечивает физическую изоляцию между управляющими и управляемыми электрическими цепями и в большинстве случаев используется для управления потребителями переменного тока. Существуют различные виды реле, начиная от механических и заканчивая жидкими. В данном проекте мы будем использовать простое механическое реле и будем выполнять следующие операции:
- Для удобства пользователя мы поставим в схему переключатель.
- Будем управлять электрической лампой переменного тока 220V с помощью реле на 5V.
- Для управления реле с помощью микроконтроллера PIC16F877A мы будем использовать NPN транзистор BC547.
- Светодиод в схеме будет индицировать о том, включено или выключено реле.
Также на нашем сайте мы рассматривали подключение реле к другим микроконтроллерам (платам):
Необходимые компоненты
- Микроконтроллер PIC16F877A (купить на AliExpress).
- Реле на 5V.
- Лампа переменного тока 220V.
- Программатор PICkit 3 (купить на AliExpress).
- Кварцевый генератор 20 МГц (купить на AliExpress).
- Конденсаторы 33 пФ (2 шт.) (купить на AliExpress).
- Резисторы 4,7 кОм (3 шт.) и 1 кОм (купить на AliExpress).
- Светодиод (купить на AliExpress).
- Транзистор BC547 (купить на AliExpress).
- Диод 1N4007 (купить на AliExpress).
- Адаптер питания 5V с поддерживаемым током не менее 200mA.
- Макетная плата и соединительные провода.
Принципы работы реле
Реле работает как обычный выключатель/переключатель. Механические реле используют магнит в виде электромагнитной катушки. Когда мы подаем на эту катушку достаточный ток она переключает рычаг, в результате этого цепь, подключенная к реле, будет замкнута или разомкнута. Входные и выходные контакты реле физически изолированы друг от друга.
Реле изготавливаются на различные входные напряжения – 5V, 6V, 12V, 18V, в нашем проекте мы будем использовать реле на 5V. Используемое нами реле на 5V способно переключать ток до 7A при выходном напряжении 240VAC или до 10A при выходном напряжении 110VAC. Но в нашем проекте мы не будем использовать такие большие токи, в качестве нагрузки у нас будет обычная лампа переменного тока на 220VAC.
Внешний вид используемого нами реле показан на следующем рисунке.
Распиновка у реле следующая.
Контакты L1 и L2 используются для подачи напряжения на электромагнитную катушку, с помощью них реле переводится в состояние ‘ON’ (включено) или ‘OFF’ (выключено). Остальными контактами реле являются POLE, NO и NC. Полюс/стержень (POLE) подключен к внутренней металлической пластине, которая переключает состояние реле. В обычных условиях (напряжение на управляющие контакты не подано) POLE подключен к контакту NC (normally connected – нормально замкнут). При подаче напряжения на управляющие контакты контакт POLE переключается на контакт NO (Normally Open – нормально разомкнут).
В нашей схеме для подключения реле мы будем использовать транзистор и диод – их вместе с реле включают в состав так называемых модулей реле (Relay Module). Если вы покупаете готовый модуль реле, то вместе с ним использовать транзистор и диод уже нет необходимости.
Ранее на нашем сайте рассматривалось применение реле во многих проектах автоматизации дома. Также вы можете посмотреть все проекты с использованием реле на нашем сайте.
Схема проекта
Схема подключение реле к микроконтроллеру PIC16F877A представлена на следующем рисунке.
В представленной схеме реле через транзистор подключено к port B микроконтроллера PIC16F877A. Выключатель подключен к контакту RBO микроконтроллера. Резистор R1 обеспечивает напряжение смещения для базы транзистора. R2 является подтягивающим резистором для выключателя – он обеспечивает логический 0 кода выключатель не включен. 1N4007 является ограничительным диодом для реле – он подавляет (замыкает на себя) возможные электромагнитные помехи.
Транзистор используется для управления реле – его входные контакты требуют ток не менее 50mA, контакты микроконтроллера не могут обеспечить такой ток. Вместо транзистора можно также использовать модуль драйвера двигателей ULN2003 – его применение оправдано когда требуется управление 2 или 3 реле. Светодиод, подключенный к контакту RB2 микроконтроллера PIC16F877A, будет индицировать о состоянии реле (включено/выключено).
Внешний вид собранной конструкции проекта показан на следующем рисунке.
Объяснение программы для микроконтроллера PIC
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе мы настроим биты конфигурации микроконтроллера, подключим необходимые библиотеки и дадим осмысленные имена используемым контактам.
1 2 3 4 5 6 7 8 |
#include <xc.h> /* Hardware related definition */ #define _XTAL_FREQ 200000000 //Crystal Frequency, used in delay #define SW PORTBbits.RB0 #define RELAY PORTBbits.RB1 #define LED PORTBbits.RB2 |
После этого мы запрограммируем функцию system_init(), в которой мы настроим режимы работы используемых контактов и зададим их начальное состояние.
1 2 3 4 5 6 7 |
void system_init(void){ TRISBbits.TRISB0 = 1; // Setting Sw as input TRISBbits.TRISB1 = 0; // setting LED as output TRISBbits.TRISB2 = 0; // setting relay pin as output LED = 0; RELAY = 0; } |
В основной функции программы main мы будем непрерывно проверять нажат или нет выключатель. Если мы обнаружим его нажатие, то мы подождем немного времени и снова проверим нажат он или нет – это необходимо для борьбы с эффектом "дребезга контактов". Если он нажат, то мы будем переключать (инвертировать) состояние реле и светодиода.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void main(void) { system_init(); // System getting ready while(1){ if(SW == 1){ //switch is pressed __delay_ms(50); // debounce delay if (SW == 1){ // switch is still pressed LED = !LED; // inverting the pin status. RELAY = !RELAY; } } } return; } |
Исходный код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
/* * File: main.c * Author: Sourav Gupta * By:- circuitdigest.com * Created on May 30, 2018, 2:26 PM */ // PIC16F877A Configuration Bit Settings // 'C' source line config statements // CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) #include <xc.h> /* Hardware related definition */ #define _XTAL_FREQ 200000000 //Crystal Frequency, used in delay #define SW PORTBbits.RB0 #define RELAY PORTBbits.RB1 #define LED PORTBbits.RB2 /* Other Specific definition */ void system_init(void); void main(void) { system_init(); // System getting ready while(1){ if(SW == 1){ //выключатель нажат __delay_ms(50); // задержка для устранения дребезга контактов if (SW == 1){ // выключатель все еще нажат LED = !LED; // инвертируем состояние контакта RELAY = !RELAY; } } } return; } /* This Function is for system initialisations. */ void system_init(void){ TRISBbits.TRISB0 = 1; // Sw – на ввод данных TRISBbits.TRISB1 = 0; // LED – на вывод данных TRISBbits.TRISB2 = 0; // relay pin – на вывод данных LED = 0; RELAY = 0; } |