基于PIC微控制器构建一种低成本的高低压保护电路

我们经常看到家中电力供应的电压波动,这可能会导致我们家用交流电器出现故障。今天,我们正在构建一种低成本的高低压保护电路,该电路将在高电压或低电压的情况下切断电器的电源。它还将在 16x2 lcd 上显示警告消息。在本项目中,我们使用pic微控制器来读取输入电压并将其与参考电压进行比较,并采取相应的措施。
我们在pcb上制作了这个电路,并在pcb上增加了一个额外的电路用于相同的目的,但这次使用的是运算放大器lm358(不带微控制器)。出于演示目的,我们选择低电压限制为150v,高电压限制为200v。在这个项目中,我们没有使用任何继电器进行切断,我们只是使用lcd演示了它,请查看本文末尾的视频。但是用户可以将继电器连接到该电路,并将其与pic的gpio连接。
所需组件:pic微控制器pic18f2520电路板(从立创eda订购)集成电路 lm3583 针端子连接器(可选)16x2 液晶显示器bc547 晶体管1k 电阻器2k2 电阻器30k电阻贴片10k 贴片电容器 - 0.1uf, 10uf, 1000uf28 针 ic 基座公/母盗贼7805 稳压器 - 7805, 7812皮基特2 程序员发光二极管齐纳二极管 - 5.1v、7.5v、9.2v变压器 12-0-1212mhz 晶体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) volt2.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 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 //xc8 is compiler
#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 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;i2)& 0x3c;rs=0;en=1;delay(1);en=0;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 0else if(ch == 1)adcon0 = 0x0b; //select adc channel 1else if(ch == 2) adcon0 = 0x0b; //select adc channel 2 adcon1 = 0b00001100; // select analog i/p 0,1 and 2 channel of adcadcon2 = 0b10001010; //eqisation time holding cap timewhile(godone==1); // start conversion adc valueadcdata = (adresl)+(adresh<<8); //store 10-bit output adon=0; // adc offreturn 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;i200v l 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);}}
}

半导体进入周期性疲软 行业急需技术创新
digilent PowerBRICKS (9V)电源介绍
降压DC-DC4.5V至60V输入电压5A电流输出转换器详解
车载计算为急救人员提供车载SD-WAN
舜宇光学科技关键零部件缺货,智能手机镜头出货量下降 19.2%
基于PIC微控制器构建一种低成本的高低压保护电路
某电厂脱硫吸收塔浆液密度计存在的问题
钢板切割物联网云平台应用
回顾改变计算乃至数字世界的伟大芯片讲述背后的人和故事
fs5080E双节串联锂离子电池升压管理芯片
华为畅享7评测:华为畅享7评测外观、性能配置、拍照、功能、续航很惊喜,这种黑很好看!
SLDLaser发布一款车用级应用及专业照明应用 比LED灯亮10多倍
工业互联网面临四大挑战,工业区块链发展任重道远
智能电网的建设引起行业工业以太网交换机市场规模的增长
小芯片的应用将是未来LED的趋势之一
苹果计划发布全新的VR头显产品,但这个行业的供应链掌握好了吗
电梯智能温湿度传感器是什么?其工作原理是什么?
华为云服务器,中小企业数字化升级的明智之选
XUBOXL-BH电气防火限流式保护器概述及功能特点
“跑分作弊”是行业潜规则?