- Nødvendige komponenter:
- Beskrivelse:
- Kredsløbsdiagram og arbejdsforklaring:
- Kredsløb og printkortdesign ved hjælp af EasyEDA:
- Beregning og bestilling af PCB-prøver online:
- Programmeringsforklaring:
I dette projekt skal vi lave et PIC-baseret overvågningssystem til bilbatterier på printkort. Her har vi designet et printkort ved hjælp af EASYEDA online PCB-simulator og designer. Dette overvågningskredsløb til bilbatterier bruges til at overvåge bilbatteriets strøm ved blot at sætte det i stikkontakten på bilens instrumentbræt. Den PCB har også mulighed for at bruge det som spændingsmåling værktøj eller Voltmeter uden at bruge USB-oplader til bil. Vi har knyttet en terminalblok her for at måle spændingen fra andre strømkilder, bare ved at forbinde to ledninger i den fra strømkilden.
Nødvendige komponenter:
- PIC Microcontroller PIC18F2520 -1
- Fabrikeret printkort -1
- USB-stik -1
- 2-polet terminalstik (valgfri) -1
- Fælles anode syv segment display (4 i 1) -1
- BC557 Transistor -4
- 1k modstand -6
- 2k modstand -1
- 100R modstand -8
- 1000uF kondensator -1
- 10uF kondensator -1
- 28-pin IC-base -1
- kvindelige burgsticks -1
- 7805 Spændingsregulator -1
- Bil USB-oplader -1
- LED -1
- Zener-diode 5.1 v -2
- USB-kabel (B-type eller Arduino UNO-kompatibel) -1
- 20MHz krystal -1
- 33pF kondensator -2
Beskrivelse:
Generelt er det ikke vigtigt at måle bilens batteristrøm hver gang, men vi har ofte brug for at vide om batterispændingen under opladning for at kontrollere, om den oplades eller ej. Ved dette kan vi beskytte batterisvigt på grund af det defekte opladningssystem. Spændingen på et 12v bilbatteri under opladning er ca. 13,7v. Så vi kan identificere, om vores batteri lader godt eller ej, og kan undersøge årsagerne til batterisvigt. I dette projekt skal vi implementere en spændingsmåler til bilbatteri ved hjælp af en PIC-mikrocontroller. Car Cigarette Lighter eller Car USB-oplader bruges til at få batterispændingen til ADC-stiften på mikrokontrolleren ved hjælp af Voltage Divider Circuit. Derefter et 4-cifret syv segment displaybruges til at vise batteriets spændingsværdi. Dette kredsløb kan måle spændingen op til 15v.
Når et bilbatteri oplades, kommer spændingen på tværs af batteripolerne faktisk fra generatoren / ensretteren, derfor læser systemet 13,7 volt. Men når batteriet ikke oplades, eller bilens motor ikke er tændt, er spændingen over batteriets terminal faktisk batterispænding omkring 12v.
Vi kan også bruge det samme kredsløb til måling af spændingen fra andre strømkilder op til 15v. Til dette formål har vi loddet terminalblokken (grøn farveblok i plast) i print, hvor du kan forbinde to ledninger fra strømkilden og kan overvåge spændingen. Tjek videoen i slutningen, hvor blev vi demonstreret ved at måle spændingen på en variabel strømforsyning, en USB-strømbank og en 12V AC-DC-adapter. Kontroller også Simple Battery Monitor Circuit og 12v Battery Charger Circuit.
Kredsløbsdiagram og arbejdsforklaring:
I dette batterispændingsovervågningskredsløb har vi læst bilbatterispændingen ved hjælp af en indbygget analog pin af PIC-mikrocontroller, og her har vi valgt pin AN0 (28) pin af mikrocontroller gennem et spændingsdelerkredsløb. En zenerdiode på 5,1 v bruges også til beskyttelse.
4 i 1 syv segment display bruges til at vise den øjeblikkelige værdi af bilbatterispænding, der er forbundet ved PORTB og PORTC på mikrocontrolleren. En 5v spændingsregulator, nemlig LM7805, bruges til at drive hele kredsløbet inklusive syv segmentskærme. En 20 MHz krystaloscillator bruges til at ur mikrokontrolleren. Kredsløbet drives af selve USB-billaderen ved hjælp af en LM7805. Vi har tilføjet en USB-port i printkortet, så vi kan tilslutte bilens USB-oplader direkte til kredsløbet.
USB-biloplader eller cigarettænder giver 5v reguleret forsyning fra bilens 12v-stikkontakt, men vi er nødt til at måle den faktiske spænding på bilbatteriet, så vi har justeret billaderen. Du skal åbne bilens USB-oplader og derefter finde terminalerne 5v (output) og 12v (input) og derefter fjerne 5v-forbindelsen ved at gnide den med sandpapir eller med en hård ting og kortslut USB-outputterminalen til 12v direkte. Åbn først 5v-forbindelsen fra USB-porten i bilens USB-oplader og tilslut derefter 12v til USB-porten, hvor 5v var tilsluttet. Som vist i nedenstående figur har vi skåret den røde cirkelforbindelse, den kan variere i din billader.
For at konfigurere ADC her har vi valgt analog pin AN0 med en intern referencespænding på 5v og f / 32-ur til ADC-konvertering.
For at beregne bilbatterispænding ud fra ADC-værdien har vi brugt en formel:
Spænding = (ADC-værdi / modstandsfaktor) * reference Spænding Hvor: ADC-værdi = udgang fra spændingsdeler (konverteret til digital af mikrocontroller) Modstandsfaktor = 1023,0 / (R2 / R1 + R2) // 1023 er maks. ADC-værdi (10- bit) Reference spænding = 5 volt // intern 5v reference valgt
Modstandsfaktorberegning:
I dette projekt læser vi bilbatterispænding, der (generelt) er omkring 12v-14v. Så vi har udført dette projekt forudsat at max 15v betyder, at dette system kan læses max op til 15v.
Så i kredsløbet har vi brugt R1 og R2 modstand i spændingsdeler del og værdier er:
R1 = 2K
R2 = 1K
Modstandsfaktor = 1023,0 * (1000/2000 + 1000)
Modstandsfaktor = 1023,0 * (1/3)
Modstandsfaktor = 341,0 for op til 15 volt
Så den endelige formel til spændingsberegning vil være som følger, som vi har brugt koden, givet i slutningen af denne artikel:
Spænding = (ADC-værdi / 341,0) * 5,0
Kredsløb og printkortdesign ved hjælp af EasyEDA:
Til at designe et kredsløb til bilbatterispændingsmonitor har vi brugt EasyEDA, som er et gratis online EDA-værktøj til at skabe kredsløb og PCB'er på en problemfri måde. Vi har tidligere bestilt få PCB'er fra EasyEDA og bruger stadig deres tjenester, da vi fandt hele processen, fra at tegne kredsløbene til bestilling af PCB'erne, mere praktisk og effektiv i sammenligning med andre PCB-fabrikanter. EasyEDA tilbyder kredsløbstegning, simulering, PCB-design gratis og tilbyder også høj kvalitet, men lav pris Tilpasset PCB-service. Tjek her den komplette vejledning om, hvordan du bruger Easy EDA til fremstilling af skemaer, printkortlayouter, simulering af kredsløb osv.
EasyEDA forbedrer dag for dag; de har tilføjet mange nye funktioner og forbedret den samlede brugeroplevelse, hvilket gør EasyEDA nemmere og anvendelig til design af kredsløb. De vil snart lancere sin Desktop-version, som kan downloades og installeres på din computer til offline brug.
I EasyEDA kan du offentliggøre dit kredsløbs- og printkortdesign offentligt, så andre brugere kan kopiere eller redigere dem og drage fordel af derfra. Vi har også offentliggjort hele vores kredsløbs- og printkortlayout til denne bilbatterispændingsmonitor, se nedenstående link:
easyeda.com/circuitdigest/PIC_based_Car_Battery_Monitoring_System-63c2d5948eaa48c5bcbbd8db49a6c776
Nedenfor er øjebliksbillede af øverste lag af printkortlayout fra EasyEDA, du kan se ethvert lag (top, bund, topsilk, bundmælk osv.) På printkortet ved at vælge laget fra vinduet 'Lag'.
Beregning og bestilling af PCB-prøver online:
Når du er færdig med designet af PCB, kan du klikke på ikonet for Fabrication-output , som fører dig til PCB-ordresiden. Her kan du se din PCB i Gerber Viewer eller downloade Gerber-filer på din PCB og sende dem til enhver producent, det er også meget nemmere (og billigere) at bestille det direkte i EasyEDA. Her kan du vælge antallet af printkort, du vil bestille, hvor mange kobberlag du har brug for, printkorttykkelsen, kobbervægten og endda printkortfarven. Når du har valgt alle mulighederne, skal du klikke på "Gem i indkøbskurv" og gennemføre din ordre, så får du dine printkort et par dage senere.
Du kan bestille dette printkort direkte eller downloade Gerber-filen ved hjælp af dette link.
Efter få dage med bestilling af printkort fik jeg printkortprøverne
Efter at have fået printkortene har jeg monteret alle de nødvendige komponenter over printkortet, og til sidst har vi vores bilbatteriovervågningssystem klar, kontroller dette kredsløb ved at arbejde i video givet i slutningen.
Programmeringsforklaring:
Programmet for dette projekt er lidt vanskeligt for begyndere. For at skrive denne kode har vi brug for nogle headerfiler. Her bruger vi MPLAB X IDE til kodning og XC compiler til at opbygge og kompilere koden. Koden er skrevet på C-sprog.
I denne kode har vi aflæst batterispænding ved hjælp af en analog pin og til at styre eller sende data til 4-cifret syv segment display har vi brugt Timer Interrupt Server Routine i PIC mikrocontroller. Al beregning for spændingsmåling foretages i hovedprogramrutinen.
Først i koden har vi inkluderet en header og derefter konfigureret PIC-mikrocontroller ved hjælp af konfigurationsbits.
#omfatte
Og derefter erklærede variabler og definerede ben til syv segmentvisninger
usigneret int counter2; usigneret char-position = 0; usigneret char k = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; int ciffer1 = 0, ciffer2 = 0, ciffer3 = 0, ciffer4 = 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_led2 TRISAbits.TRISA5 #define TRIS_led3 TRISAbits.TRISA0 #define TRIS_led4 TRISAbits.TRISA1 #define TRIS_led5 TRISAbits.TRISA………………
Nu har vi oprettet en timer-afbrydelsesrutine til kørsel af syv segmentvisning:
ugyldig afbryde lavprioritet LowIsr (ugyldig) {hvis (TMR0IF == 1) {tæller2 ++; hvis (tæller2> = 1) {hvis (position == 0) {seg1 = 0; seg2 = 1; seg3 = 1; seg4 = 1;………………
Nu i ugyldig hovedfunktion () har vi initialiseret timer og afbrydelse.
GIE = 1; // GLOBLE INTRRUPT AKTIV PEIE = 1; // perifert intrupt flag T0CON = 0b000000000; // prescaler-værdi sæt TMR0IE = 1; // afbryd aktivering TMR0IP = 0; // afbryde prioritet TMR0 = 55536; // starttæller efter denne værdi TMR0ON = 1;
Og så i løbet af en løkke læser vi analog input ved den analoge pin og kalder en eller anden funktion til beregninger.
mens (1) {adc_init (); for (i = 0; i <40; i ++) {Værdi = adc_værdi (); adcValue + = værdi; } adcValue = (float) adcValue / 40.0; konvertere (adcValue); forsinkelse (100); }
Den givne adc_init () - funktion bruges til at initialisere ADC
ugyldig adc_init () {ADCON0 = 0b00000011; // vælg ADC-kanal ADCON1 = 0b00001110; // vælg analog og digital i / p ADCON2 = 0b10001010; // eqisation time holding cap time ADON = 1; }
Givet adc_value- funktion bruges til at læse input fra den analoge pin og beregne spænding.
flyde adc_value (ugyldig) {float adc_data = 0; mens (GO / DONE == 1); // højere bit data start konvertering adc værdi adc_data = (ADRESL) + (ADRESH << 8); // Gem 10-bit output adc_data = ((adc_data / 342.0) * 5.0); returner adc_data; }
Og en given konverteringsfunktion bruges til at konvertere spændingsværdi til segmentunderstøttede værdier.
ugyldig konvertering (flyde f) {int d = (f * 100); ciffer1 = d% 10; d = d / 10; ciffer2 = d% 10; d = d / 10; ciffer3 = d% 10; digit4 = d / 10; }
Tjek den komplette kode for dette projekt nedenfor med en demonstrationsvideo.