Operácie

Simulátor sústavy 1. rádu

Zo stránky SensorWiki

Záverečný projekt predmetu MIPS / LS2026 - Matúš Prokop


Zadanie

Mojou úlohou bolo vytvoriť program pracujúci v reálnom čase simulujúci systém Y(s)/U(s)=K/(s*T+1), K=1 [-] a T = 0,5 [sek]. Na vykreslenie priebehu použite SerialPlot. Rozsahy u(t) a y(t) sú 0 až 5V. Rozlíšenie 0.01V. Vykreslite prechodovú charakteristiku odpovedajúcu vstupnej hodnote 2.00V. Použite celočíselnú aritmetiku.

Vývojová doska ACROB.

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.

Celkový pohľad na zariadenie.

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.

Schéma zapojenia.


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...


<syntaxhighlight lang="c++" style="background: LightYellow;">
  1. define F_CPU 16000000UL
  2. define BAUD 9600
  1. include <avr/io.h>
  2. include <avr/interrupt.h>
  3. include <stdint.h>
  4. include <stdio.h>
  1. include "uart.h"
  1. define U 200 // vstup 2.00 V
  2. define SCALE 1000L // interna mierka
  1. define TIMER_OCR 155 // Timer 10 ms

volatile uint8_t timer = 0; uint8_t counter = 0; // pocitadlo

int32_t y_s = 0; // vystup systemu

// Timer - 10 ms static void timer_init(void) {

   TCCR2A = (1 << WGM21); // vynulovanie casovaca 
   TCCR2B = (1 << CS22) | (1 << CS21) | (1 << CS20); // prescaler 1024 
   OCR2A = TIMER_OCR; // porovnavacia hodnota 
   TIMSK2 = (1 << OCIE2A); // povolenie prerusenia 

}

ISR(TIMER2_COMPA_vect) {

   timer = 1; // vystup casovaca

}

// Simulacia systemu 1. radu static uint16_t filter_step(uint16_t u) {

   y_s += ((int32_t)u * SCALE - y_s) / 10; // rovnica pre vypocet
   uint16_t y = (uint16_t)((y_s + SCALE / 2) / SCALE); // prevod na centivolty
   return y;

}

int main(void) {

   uart_init();
   timer_init();
   sei(); // globalne povolenie preruseni

char buf [20];

   while (1)
   {
       if (timer)
       {
           timer = 0;

counter ++;

if (counter>=5) // simulacia sa vyhodnocuje kazdych 50ms {

counter = 0;

           uint16_t y = filter_step(U); // simulacia systemu
           // Formatovanie vystupu pre SerialPlot 
           snprintf(buf,sizeof(buf),"%u,%u\n",U,y);

uart_puts(buf); // odoslanie cez UART }

       }
   }
   return 0;

}

</source >
<syntaxhighlight lang="c++" style="background: LightYellow;">
  1. define F_CPU 16000000UL
  2. define BAUD 9600
  3. include <avr/io.h>
  4. include <util/setbaud.h>
  1. include "uart.h"


void uart_init( void ) {

   UBRR0H = UBRRH_VALUE;
   UBRR0L = UBRRL_VALUE;
  1. if USE_2X
   UCSR0A |= _BV(U2X0);
  1. else
   UCSR0A &= ~(_BV(U2X0));
  1. endif
   UCSR0C = _BV(UCSZ01) | _BV(UCSZ00); /* 8-bit data */
   UCSR0B = _BV(RXEN0) | _BV(TXEN0);   /* Enable RX and TX */

}


void uart_putc(char c) {

  loop_until_bit_is_set(UCSR0A, UDRE0); /* Wait until data register empty. */
  UDR0 = c;

}


void uart_puts(const char *s) { while(*s) { uart_putc(*s); s++; } }

char uart_getc(void) {

   loop_until_bit_is_set(UCSR0A, RXC0); /* Wait until data exists. */
   return UDR0;

}

</source >
<syntaxhighlight lang="c++" style="background: LightYellow;">
  1. ifndef UART_H_
  2. define UART_H_
  3. define F_CPU 16000000UL
  4. define BAUD 9600

void uart_init( void );

void uart_putc( char c ); void uart_puts( const char *s );

char uart_getc( void );

  1. endif /* UART_H_ */
</source >

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: