Jednoduchý P regulátor: Rozdiel medzi revíziami
Zo stránky SensorWiki
| Riadok 55: | Riadok 55: | ||
return(0); | return(0); | ||
} | |||
</syntaxhighlight ></tab> | |||
<tab name="main.c"><syntaxhighlight lang="c++" style="background: LightYellow;"> | |||
#include <avr/io.h> | |||
#include <avr/io.h> | |||
#include <util/delay.h> | |||
#include <stdio.h> | |||
#include "uart.h" | |||
#include "lcd.h" | |||
#include "adc.h" | |||
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE); | |||
#define TEXT "DARIIA" // zobrazovaný text | |||
#define TEXT_LEN 6 // dĺžka textu | |||
#define MAX_COL 10 // maximálna pozícia kurzora | |||
int main(void) | |||
{ | |||
uart_init(); // inicializácia UART | |||
stdout = &mystdout; | |||
lcd_init(); // inicializácia LCD displeja | |||
lcd_bklt(1); // zapnutie podsvietenia | |||
adc_init(); // inicializácia ADC | |||
int last_pos = -1; // posledná pozícia textu | |||
while(1) | |||
{ | |||
// načítanie hodnoty z potenciometra (priemer 5 meraní) | |||
unsigned int val = 0; | |||
for (uint8_t i = 0; i < 5; i++) { | |||
val += adc_read(4); // čítanie ADC kanála 4 | |||
_delay_ms(5); | |||
} | |||
val /= 5; // výpočet priemeru | |||
// mŕtva zóna — stabilizácia pri krajnej polohe | |||
if (val > 1000) val = 1023; | |||
// prepočet hodnoty ADC na pozíciu kurzora (0 - 10) | |||
int pos = ((1023 - val) * MAX_COL) / 1023; | |||
// aktualizácia displeja len pri zmene pozície | |||
if (pos != last_pos) | |||
{ | |||
lcd_clearline(1); // vymazanie riadku | |||
_delay_ms(2); // krátka pauza po vymazaní | |||
lcd_setCursor(1, pos); // nastavenie kurzora na novú pozíciu | |||
lcd_puts(TEXT); // vypísanie textu | |||
last_pos = pos; // uloženie aktuálnej pozície | |||
} | |||
_delay_ms(150); // pauza pred ďalším cyklom | |||
} | |||
return 0; | |||
} | } | ||
Verzia z 20:11, 5. jún 2026
Záverečný projekt predmetu MIPS / LS2026 - Dariia Dordiai
Zadanie
Cieľom projektu je zobraziť text na LCD displeji EA-DOGM163, ktorý je pripojený k vývojovej doske ACROB s mikrokontrolérom ATmega328P. Text je možné posúvať vľavo a vpravo po riadku displeja pomocou potenciometra. Poloha potenciometra je snímaná analógovo-digitálnym prevodníkom (ADC) a prepočítaná na pozíciu kurzora na displeji. Program umožňuje zobraziť ľubovoľný text.

Literatúra:
Analýza a opis riešenia
Systém sa skladá z dvoch hlavných častí: vývojovej dosky ACROB s mikrokontrolérom ATmega328P a rozširujúceho modulu s LCD displejom EA-DOGM163. Externe je pripojená ovládacia krabička s potenciometrom, ktorá je k doske prepojená páskowym káblom. Otočením potenciometra sa mení napätie na analógovom vstupe, ktoré mikrokontrolér prevedie na pozíciu textu a zobrazí ho na displeji.

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.

Použité komponenty
Vývojová doska ACROB — doska postavená okolo mikrokontroléra ATmega328P.
LCD modul EA-DOGM163 — rozširujúci modul pre dosku ACROB s displejom 3×16 znakov, oranžovým podsvietením, troma tlačidlami a jednou LED diódou.
Potenciometer — externý otočný potenciometer umiestnený v krabičke so stupnicou 0–10. Slúži ako vstupné zariadenie pre nastavenie polohy textu. Prepojený s doskou páskowym káblom.
Algoritmus a program
Program je napísaný v jazyku C pre mikrokontrolér ATmega328P. Po inicializácii UART, LCD displeja a ADC vstupuje program do nekonečnej slučky. V každom cykle sa načíta hodnota z potenciometra. Aby sa eliminoval šum, meranie sa opakuje päťkrát s prestávkou 5 ms a výsledok sa spriemeruje. Ak je výsledná hodnota väčšia ako 1000, automaticky sa zaokrúhli na 1023 — táto mŕtva zóna zabraňuje chveniu textu pri krajnej polohe potenciometra. Hodnota ADC sa prepočíta na pozíciu kurzora v rozsahu 0–10 podľa vzorca: pos = ((1023 - val) × MAX_COL) / 1023 Text sa prepíše na displej len vtedy, keď sa pozícia zmení oproti predchádzajúcemu cyklu. Tým sa predchádza zbytočnému blikaniu displeja. Riadok sa najprv vymaže funkciou lcd_clearline(), následne sa nastaví kurzor na novú pozíciu a vypíše sa text pomocou lcd_puts().
#include <avr/io.h>
int main(void)
{
unsigned int measuredValue;
while (1)
{
/* relax */
}
return(0);
}
#include <avr/io.h>
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include "uart.h"
#include "lcd.h"
#include "adc.h"
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
#define TEXT "DARIIA" // zobrazovaný text
#define TEXT_LEN 6 // dĺžka textu
#define MAX_COL 10 // maximálna pozícia kurzora
int main(void)
{
uart_init(); // inicializácia UART
stdout = &mystdout;
lcd_init(); // inicializácia LCD displeja
lcd_bklt(1); // zapnutie podsvietenia
adc_init(); // inicializácia ADC
int last_pos = -1; // posledná pozícia textu
while(1)
{
// načítanie hodnoty z potenciometra (priemer 5 meraní)
unsigned int val = 0;
for (uint8_t i = 0; i < 5; i++) {
val += adc_read(4); // čítanie ADC kanála 4
_delay_ms(5);
}
val /= 5; // výpočet priemeru
// mŕtva zóna — stabilizácia pri krajnej polohe
if (val > 1000) val = 1023;
// prepočet hodnoty ADC na pozíciu kurzora (0 - 10)
int pos = ((1023 - val) * MAX_COL) / 1023;
// aktualizácia displeja len pri zmene pozície
if (pos != last_pos)
{
lcd_clearline(1); // vymazanie riadku
_delay_ms(2); // krátka pauza po vymazaní
lcd_setCursor(1, pos); // nastavenie kurzora na novú pozíciu
lcd_puts(TEXT); // vypísanie textu
last_pos = pos; // uloženie aktuálnej pozície
}
_delay_ms(150); // pauza pred ďalším cyklom
}
return 0;
}
#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
Funkčnosť zariadenia bola overená manuálnym testovaním. Po zapnutí napájania sa na LCD displeji zobrazí text na predvolenej pozícii. Otočením potenciometra vľavo sa text posúva smerom doľava, otočením vpravo sa posúva doprava. Text sa aktualizuje plynule a bez blikania. Overenie prebehlo úspešne — text sa zobrazuje správne na všetkých pozíciách v rozsahu 0–10 a zariadenie reaguje na zmenu polohy potenciometra bez oneskorenia.

Video:
Čo by som urobila inak
Do budúcna by som implementovala plynulejší pohyb textu pomocou prerušení namiesto oneskorení _delay_ms(). Použitie časovača s prerušením by umožnilo presnejšie časovanie a mikrokontrolér by mohol počas čakania vykonávať iné úlohy.
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.