Trong dự án này, chúng tôi sẽ tạo ra một hệ thống giám sát ắc quy ô tô dựa trên PIC trên PCB. Ở đây chúng tôi đã thiết kế một PCB bằng cách sử dụng trình mô phỏng và thiết kế PCB trực tuyến của EASYEDA. Mạch giám sát ắc quy ô tô này được sử dụng để theo dõi năng lượng của ắc quy ô tô bằng cách chỉ cần cắm nó vào ổ cắm điện trên bảng điều khiển của ô tô. PCB cũng có tùy chọn sử dụng nó như công cụ Đo điện áp hoặc Vôn kế mà không cần sử dụng bộ sạc USB trên ô tô. Chúng tôi đã gắn một khối thiết bị đầu cuối ở đây để đo điện áp của các nguồn điện khác, chỉ bằng cách kết nối hai dây dẫn trong đó từ nguồn điện.
Components Required:
- PIC Microcontroller PIC18F2520 -1
- Fabricated PCB Board -1
- USB connector -1
- 2 pin Terminal Connector (optional) -1
- Common anode seven segment display(4 in 1) -1
- BC557 Transistor -4
- 1k resistor -6
- 2k resistor -1
- 100R resistor -8
- 1000uF capacitor -1
- 10uF capacitor -1
- 28 pin IC base -1
- female burgsticks -1
- 7805 Voltage regulator -1
- Car USB charger -1
- LED -1
- Zener diode5.1v -2
- USB cable (B-type or Arduino UNO compatible) -1
- 20MHz Crystal -1
- 33pF capacitor -2
Description:
Chúng ta cũng có thể sử dụng mạch tương tự để đo điện áp của các nguồn điện khác lên đến 15v. Vì mục đích này, chúng tôi đã hàn Khối đầu cuối (khối nhựa màu xanh lá cây) trong PCB nơi bạn có thể kết nối hai dây từ nguồn điện và có thể theo dõi điện áp. Kiểm tra Video ở cuối, chúng tôi đã chứng minh điều đó ở đâu bằng cách đo điện áp của Bộ nguồn biến đổi, bộ sạc dự phòng USB và bộ chuyển đổi AC-DC 12v. Đồng thời kiểm tra Mạch theo dõi pin đơn giản và Mạch sạc pin 12v.
Circuit Diagram and Working Explanation:
Để tính toán điện áp ắc quy ô tô từ giá trị ADC, chúng tôi đã sử dụng công thức đã cho:
Voltage= (ADC value / resistor factor) * reference Voltage Where: ADC value= output of Voltage divider (converted into digital by microcontroller) Resistor factor = 1023.0 / (R2/R1+R2) // 1023 is max ADC value (10-bit) Reference Voltage= 5 volts // internal 5v reference selected
Tính toán hệ số điện trở:
Trong dự án này, chúng tôi đang đọc điện áp của ắc quy ô tô (nói chung) khoảng 12v-14v. Vì vậy, chúng tôi đã thực hiện dự án này với giả định tối đa 15v có nghĩa là hệ thống này có thể được đọc tối đa lên đến 15v.
Vậy trong đoạn mạch ta đã sử dụng điện trở R1 và R2 ở phần phân áp và có giá trị là:
R1 = 2K
R2 = 1K
Hệ số điện trở = 1023.0 * (1000/2000 + 1000)
Hệ số điện trở = 1023.0 * (1/3)
Hệ số điện trở = 341.0 cho tối đa 15 vôn
Vì vậy, Công thức cuối cùng để tính toán điện áp sẽ như sau, mà chúng tôi đã sử dụng Mã, được đưa ra ở cuối Điều này:
Voltage= (ADC value / 341.0) * 5.0
Programming Explanation:
#include<xc.h> //xc8 is compiler
// 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 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_led2 TRISAbits.TRISA5
#define TRIS_led3 TRISAbits.TRISA0
#define TRIS_led4 TRISAbits.TRISA1
#define TRIS_led5 TRISAbits.TRISA4
#define TRIS_PORTB TRISB
#define TRIS_adcpin TRISAbits.TRISA0
#define adcpin PORTAbits.RA0
#define TRIS_dot TRISBbits.TRISB7
#define dot PORTBbits.RB7
#define seg1 PORTCbits.RC0
#define seg2 PORTCbits.RC1
#define seg3 PORTCbits.RC2
#define seg4 PORTCbits.RC3
#define led1 PORTAbits.RA2
#define led2 PORTAbits.RA5
#define led3 PORTAbits.RA0
#define led4 PORTAbits.RA1
#define led5 PORTAbits.RA4
void delay(unsigned long Delay)
{
int i,j;
for(i=0;i<Delay;i++)
for(j=0;j<1000;j++);
}
void adc_init();
float adc_value(void);
void convert(float);
unsigned int counter2;
unsigned char position = 0;
unsigned char k[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int digit1=0,digit2=0,digit3=0,digit4=0;
/*************************************timer0*******************************************/
void interrupt low_priority LowIsr(void)
{
if(TMR0IF == 1)
{
counter2++;
if(counter2>=1)
{
if(position ==0)
{
seg1=0;
seg2=1;
seg3=1;
seg4=1;
}
if(position ==1)
{
seg1=1;
seg2=0;
seg3=1;
seg4=1;
}
if(position==2)
{
dot=0;
seg1=1;
seg2=1;
seg3=0;
seg4=1;
}
if(position==3)
{
seg1=1;
seg2=1;
seg3=1;
seg4=0;
}
if(position == 0)
PORTB = k[digit1];
if(position == 1)
PORTB = k[digit2];
if(position == 2)
{
PORTB = k[digit3];
PORTB&=~(0x80);
}
if(position == 3)
PORTB = k[digit4];
position++;
if(position>=4)
position = 0;
counter2 =0;
}
TMR0 =55536;
TMR0IF=0;
}
}
void main()
{
float adcValue=0;
float Value[40];
int i=0;
ADCON1 = 0b00001111; //all port is digital
GIE = 1; //GLOBLE INTRRUPT ENABLE
PEIE = 1; //peripheral intrupt flag
T0CON = 0b000000000; //prescaler value put
TMR0IE = 1; //interrupt enable
TMR0IP = 0; //interrupt priority
TMR0 = 55536; //start counter after this value
TMR0ON = 1;
TRIS_seg1 =0;
TRIS_seg2 =0;
TRIS_seg3 =0;
TRIS_seg4 =0;
TRIS_led1 = 0;
TRIS_led2 = 0;
TRIS_led3 =0;
TRIS_led4 =0;
TRIS_led5 =0;
TRIS_PORTB = 0;
TRIS_adcpin = 1;
TRIS_dot = 0;
while(1)
{
adc_init();
for(i=0;i<40;i++)
{
Value[i]=adc_value();
adcValue+=Value[i];
}
adcValue=(float)adcValue/40.0;
convert(adcValue);
delay(100);
}
}
void adc_init()
{
ADCON0 = 0b00000011; //select adc channel
ADCON1 = 0b00001110; //select analog and digital i/p
ADCON2 = 0b10001010; //eqisation time holding cap time
ADON = 1;
}
float adc_value(void)
{
float adc_data=0;
while(GO/DONE==1); //higher bit data start conversion adc value
adc_data = (ADRESL)+(ADRESH<<8); //Store 10-bit output
adc_data =((adc_data/342.0)*5.0);
return 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;
}