Operácie

RC filter

Z SensorWiki

Verzia z 14:52, 5. máj 2021, ktorú vytvoril Balogh (diskusia | príspevky)

Presmerovanie 🡆 Riadenie sústavy 1. rádu‎‎


Zdrojovy kod pre AVRGCC a ARDUINO


/* **********************************************************
 *
 * Hruba kostra programu na identifikaciu parametrov RC clena
 * 
 * Odpor je pripojeny a) na niektory digitalny vystup
 *                    b) zaroven na analogovy vstup
 * Kondenzator je pripojeny na iny analogovy vstup
 * Okrem merania dvoch velicin mame premennu sysTime, ktoru 
 * kazdych 10ms inkrementujeme a tak "meriame cas".
 * Namerane udaje odosielame ako trojicu cas,input,output\n\
 * po seriovej linke rychlostou min. 19200 Bd do PC, kde si
 * hodnoty zobrazime graficky.
 *
 * Pozor: toto je len kostra, ktoru musite doplnit spravnymi
 * konfiguracnymi parametrami, aby to fungovalo! 
 *
 ************************************************************ */
 
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "uart.h"
#include "adc.h"


#define RCinput           // Digitalny (budiaci) vstup RC clena
#define vIn 	          // Analogovy vstup RC clena
#define vOut              // Analogovy vystup RC clena

unsigned volatile static int sysTime=0;


/* Prerusenie od casovaca T0 kazdych 10 ms */

ISR (TIMER0_COMPA_vect)           
{    
     sprintf(outString,"%d,%d,%d\n",sysTime, adc_read(vIn),adc_read(vOut)); 
     uart_puts(outString);	
	 sysTime++;

}
	

void timer0_init(void)  /* Mode 2: clear on CTC match */
{
	TCCR0A = 
    TCCR0B = 
	 OCR0A =             // Nastav periodu 10ms 	
	TCNT0  =             // Vynuluj pocitadlo
	TIFR0  =   			 // Clear CTC flag 	
   TIMSK0  =             // Enable Overflow Interrupt 
}	


void hw_init(void)
{
 /* tu nastavite spravne vstupy a vystupy */
}	



int main(void)
{   
   cli();                  // cez inicializaciu zakazeme prerusenia
   
   hw_init();
   uart_init(57600);       
   timer0_init();
   adc_init(); 
	
   sei(); 
   
   while(1)
    {

//     Part 1: identification of the system

		if ( sysTime == 100)          // v prvej sekunde 
           set_bit(PORTx,RCinput);    // start charge 
 		 
 		if ( timeVal == 600)          // v siestej sekunde
           clear_bit(PORTx,RCinput);  // start dischg 
 		
		if (timeVal>1000)             // po 10 sekundach STOP
		{
          cli();
		  while(1);   /* stop here forever, end of experiment */  
		}
		
        //nothing to do here, everything else is in ISR
    }
}
/* Arduino code nabuduce */


Literatúra



-->


Návrat na zoznam cvičení...