在这个项目中,我们将在PCB上制作一个基于PIC的汽车电池监控系统。在这里,我们使用EASYEDA在线PCB仿真器和设计器设计了PCB。该汽车电池监控电路仅通过将其插入汽车仪表板上的电源插座即可监控汽车电池的电源。该PCB还使用它作为选择电压测量工具或电压表,而无需使用USB车载充电器。我们在这里连接了一个端子块,用于测量其他电源的电压,只需将电源中的两条线连接起来即可。
所需组件:
- PIC单片机PIC18F2520 -1
- 预制PCB板-1
- USB连接器-1
- 2针端子连接器(可选)-1
- 共阳极七段显示(1合4)-1
- BC557晶体管-4
- 1k电阻-6
- 2k电阻-1
- 100R电阻-8
- 1000uF电容器-1
- 10uF电容器-1
- 28针IC底座-1
- 女汉堡-1
- 7805稳压器-1
- 车载USB充电器-1
- LED -1
- 稳压二极管5.1v -2
- USB电缆(兼容B型或Arduino UNO)-1
- 20MHz晶体-1
- 33pF电容器-2
描述:
通常,每次测量汽车电池电量并不重要,但是我们经常需要在充电过程中了解电池电压,以检查其是否充电。这样,我们可以保护由于充电系统故障而导致的电池故障。充电期间12v汽车电池的电压约为13.7v。因此,我们可以确定电池充电是否良好,并可以调查电池故障的原因。在这个项目中,我们将使用PIC微控制器实现汽车电池电压表。车载点烟器或车载USB充电器用于通过分压器电路将电池电压获取到微控制器的ADC引脚。然后显示一个四位数的七段用于显示电池的电压值。该电路可以测量高达15v的电压。
当汽车电池正在充电时,电池两端的电压实际上来自交流发电机/整流器,这就是系统读取13.7伏特电压的原因。但是,当电池未充电或汽车发动机未开启时,电池端子两端的电压即为12v左右的实际电池电压。
我们还可以使用同一电路测量高达15v的其他电源的电压。为此,我们在PCB上焊接了端子块(绿色塑料块),您可以在其中连接电源的两根电线并监视电压。最后检查视频,我们通过测量可变电源,USB移动电源和12v AC-DC适配器的电压在哪里演示了视频。还要检查简单电池监控器电路和12v电池充电器电路。
电路图及工作说明:
在此电池电压监控电路中,我们已使用PIC微控制器的内置模拟引脚读取了汽车电池电压,这里我们通过分压电路选择了微控制器的AN0(28)引脚。5.1v的齐纳二极管也用于保护。
四合一七段显示器用于显示连接在微控制器的PORTB和PORTC处的汽车电池电压的瞬时值。5v稳压器LM7805用于为包括七段显示器的整个电路供电。一个20 MHz的晶体振荡器用于为微控制器提供时钟。电路使用LM7805由USB车载充电器本身供电。我们在PCB中添加了USB端口,因此我们可以将车载USB充电器直接连接到电路。
车载USB充电器或点烟器从车载12v电源插座提供5v稳压电源,但是我们需要测量车载电池的实际电压,因此我们对车载充电器进行了调整。您需要打开车载USB充电器,然后找到5v(输出)和12v(输入)端子,然后通过用砂纸或一些硬物擦拭5v连接来断开5v连接,然后将USB输出端子直接短接到12v。首先从车载USB充电器的USB端口打开5v连接,然后将12v连接到连接5v的USB端口。如下图所示,我们已经切断了红色圆圈的连接,这可能与您的车载充电器不同。
为了在此处配置ADC,我们选择了内部基准电压为5v且模拟时钟为f / 32的模拟引脚AN0进行ADC转换。
要根据ADC值计算汽车电池电压,我们使用了以下公式:
电压=(ADC值/电阻系数)*参考电压其中:ADC值=分压器的输出(由微控制器转换为数字)电阻系数= 1023.0 /(R2 / R1 + R2)// 1023是最大ADC值(10-位)参考电压= 5伏//已选择内部5v参考
电阻系数计算:
在这个项目中,我们读取的汽车电池电压(通常)约为12v-14v。因此,我们在假设最大15v的情况下完成了该项目,这意味着该系统最大可以读取15v的电压。
因此,在电路中,我们在分压器部分使用了R1和R2电阻,其值为:
R1 = 2K
R2 = 1千
电阻系数= 1023.0 *(1000/2000 + 1000)
电阻系数= 1023.0 *(1/3)
电阻系数= 341.0(最高15伏)
因此,电压计算的最终公式如下,我们使用了本文末尾给出的代码:
电压=(ADC值/ 341.0)* 5.0
使用EasyEDA的电路和PCB设计:
为了设计用于汽车电池电压监控器的电路,我们使用了EasyEDA,它是一个免费的在线EDA工具,用于无缝创建电路和PCB。以前,我们从EasyEDA订购了几块PCB,并在发现整个过程(从绘制电路到订购PCB)的整个过程中一直使用它们的服务,与其他PCB制造商相比,更加方便,高效。 EasyEDA免费提供电路图,仿真,PCB设计,还提供高质量,低价格的定制PCB服务。在此处查看有关如何使用Easy EDA进行原理图,PCB布局,模拟电路等的完整教程。
EasyEDA每天都在进步;他们增加了许多新功能并改善了整体用户体验,这使EasyEDA更加容易并且可用于设计电路。他们即将推出其桌面版本,该版本可以下载并安装在您的计算机上以供离线使用。
在EasyEDA中,您可以公开您的电路和PCB设计,以便其他用户可以复制或编辑它们并从中受益,我们还为此汽车电池电压监控器公开了整个电路和PCB布局,请检查以下链接:
easyeda.com/circuitdigest/PIC_based_Car_Battery_Monitoring_System-63c2d5948eaa48c5bcbbd8db49a6c776
以下是EasyEDA的PCB布局顶层快照,您可以通过选择“层”窗口中的层来查看PCB的任何层(顶层,底层,顶层丝绸,底层丝绸等)。
在线计算和订购PCB样品:
完成PCB设计之后,您可以单击 Fabrication output 图标 ,这将带您进入PCB订购页面。在这里,您可以在Gerber Viewer中查看您的PCB或下载您的PCB的Gerber文件并将其发送给任何制造商,直接在EasyEDA中订购它也更加容易(而且更便宜)。在这里,您可以选择要订购的PCB数量,所需的铜层数,PCB的厚度,铜的重量,甚至PCB的颜色。选择所有选项后,单击“保存到购物车”并完成您的订购,几天后您将获得PCB。
您可以使用此链接直接订购该PCB或下载Gerber文件。
订购PCB几天后,我得到了PCB样品
拿到PCB之后,我将所有必需的组件都安装在PCB上,最后我们准备好了 汽车电池监控系统,请在最后的视频中检查该电路。
编程说明:
这个项目的程序对于初学者来说有点困难。要编写此代码,我们需要一些头文件。在这里,我们使用MPLAB X IDE进行编码,并使用XC编译器来构建和编译代码。该代码是用C语言编写的。
在此代码中,我们已使用模拟引脚读取电池电压,并且为了控制数据或将数据发送至4位七段显示器,我们使用了PIC微控制器中的Timer Interrupt Server Routine。电压测量的所有计算均在主程序例程中完成。
首先,在代码中,我们包含了标头,然后使用配置位对PIC单片机进行了配置。
#包括
然后显示声明的变量和为七个段定义的引脚
unsigned int counter2; 无符号字符位置= 0; 无符号字符k = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; int digit1 = 0,digit2 = 0,digit3 = 0,digit4 = 0; #define TRIS_seg1 TRISCbits.TRISC0 #define TRIS_seg2 TRISCbits.TRISC1 #define TRIS_seg3 TRISCbits.TRISC2 #define TRIS_seg4 TRISCbits.TRISC3 #define TRIS_led1 TRISAbits.TRISA2 #define TRIS_led2led3.TRISA2#define TRIS_led2 TRIS_led5 TRISAbits.TRISA…………….
现在,我们创建了一个定时器中断例程来驱动七段显示:
void interrupt low_priority LowIsr(void){if(TMR0IF == 1){counter2 ++; if(counter2> = 1){if(position == 0){seg1 = 0; seg2 = 1; seg3 = 1; seg4 = 1;………………
现在在 void main() 函数中,我们已经初始化了计时器和中断。
GIE = 1; // GLOBLE INTRRUPT ENABLE PEIE = 1; //外围中断标志T0CON = 0b000000000; //将预分频器的值设置为TMR0IE = 1; //中断使能TMR0IP = 0; //中断优先级TMR0 = 55536; //在该值TMR0ON = 1之后启动计数器;
然后在 while 循环中,我们读取模拟引脚上的模拟输入并调用一些函数进行计算。
while(1){adc_init(); for(i = 0; i <40; i ++){Value = adc_value(); adcValue + =值; } adcValue =(float)adcValue / 40.0; convert(adcValue); 延迟(100); }
给定的 adc_init() 函数用于初始化ADC
无效adc_init(){ADCON0 = 0b00000011; //选择adc通道ADCON1 = 0b00001110; //选择模拟和数字I / P ADCON2 = 0b10001010; //均衡时间保持上限时间ADON = 1; }
给定的 adc_value 函数用于从模拟引脚读取输入并计算电压。
float adc_value(void){float adc_data = 0; while(GO / DONE == 1); //高位数据开始转换adc值adc_data =(ADRESL)+(ADRESH << 8); //存储10位输出adc_data =(((adc_data / 342.0)* 5.0); 返回adc_data; }
给定的 转换 功能用于将电压值转换为分段支持值。
void convert(float f){int d =(f * 100); digit1 = d%10; d = d / 10; digit2 = d%10; d = d / 10; digit3 = d%10; digit4 = d / 10; }
在下面的演示视频中查看此项目的完整代码。