Monitor kapacity batérie
Zo stránky SensorWiki
Záverečný projekt predmetu MIPS / LS2026 - Meno Priezvisko
Zadanie
Mojím semestrálnym projektom je vytvorenie jednoduchého systému na monitorovanie stavu batérie pomocou mikrokontroléra ATmega328P. Stav batérie je určený na základe merania napätia na analógovom vstupe pomocou integrovaného ADC prevodníka.

Literatúra:
Analýza a opis riešenia
Pri realizácii projektu som využil mikrokontrolér Arduino Nano s procesorom ATmega328P, potenciometer B10k a tri LED diódy. Potenciometer som použil ako zdroj premenlivého napätia, pomocou ktorého som simuloval rôzne úrovne nabitia batérie.
Stredný vývod potenciometra som pripojil na analógový vstup A0, zatiaľ čo krajné vývody boli pripojené na napájanie 5 V a GND. Zelenú, žltú a červenú LED diódu som pripojil na digitálne piny D2, D3 a D4 cez ochranné rezistory.
Na spracovanie vstupného signálu som využil integrovaný ADC prevodník mikrokontroléra. Ten prevádza analógové napätie na číselnú hodnotu, s ktorou program ďalej pracuje. Podľa nameranej hodnoty program rozhodne, ktorá LED dióda bude aktívna. Pre vysoké hodnoty sa rozsvieti zelená LED, pre stredné žltá LED a pre nízke červená LED.

Schéma zapojenia. Potenciometer B10k je pripojený na analógový vstup A0. Jeho krajné vývody sú pripojené na zem (GND) a napájacie napätie 5 V. LED diódy sú pripojené na digitálne piny D2, D3 a D4

Použité súčiastky:






Algoritmus a program
Algoritmus programu je založený na meraní analógového napätia pomocou ADC prevodníka mikrokontroléra ATmega328P. Na začiatku programu sa volá funkcia ADC_init(), ktorá zabezpečuje inicializáciu ADC prevodníka, nastavenie referenčného napätia a aktiváciu prevodníka.
Na čítanie analógovej hodnoty zo vstupu A0 sa používa funkcia ADC_read(). Tá spustí prevod analógového signálu na digitálnu hodnotu, počká na dokončenie prevodu a vráti nameranú hodnotu ADC.
Funkcia LED_off_all() slúži na zhasnutie všetkých LED diód pred vyhodnotením aktuálneho stavu. V hlavnej slučke programu sa neustále vykonáva meranie vstupného napätia a jeho porovnanie s definovanými prahovými hodnotami. Na základe výsledku sa rozsvieti príslušná LED dióda signalizujúca stav batérie (FULL, MID alebo LOW).
Program využíva aj funkciu _delay_ms(100), ktorá vytvára krátke oneskorenie medzi jednotlivými meraniami. Celý proces sa opakuje v nekonečnej slučke while(1), čím je zabezpečené priebežné monitorovanie stavu batérie.
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
#define LED_FULL PD2 // Zelená LED
#define LED_MID PD3 // Žltá/oranžová LED
#define LED_LOW PD4 // Červená LED
#define ADC_FULL_LIMIT 778 // približne 3.8 V
#define ADC_MID_LIMIT 409 // približne 2.0 V
void ADC_init(void)
{
// Referenčné napätie AVCC = 5 V, vstup ADC0 = A0
ADMUX = (1 << REFS0);
// Zapnutie ADC, preddelička 128
ADCSRA = (1 << ADEN) |
(1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
}
uint16_t ADC_read(void)
{
// Spustenie merania
ADCSRA |= (1 << ADSC);
// Čakanie na dokončenie merania
while (ADCSRA & (1 << ADSC));
return ADC;
}
void LED_off_all(void)
{
PORTD &= ~((1 << LED_FULL) | (1 << LED_MID) | (1 << LED_LOW));
}
int main(void)
{
uint16_t adc_value;
// Nastavenie D2, D3, D4 ako výstupy
DDRD |= (1 << LED_FULL) | (1 << LED_MID) | (1 << LED_LOW);
ADC_init();
while (1)
{
adc_value = ADC_read();
LED_off_all();
if (adc_value >= ADC_FULL_LIMIT)
{
PORTD |= (1 << LED_FULL); // Full
}
else if (adc_value >= ADC_MID_LIMIT)
{
PORTD |= (1 << LED_MID); // Mid
}
else
{
PORTD |= (1 << LED_LOW); // Low
}
_delay_ms(100);
}
}
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x zdrojaky.zip:
Zdrojový kód: zdrojaky.zip
Overenie
Pri otáčaní potenciometra sa postupne prepínali jednotlivé LED diódy podľa nastavenej úrovne napätia. Tým som overil správnu funkciu ADC prevodníka aj vyhodnocovacej časti programu.

Video:
Čo by som urobil inak
Ja osobne by som doplnil ešte viac LED diód pre presnejšie zobrazenie stavu nabitia batérie. Používateľ by tak získal lepší prehľad o aktuálnom stave napätia. Ďalším zaujímavým rozšírením by bolo pridanie bzučiaka, ktorý by upozornil na veľmi nízky stav nabitia zvukovou signalizáciou.