Záverečný projekt predmetu MIPS / LS2026 - Dariia Svystak
Zadanie
Implementácia funkcie map()] V prostredí ArduinoIde máme možnosť použiť funkciu map(). Prepíšte túto funkciu tak, aby sme napätie merané v rozsahu 0 až 5V pomocou 10 b-ého A/D prevodníka vedeli zobraziť s presnosťou na „0,01V“. Použite celočíselnú aritmetiku. Výstup A/D prevodníkom filtrujte pomocou filtra kĺzavého priemeru – priemer s 8, resp. 16 vzoriek.
A/D prevodník je 10-bitový, preto vracia hodnoty v rozsahu 0 až 1023. Túto hodnotu program najprv filtruje pomocou kĺzavého priemeru z 8 alebo 16 vzoriek.
Následne sa hodnota prepočíta pomocou vlastnej funkcie map(). Funkcia prepočítava interval 0 až 1023 na interval 0 až 500. Hodnota 500 predstavuje 5,00 V, pretože napätie je v programe uložené v stotinách voltu. Vďaka tomu je možné vypísať napätie s presnosťou 0,01 V bez použitia typu float.
Potenciometer je zapojený ako delič napätia. Krajné vývody sú pripojené na VCC a GND, stredný vývod je pripojený na analógový vstup ADC4 mikrokontroléra ATmega328P.
Schéma zapojenia.
Na meranie napätia bol použitý laboratórny modul s potenciometrom, ktorý bol pripojený k vývojovej doske. V programe sa využíva iba výstup z potenciometra, preto je v schéme zapojenia znázornený len potenciometer. Ostatné prvky modulu použité neboli. Pri otáčaní potenciometra sa mení vstupná hodnota A/D prevodníka, ktorá sa v programe načítava z kanála ADC4.
Celkový pohľad na zariadenie.
Algoritmus a program
Na komunikáciu cez UART boli použité súbory uart.h a uart.c.
Hlavičkový súbor uart.h je pripojený v hlavnom programe a obsahuje deklarácie funkcií.
Súbor uart.c obsahuje samotnú implementáciu funkcií pre sériovú komunikáciu.
Program najprv inicializuje UART, A/D prevodník a PWM výstup. V nekonečnom cykle sa načíta hodnota z analógového vstupu ADC4. Táto hodnota sa upraví pomocou filtra kĺzavého priemeru a potom sa pomocou funkcie map() prepočíta na napätie.
Počet vzoriek filtra sa nastavuje pomocou konštanty:
#define POCET_VZORIEK 16
Ak chceme použiť priemer z 8 vzoriek, stačí zmeniť túto konštantu na:
define POCET_VZORIEK 8
V programe bol použitý priemer zo 16 vzoriek, pretože pri väčšom počte vzoriek je výsledná hodnota stabilnejšia a menej citlivá na malé náhodné odchýlky merania.
Výsledok sa vypisuje cez UART vo formáte:
ADC = hodnota, U = x.xx V
Celá časť napätia sa získa delením hodnoty napatie / 100 a desatinná časť pomocou napatie % 100.
Hodnota z A/D prevodníka sa zároveň používa aj na nastavenie PWM výstupu:
OCR0A = hodnota / 4;
Delenie číslom 4 je použité preto, že A/D prevodník má rozsah 0 až 1023, ale PWM register OCR0A má rozsah 0 až 255.
V programe je použitá aj úprava hodnoty v tvare 1023 - adc_read(kanal). Táto úprava bola potrebná preto, že pri zapojení potenciometra bola hodnota A/D prevodníka opačná: pri minimálnej polohe potenciometra - 1023 a pri maximálnej - 0.
Funkcia map() bola odvodená zo vzťahu pre lineárne prepočítanie hodnoty z jedného intervalu do druhého. Vstupná hodnota x je v rozsahu in_min až in_max a výstupná hodnota má byť v rozsahu out_min až out_max.
Najprv sa hodnota x posunie vzhľadom na začiatok vstupného intervalu:
x - in_min
Potom sa táto hodnota vynásobí veľkosťou výstupného intervalu:
(x - in_min) · (out_max - out_min)
Následne sa výsledok vydelí veľkosťou vstupného intervalu:
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.
Aplikácia.
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.