• PIC Based Car Battery Voltage Monitoring System - Hệ thống giám sát điện áp ắc quy ô tô dựa trên PIC

QC

PIC Based Car Battery Voltage Monitoring System - Hệ thống giám sát điện áp ắc quy ô tô dựa trên PIC

 



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:

  1. PIC Microcontroller PIC18F2520  -1
  2. Fabricated PCB   Board  -1
  3. USB connector  -1
  4. 2 pin Terminal Connector (optional)  -1
  5. Common anode seven segment display(4 in 1)  -1
  6. BC557 Transistor  -4
  7. 1k resistor  -6
  8. 2k resistor  -1
  9. 100R resistor  -8
  10. 1000uF capacitor  -1
  11. 10uF capacitor  -1
  12. 28 pin IC base  -1
  13. female burgsticks  -1
  14. 7805 Voltage regulator  -1
  15. Car USB charger  -1
  16. LED  -1
  17. Zener diode5.1v -2
  18. USB cable (B-type or Arduino UNO compatible) -1
  19. 20MHz Crystal  -1
  20. 33pF capacitor  -2

Description:

Nói chung, việc đo điện năng của ắc quy ô tô mỗi lần là không quan trọng, nhưng chúng ta thường cần biết về điện áp ắc quy trong quá trình sạc, để kiểm tra xem nó có sạc hay không. Bằng cách này, chúng tôi có thể bảo vệ pin bị hỏng do hệ thống sạc bị lỗi. Điện áp của ắc quy ô tô 12v trong quá trình sạc là khoảng 13,7v. Vì vậy, chúng tôi có thể xác định xem pin của chúng tôi đang sạc tốt hay không và có thể điều tra các nguyên nhân gây ra lỗi pin. Trong dự án này, chúng tôi sẽ triển khai Đồng hồ đo điện áp cho ắc quy ô tô bằng cách sử dụng vi điều khiển PIC. Bật lửa Thuốc lá Ô tô hoặc Bộ sạc USB Ô tô được sử dụng để đưa điện áp của pin đến chân ADC của bộ vi điều khiển với sự trợ giúp của Mạch phân chia điện áp. Sau đó, một màn hình 4 chữ số bảy phân đoạn được sử dụng để hiển thị giá trị điện áp của pin. Mạch này có thể đo điện áp lên đến 15v.

Khi pin ô tô đang sạc, thì điện áp trên các cực của pin thực sự đến từ máy phát điện / bộ chỉnh lưu, đó là lý do tại sao hệ thống đọc 13,7 vôn. Nhưng khi pin không được sạc hoặc động cơ ô tô không BẬT, thì điện áp trên đầu cực của pin là điện áp thực tế của pin vào khoảng 12v.


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:

Trong mạch theo dõi điện áp ắc quy này, chúng tôi đã đọc điện áp ắc quy ô tô bằng cách sử dụng một chân tương tự có sẵn của vi điều khiển PIC và ở đây chúng tôi đã chọn chân AN0 (28) của vi điều khiển thông qua một mạch phân áp. Một diode zener 5.1v cũng được sử dụng để bảo vệ.


Màn hình 7 phân đoạn 4 trong 1 được sử dụng để hiển thị giá trị tức thời của điện áp ắc quy ô tô được kết nối tại PORTB và PORTC của bộ vi điều khiển. Bộ điều chỉnh điện áp 5v cụ thể là LM7805 được sử dụng để cấp nguồn cho toàn bộ mạch bao gồm Bảy Màn hình Phân đoạn. Bộ dao động tinh thể 20 MHz được sử dụng để tạo xung nhịp cho bộ vi điều khiển. Mạch được cung cấp năng lượng bởi chính bộ sạc ô tô USB bằng cách sử dụng LM7805. Chúng tôi đã thêm một cổng USB trong PCB, vì vậy chúng tôi có thể kết nối trực tiếp bộ sạc USB trên ô tô với mạch.

Để cấu hình ADC ở đây chúng tôi đã chọn chân analog AN0 với điện áp tham chiếu bên trong là 5v và đồng hồ f / 32 để chuyển đổi ADC.

Để 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;
 }











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/...