Operácie

Generovanie kódu z prostredia Matlaba/Simulink: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
StudentMIPS (diskusia | príspevky)
Riadok 21: Riadok 21:
1. Spojitý model
1. Spojitý model


• Prenosová funkcia prvého rádu je G(s)=1/(0,5*s+1), čo znamená, že pri skoku vstupu sa výstup exponenciálne približuje k cieľovej hodnote s časovou konštantou T = 0,5 s.
  • Prenosová funkcia prvého rádu je G(s)=1/(0,5*s+1), čo znamená, že pri skoku vstupu sa výstup exponenciálne približuje k cieľovej hodnote s časovou konštantou T = 0,5 s.


2. Prečo digitálny filter
2. Prečo digitálny filter


• Mikrokontrolér ATmega328P pracuje v diskrétnom čase a vyžaduje digitálne spracovanie signálu.
  • Mikrokontrolér ATmega328P pracuje v diskrétnom čase a vyžaduje digitálne spracovanie signálu.


• ADC prevádza analógový signál na čísla, následný filter sa implementuje v kóde ako rozdielová rovnica.
  • ADC prevádza analógový signál na čísla, následný filter sa implementuje v kóde ako rozdielová rovnica.


3. Diskretizácia (ZOH)
3. Diskretizácia (ZOH)


• Pri vzorkovacom čase Ts = 0,01 [s]: a = exp(–Ts/T) = exp(–0,01/0,5) ≈ 0,98; b = 1 – a ≈ 0,02.
  • Pri vzorkovacom čase Ts = 0,01 [s]: a = exp(–Ts/T) = exp(–0,01/0,5) ≈ 0,98; b = 1 – a ≈ 0,02.


• Rovnica v diskrétnej podobe: y[n] = 0,98*y[n–1] + 0,02*u[n].
  • Rovnica v diskrétnej podobe: y[n] = 0,98*y[n–1] + 0,02*u[n].


4. Integer aproximácia
4. Integer aproximácia


• Pre rýchle a efektívne výpočty na AVR používame celočíselný zápis: K1 = 98, K2 = 2, deliteľ = 100.
  • Pre rýchle a efektívne výpočty na AVR používame celočíselný zápis: K1 = 98, K2 = 2, deliteľ = 100.


• Riešenie: y[n] = (98*y[n–1] + 2*u[n]) / 100.
  • Riešenie: y[n] = (98*y[n–1] + 2*u[n]) / 100.


5. Mapovanie ADC signálu
5. Mapovanie ADC signálu


• ADC hodnota 0–1023 zodpovedá 0–5 V.
  • ADC hodnota 0–1023 zodpovedá 0–5 V.


• Pre zobrazenie v stotinách voltu: volt = (adc_val * 500) / 1023, výsledok 0–500.
  • Pre zobrazenie v stotinách voltu: volt = (adc_val * 500) / 1023, výsledok 0–500.


6. Model v MATLAB/Simulink
6. Model v MATLAB/Simulink

Verzia z 16:10, 12. jún 2025

Záverečný projekt predmetu MIPS / LS2025 - Meno Priezvisko


Zadanie

Na platforme Arduino Uno R3 (ATmega328P) implementovať diskrétny filter prvého rádu so spojitou prenosovou funkciou G(s)=K/(T*s+1), K=1[-], T=0,5 [s], so vzorkovacím časom Ts=0,01. Vstupom je jednorazový skok napätia z 0 V na 2,00 V (potenciometer na A0). Výstup má byť v celočíselnej aritmetike (integer), formátovaný ako text "x.yy\n" a odoslaný cez UART0 (115200 Bd). Grafické zobrazenie prechodovej charakteristiky sa vykoná v SerialPlot.

Vývojová doska ACROB.

Literatúra:


Analýza a opis riešenia

V tejto časti popíšeme, prečo a ako sme diskrétny filter navrhli, od spojitého modelu až po finálnu integer implementáciu.

1. Spojitý model

 •	Prenosová funkcia prvého rádu je G(s)=1/(0,5*s+1), čo znamená, že pri skoku vstupu sa výstup exponenciálne približuje k cieľovej hodnote s časovou konštantou T = 0,5 s.

2. Prečo digitálny filter

 •	Mikrokontrolér ATmega328P pracuje v diskrétnom čase a vyžaduje digitálne spracovanie signálu.
 •	ADC prevádza analógový signál na čísla, následný filter sa implementuje v kóde ako rozdielová rovnica.

3. Diskretizácia (ZOH)

 •	Pri vzorkovacom čase Ts = 0,01 [s]: a = exp(–Ts/T) = exp(–0,01/0,5) ≈ 0,98; b = 1 – a ≈ 0,02.
 •	Rovnica v diskrétnej podobe: y[n] = 0,98*y[n–1] + 0,02*u[n].

4. Integer aproximácia

 •	Pre rýchle a efektívne výpočty na AVR používame celočíselný zápis: K1 = 98, K2 = 2, deliteľ = 100.
 •	Riešenie: y[n] = (98*y[n–1] + 2*u[n]) / 100.

5. Mapovanie ADC signálu

 •	ADC hodnota 0–1023 zodpovedá 0–5 V.
 •	Pre zobrazenie v stotinách voltu: volt = (adc_val * 500) / 1023, výsledok 0–500.

6. Model v MATLAB/Simulink

Nižšie je zobrazená schéma, ktorú sme vytvorili v Simulinku na simuláciu diskrétneho filtra (vstup , výstup ):

Simulink zapojenie.

Vo vnútri bloku simulink sa nachádza MATLAB Function s implementáciou v integer aritmetike:

function y = simulink(u)

%#codegen

  persistent y_prev

  if isempty(y_prev)

    y_prev = int32(0);

  end

  % y[n] = (98*y_prev + 2*u) / 100

  y = (98*y_prev + 2*int32(u)) / 100;

  y_prev = y;

end

Tento model sme generátorom kódu premenili na C-knihovne simulink.c a simulink.h.

Algoritmus a program

Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto... Výpis kódu je nižšie...


#include <avr/io.h>

int main(void)
{
  unsigned int measuredValue;

  while (1)
  {
    /*  relax  */  
  }

  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

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:



Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.