Monitor kapacity batérie: Rozdiel medzi revíziami
Zo stránky SensorWiki
| Riadok 30: | Riadok 30: | ||
=== Algoritmus a program === | === 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 | 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 | 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 | 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 | 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. | ||
Verzia z 11:56, 7. jún 2026
Záverečný projekt predmetu MIPS / LS2026 - Meno Priezvisko
Zadanie
Môj semestrálny projekt spočíval z vytvorenia vstavaného systému s využitím mikrokontroléra ATmega328P,ktorý slúži ako trojúrovňový indikátor kapacity batérie. Systém neustále monitoruje jednosmerné napätie na analógovom vstupe pomocou integrovaného ADC prevodníka. Na základe nameranej hodnoty systém vyhodnocuje stav batérie a vizuálne ho indikuje pomocou troch LED diód:

Literatúra:
Analýza a opis riešenia
Opíšte sem čo a ako ste spravili, ak treba, doplňte obrázkami... Podrobne opíšte použité komponenty (okrem základnej dosky s ATmega328P procesorom), pridajte linky na datasheety alebo opis obvodu.

Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.

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);
}
}
#include <avr/io.h>
void adc_init(void); // A/D converter initialization
unsigned int adc_read(char a_pin);
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
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. Na konci uvádzame fotku hotového zariadenia.

Video:
Čo by som urobil inak
Zamyslite sa spätne nad problémom, ktorý ste riešili a napíšte, čo sa vám nepodarilo a nabudúce by ste spravili inak.
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.