• High/Low Voltage Detection and Protection Circuit using PIC Microcontroller - Mạch bảo vệ và phát hiện điện áp cao / thấp sử dụng vi điều khiển PIC

QC

High/Low Voltage Detection and Protection Circuit using PIC Microcontroller - Mạch bảo vệ và phát hiện điện áp cao / thấp sử dụng vi điều khiển PIC

 


Chúng ta thường thấy sự dao động điện áp trong nguồn cung cấp điện tại nhà, điều này có thể gây ra sự cố cho các thiết bị điện xoay chiều gia đình của chúng ta. Hôm nay chúng tôi đang xây dựng một mạch bảo vệ điện áp cao và thấp chi phí thấp, sẽ cắt nguồn cung cấp điện cho các thiết bị trong trường hợp điện áp cao hoặc thấp. Nó cũng sẽ hiển thị thông báo cảnh báo trên màn hình LCD 16x2. Trong dự án này, chúng tôi đã sử dụng Vi điều khiển PIC để đọc và so sánh điện áp đầu vào với điện áp tham chiếu và thực hiện hành động cho phù hợp.


Chúng tôi đã tạo mạch này trên PCB và thêm một mạch bổ sung trên PCB cho cùng mục đích, nhưng lần này sử dụng op-amp LM358 (không có vi điều khiển). Đối với mục đích trình diễn, chúng tôi đã chọn giới hạn điện áp thấp là 150v và giới hạn điện áp cao là 200v. Ở đây trong dự án này, chúng tôi không sử dụng bất kỳ rơ le nào để cắt, chúng tôi chỉ trình diễn nó bằng màn hình LCD, hãy xem Video ở cuối Bài viết này. Nhưng người dùng có thể gắn một rơ le với mạch này và kết nối nó với PIC’s GPIO.


Components Required:

  1. PIC Microcontroller PIC18F2520                
  2. PCB (ordered from EasyEDA)
  3. IC LM358            
  4. 3 pin Terminal Connector (optional)
  5. 16x2 LCD                           
  6. BC547 Transistor
  7. 1k resistor
  8. 2k2 resistor
  9. 30K resistor SMD
  10. 10k SMD
  11. Capacitors- 0.1uf, 10uF, 1000uF                               
  12. 28 pin IC base
  13. Male/female burgsticks
  14. 7805 Voltage regulators- 7805, 7812
  15. Pickit2 Programmer
  16. LED
  17. Zener diode- 5.1v, 7.5v, 9.2v
  18. Transformer 12-0-12
  19. 12MHz Crystal
  20. 33pF capacitor
  21. Voltage regulator(fan speed regulator)


Working Explanation:

Trong mạch cắt điện áp cao và thấp này, chúng tôi đã đọc điện áp xoay chiều bằng cách sử dụng vi điều khiển PIC với sự trợ giúp của biến áp, bộ chỉnh lưu cầu & mạch phân áp và hiển thị trên màn hình LCD 16x2. Sau đó, chúng tôi đã so sánh điện áp AC với các giới hạn được xác định trước và hiển thị thông báo cảnh báo trên màn hình LCD tương ứng. Giống như nếu điện áp dưới 150v thì chúng ta sẽ hiển thị "Điện áp thấp" và nếu điện áp trên 200v thì chúng ta sẽ hiển thị văn bản "Điện áp cao" trên màn hình LCD. Chúng tôi có thể thay đổi các giới hạn đó trong mã PIC được đưa ra ở cuối dự án này. Ở đây chúng tôi đã sử dụng Fan Regulator để tăng và giảm điện áp vào cho mục đích trình diễn trong Video.

Trong mạch này, chúng tôi cũng đã thêm một mạch bảo vệ điện áp dưới và quá áp đơn giản mà không cần sử dụng bất kỳ vi điều khiển nào. Trong mạch đơn giản này, chúng tôi đã sử dụng bộ so sánh LM358 để so sánh điện áp đầu vào và điện áp tham chiếu. Vì vậy, ở đây chúng tôi có ba lựa chọn trong dự án này:


Đo và so sánh điện áp xoay chiều với sự trợ giúp của máy biến áp, bộ chỉnh lưu cầu, mạch phân áp và vi điều khiển PIC.

Phát hiện điện áp trên và dưới bằng cách sử dụng LM358 với sự trợ giúp của máy biến áp, bộ chỉnh lưu và bộ so sánh LM358 (không có Bộ vi điều khiển)

Phát hiện điện áp dưới và quá áp bằng cách sử dụng bộ so sánh LM358 và đưa đầu ra của nó tới bộ vi điều khiển PIC để thực hiện hành động bằng mã.

Ở đây chúng tôi đã trình bày phương án đầu tiên của dự án này. Trong đó chúng tôi đã giảm điện áp đầu vào AC và sau đó chuyển đổi điện áp đó thành DC bằng cách sử dụng bộ chỉnh lưu cầu và sau đó ánh xạ lại điện áp DC này thành 5v và cuối cùng đưa điện áp này đến vi điều khiển PIC để so sánh và hiển thị.


Trong vi điều khiển PIC, chúng tôi đã đọc điện áp DC được ánh xạ này và dựa trên giá trị được ánh xạ đó, chúng tôi đã tính toán điện áp AC đến với sự trợ giúp của công thức đã cho:

volt= ((adcValue*240)/1023)


trong đó adcValue là giá trị điện áp đầu vào DC tương đương tại chân ADC của bộ điều khiển PIC và volt là điện áp AC được đặt vào. Ở đây chúng tôi đã lấy 240v làm điện áp đầu vào tối đa.


hoặc cách khác, chúng ta có thể sử dụng phương pháp đã cho để ánh xạ giá trị đầu vào DC tương đương.


volt = map(adcVlaue, 530, 895, 100, 240)  

trong đó adcValue là giá trị điện áp đầu vào DC tương đương tại chân ADC của bộ điều khiển PIC, 530 là điện áp DC tối thiểu tương đương và 895 là giá trị tương đương điện áp DC tối đa. Và 100v là điện áp ánh xạ tối thiểu và 240v là điện áp ánh xạ tối đa.


Có nghĩa là đầu vào 10mV DC tại chân PIC ADC bằng giá trị tương đương 2.046 ADC. Vì vậy, ở đây chúng tôi đã chọn 530 làm giá trị nhỏ nhất có nghĩa là, điện áp tại chân ADC của PIC sẽ là:

(((530/2.046)*10)/1000) Volt

2.6v sẽ được ánh xạ giá trị tối thiểu là 100VAC




Làm việc của dự án này là dễ dàng. Trong dự án này, chúng tôi đã sử dụng bộ điều chỉnh quạt điện áp xoay chiều để trình diễn nó. Chúng tôi đã gắn bộ điều chỉnh quạt vào đầu vào của máy biến áp. Và sau đó bằng cách tăng hoặc giảm điện trở của nó, chúng tôi nhận được đầu ra điện áp mong muốn.


Trong mã, chúng tôi đã cố định các giá trị điện áp tối đa và tối thiểu để phát hiện Điện áp cao và Điện áp thấp. Chúng tôi đã cố định 200v là giới hạn quá áp và 150v là giới hạn điện áp thấp hơn. Bây giờ sau khi cấp nguồn cho mạch, chúng ta có thể thấy điện áp đầu vào AC trên màn hình LCD. Khi điện áp đầu vào tăng lên thì chúng ta có thể thấy sự thay đổi điện áp trên màn hình LCD và nếu điện áp vượt quá giới hạn điện áp thì màn hình LCD sẽ cảnh báo chúng ta bằng “Cảnh báo điện áp cao” và nếu điện áp xuống thấp hơn giới hạn điện áp thì màn hình LCD sẽ cảnh báo chúng ta bằng cách hiển thị “ Thông báo LOW Voltage Alert ”. Bằng cách này, nó cũng có thể được sử dụng như bộ ngắt mạch điện tử.


Chúng tôi có thể thêm một rơ le để gắn bất kỳ thiết bị AC nào để tự động ngắt ở điện áp thấp hoặc cao. Chúng ta chỉ cần thêm một dòng mã để tắt thiết bị, bên dưới màn hình LCD hiển thị thông báo mã. Kiểm tra ở đây để sử dụng Rơ le với các thiết bị AC.

Circuit Explanation:


Trong Mạch bảo vệ điện áp cao và thấp, chúng tôi đã sử dụng một op-amp LM358 có hai đầu ra được kết nối với 2 và 3 chân số của vi điều khiển PIC. Và một bộ chia điện áp được sử dụng để phân chia điện áp và kết nối đầu ra của nó ở chân số 4 của vi điều khiển PIC. LCD được kết nối tại PORTB của PIC ở chế độ 4 bit. RS và EN được kết nối trực tiếp tại B0 và B1 và các chân dữ liệu D4, D5, D6 và D7of LCD được kết nối tại B2, B3, B4 và B5 tương ứng. Trong dự án này, chúng tôi đã sử dụng hai bộ điều chỉnh điện áp: 7805 cho nguồn cung cấp vi điều khiển và 7812 cho mạch LM358. Và một biến áp xuống cấp 12v-0-12v cũng được sử dụng để giảm điện áp xoay chiều. Phần còn lại của các thành phần được hiển thị trong sơ đồ mạch bên dưới.



Programming Explanation:


#include<xc.h>        //xc8 is compiler
#include<stdio.h>
#include<stdlib.h>

// CONFIG1H
#pragma config OSC = HS         // Oscillator Selection bits (HS oscillator)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)

// CONFIG2L
#pragma config PWRT = ON       // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = SBORDIS  // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
#pragma config BORV = 3         // Brown Out Reset Voltage bits (Minimum setting)

// CONFIG2H
#pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)

// CONFIG3H
#pragma config CCP2MX = PORTC   // CCP2 MUX bit (CCP2 input/output is multiplexed with RB1)
#pragma config PBADEN = OFF     // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
#pragma config LPT1OSC = OFF    // Low-Power Timer1 Oscillator Enable bit (Timer1 configured for higher power operation)
#pragma config MCLRE = ON       // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)

// CONFIG4L
#pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = OFF        // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))

// CONFIG5L
#pragma config CP0 = OFF        // Code Protection bit (Block 0 (000800-001FFFh) not code-protected)
#pragma config CP1 = OFF        // Code Protection bit (Block 1 (002000-003FFFh) not code-protected)
#pragma config CP2 = OFF        // Code Protection bit (Block 2 (004000-005FFFh) not code-protected)
#pragma config CP3 = OFF        // Code Protection bit (Block 3 (006000-007FFFh) not code-protected)

// CONFIG5H
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block (000000-0007FFh) not code-protected)
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code-protected)

// CONFIG6L
#pragma config WRT0 = OFF       // Write Protection bit (Block 0 (000800-001FFFh) not write-protected)
#pragma config WRT1 = OFF       // Write Protection bit (Block 1 (002000-003FFFh) not write-protected)
#pragma config WRT2 = OFF       // Write Protection bit (Block 2 (004000-005FFFh) not write-protected)
#pragma config WRT3 = OFF       // Write Protection bit (Block 3 (006000-007FFFh) not write-protected)

// CONFIG6H
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot block (000000-0007FFh) not write-protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write-protected)

// CONFIG7L
#pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 (000800-001FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 (002000-003FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF      // Table Read Protection bit (Block 2 (004000-005FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF      // Table Read Protection bit (Block 3 (006000-007FFFh) not protected from table reads executed in other blocks)

// CONFIG7H
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) not protected from table reads executed in other blocks)

#define rs RB0
#define en RB1
char result[10]; 
#define lcdport PORTB
#define method 0

void delay(unsigned int Delay)
{
    int i,j;
    for(i=0;i<Delay;i++)
        for(j=0;j<1000;j++);
}

void lcdcmd(char ch)
{
    lcdport= (ch>>2)& 0x3C;
    rs=0;
    en=1;
    delay(1);
    en=0;
    lcdport= (ch<<2) & 0x3c;
    rs=0;
    en=1;
    delay(1);
    en=0;
}

void lcdwrite(char ch)
{
    lcdport=(ch>>2) & 0x3c;
    rs=1;
    en=1;
    delay(1);
    en=0;
    lcdport=(ch<<2) & 0x3c;
    rs=1;
    en=1;
    delay(1);
    en=0;
}

void lcdprint(char *str)
{
    while(*str)
    {
        lcdwrite(*str);
        str++;
    }
}

void lcdbegin()
{
    lcdcmd(0x02);
    lcdcmd(0x28);
    lcdcmd(0x0e);
    lcdcmd(0x06);
    lcdcmd(0x01);
}

int analogRead(int ch)
{
    int adcData=0;
    if(ch == 0)
    ADCON0 = 0x03;       // adc channel 0
    else if(ch == 1)
    ADCON0 = 0x0b;       //select adc channel 1
    else if(ch == 2)    
    ADCON0 = 0x0b;        //select adc channel 2    
    ADCON1 = 0b00001100;     // select analog i/p     0,1 and 2 channel of ADC
    ADCON2 = 0b10001010;    //eqisation time holding cap time
    while(GODONE==1);       // start conversion adc value
    adcData = (ADRESL)+(ADRESH<<8);     //Store 10-bit output 
    ADON=0;            // adc off
    return adcData;
}

long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

void main()
{    
//ADCON1  = 0b0001111;      //all port is digital
TRISB=0x00;
TRISC=0x00;
TRISA=0xff;
lcdbegin();
lcdprint("HIGH/LOW Volt");
lcdcmd(192);
lcdprint("Detector by PIC");
delay(1000);
lcdcmd(1);
lcdprint("CircuitDigest");
lcdcmd(192);
lcdprint("Welcomes You");
delay(1000);

while(1)
{
    long adcValue=0;
    int volt=0;
    for(int i=0;i<100;i++)   // taking samples
    {   
        adcValue+=analogRead(2);
        delay(1);
    }
    adcValue/=100;

    #if method == 1
    volt= (((float)adcValue*240.0)/1023.0);
    #else
    volt = map(adcValue, 530, 895, 100, 240);
    #endif
    sprintf(result,"%d",volt);
    
    lcdcmd(0x80);
    lcdprint("H>200V  L<150V");
    lcdcmd(0xc0);
    lcdprint("Voltage:");
    lcdprint(result);
    lcdprint(" V   ");
    delay(1000);
    if(volt > 200)
    {
        lcdcmd(1);
        lcdprint("High Voltage");
        lcdcmd(192);
        lcdprint("  Alert  ");
        delay(1000);
    }
    
    else if(volt < 150)
    {
        lcdcmd(1);
        lcdprint("Low Voltage");
        lcdcmd(192);
        lcdprint("  Alert  ");
        delay(1000);
    } 
}
}




Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...