我們經常看到家中電力供應的電壓波動,這可能會導致我們家用交流電器出現故障。今天,我們正在構建一種低成本的高低壓保護電路,該電路將在高電壓或低電壓的情況下切斷電器的電源。它還將在 16x2 LCD 上顯示警告消息。在本項目中,我們使用PIC微控制器來讀取輸入電壓并將其與參考電壓進行比較,并采取相應的措施。
我們在PCB上制作了這個電路,并在PCB上增加了一個額外的電路用于相同的目的,但這次使用的是運算放大器LM358(不帶微控制器)。出于演示目的,我們選擇低電壓限制為150v,高電壓限制為200v。在這個項目中,我們沒有使用任何繼電器進行切斷,我們只是使用LCD演示了它,請查看本文末尾的視頻。但是用戶可以將繼電器連接到該電路,并將其與PIC的GPIO連接。
所需組件:
- PIC微控制器PIC18F2520
- 電路板(從立創EDA訂購)
- 集成電路 LM358
- 3 針端子連接器(可選)
- 16x2 液晶顯示器
- BC547 晶體管
- 1k 電阻器
- 2k2 電阻器
- 30K電阻貼片
- 10k 貼片
- 電容器 - 0.1uf, 10uF, 1000uF
- 28 針 IC 基座
- 公/母盜賊
- 7805 穩壓器 - 7805, 7812
- 皮基特2 程序員
- 發光二極管
- 齊納二極管 - 5.1V、7.5V、9.2V
- 變壓器 12-0-12
- 12MHz 晶體
- 33pF 電容器
- 電壓調節器(風扇調速器)
工作說明:
在這個高低壓切斷電路中,我們使用**PIC微控制器**在變壓器,橋式整流器和分壓器電路的幫助下讀取交流電壓,并在16x2 LCD上顯示。然后,我們將交流電壓與預定義的限值進行比較,并相應地在LCD上顯示警報消息。就像如果電壓低于150v,那么我們顯示“低電壓”,如果電壓高于200v,那么我們在LCD上顯示“高壓”文本。我們可以在項目結束時給出的 PIC 代碼中更改這些限制。在這里,我們使用風扇調節器來增加和減少輸入電壓,以便在視頻中進行演示。
在該電路中,我們還添加了 一個簡單的欠壓和過壓保護電路 ,而無需使用任何微控制器。在這個簡單的電路中,我們使用LM358比較器來比較輸入和基準電壓。因此,我們在此項目中有三個選項:
- 借助變壓器,橋式整流器,分壓器電路和PIC微控制器測量和比較交流電壓。
- 借助變壓器、整流器和比較器 LM358(無微控制器)使用 LM358 檢測過壓和欠壓
- 使用比較器 LM358 檢測欠壓和過壓,并將其輸出饋送到 PIC 微控制器,以便通過代碼采取行動。
在這里,我們演示了該項目的第一個選項。其中,我們將交流輸入電壓降壓,然后使用橋式整流器將其轉換為直流,然后再次將該直流電壓映射到5v,最后將該電壓饋送到PIC微控制器進行比較和顯示。
在PIC微控制器中,我們已經讀取了這個映射的直流電壓,并根據該映射值,我們借助給定的公式計算了輸入的交流電壓:
volt= ((adcValue*240)/1023)
其中 adcValue 是 PIC 控制器 ADC 引腳上的等效直流輸入電壓值,伏特是施加的交流電壓。這里我們采用240v作為最大輸入電壓。
或者,我們可以使用給定的方法來映射等效的直流輸入值。
volt = map(adcVlaue, 530, 895, 100, 240)
其中ADC值是PIC控制器ADC引腳上的等效直流輸入電壓值,530是最小直流電壓等效值,895是最大直流電壓等效值。100v是最小映射電壓,240v是最大映射電壓。
PIC ADC 引腳上的 10mV 直流輸入等于 2.046 ADC 等效值。因此,這里我們選擇了 530 作為最小值,PIC 的 ADC 引腳上的電壓將為:
(((530/2.046)*10)/1000) Volt
2.6V,將映射最小值為100VAC
(最大限制的計算相同)。
檢查地圖功能最后在PIC程序代碼中給出。
這個項目的工作很容易。在這個項目中,我們使用了交流電壓風扇調節器來演示它。我們在變壓器的輸入端安裝了風扇調節器。然后通過增加或減少其電阻,我們獲得了所需的電壓輸出。
在代碼中,我們有固定的最大和最小電壓值,用于高壓和低電壓檢測。我們將200v固定為過壓限制,150v為下限電壓限制。現在,在電路上電后,我們可以看到LCD上的交流輸入電壓。當輸入電壓增加時,我們可以看到LCD上的電壓變化,如果電壓超過電壓限制,則LCD將通過“高壓警報”提醒我們,如果電壓低于電壓限制,則LCD將通過顯示“低電壓警報”消息來提醒我們。這樣它也可以用作 電子斷路器 。
我們可以進一步添加一個繼電器,將任何交流電器連接到低壓或高壓的自動切斷。我們只需要添加一行代碼即可關閉設備,在顯示代碼的 LCD 警報消息下方。查看此處以將繼電器與交流電器一起使用。
電路說明:
在高低壓保護電路中,我們使用了LM358運算放大器,該運算放大器具有連接到PIC微控制器的2個和3個數字引腳的兩個輸出。分壓器用于分壓,并將其輸出連接到PIC微控制器的第4個數字引腳。液晶屏以 4 位模式連接到 PIC 的端口。RS 和 EN 直接連接在 B0 和 B1 上,LCD 的數據引腳 D4、D5、D6 和 D7 分別連接在 B2、B3、B4 和 B5 上。在本項目中,我們使用了兩個穩壓器:7805用于微控制器電源,7812用于LM358電路。12v-0-12v降壓變壓器也用于降壓交流電壓。其余組件如下圖所示。
編程說明:
這個項目的編程部分很容易。在此代碼中,我們只需要使用來自分壓器電路的映射0-5v電壓來計算交流電壓,然后將其與預定義的值進行比較。您可以在此項目之后檢查完整的 PIC 代碼。
首先,在代碼中,我們包含一個標頭并配置了PIC微控制器配置位。如果您不熟悉 PIC 編碼,請在此處學習 PIC 微控制器及其配置位。
然后我們使用了一些功能來驅動LCD,比如void lcdbegin()用于初始化LCD,void lcdcmd(char ch)用于向LCD發送命令,void lcdwrite(char ch)用于將數據發送到LCD, *void lcdprint(char str ) 用于將字符串發送到LCD。 檢查以下代碼中的所有函數。
下面給定的函數用于映射值:
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;
}
給定 int analogRead(int ch) 函數用于初始化和讀取 ADC:
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;
}
給定的線路用于獲取ADC樣本并計算它們的平均值,然后計算電壓:
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);
最后給定函數用于執行結果操作:
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);
}
這樣我們就可以輕松地為我們的家構建低壓高壓保護電路。此外,您只需**添加一個繼電器即可將任何交流電器連接到**它,以保護它免受電壓波動的影響。只需將繼電器與PIC MCU的任何通用引腳連接,并編寫代碼以使該引腳高低以及LCD警報消息代碼。
#include
#include
#include
// 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;ifor(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);
}
}
}
-
保護電路
+關注
關注
46文章
888瀏覽量
101636 -
PIC微控制器
+關注
關注
0文章
17瀏覽量
7392 -
高低壓
+關注
關注
2文章
4瀏覽量
5796
發布評論請先 登錄
相關推薦
評論