Operácie

RC filter: Rozdiel medzi revíziami

Z SensorWiki

Riadok 1: Riadok 1:
  
'''Úloha:''' Odmerajte časový priebeh signálov pri nabíjaní kondenzátora C cez rezistor R. Z nameraného grafu určte hodnotu časovej konštanty T a spresnite hodnoty R a C.
+
'''Úloha 1:''' Odmerajte časový priebeh signálov pri nabíjaní kondenzátora C cez rezistor R. Z nameraného grafu určte hodnotu časovej konštanty T a spresnite hodnoty R a C.
  
 
Tuto je nejaky text s odkazom na literaturu o Arduine
 
<ref group="REF">[http://ARDUINO_V2.pdf Arduino UNO V3 pinout]</ref>
 
a tuto pokracuje iny text, kde chcem len uviest malu poznamku
 
<ref>Číslo portu zistíte z Device Managera.</ref>
 
  
 
Azda najjednoduchší dynamický elektrický obvod je tvorený odporom a kondenzátorom. Takýto RC člen má výrazné filtračné účinky, používa sa napríklad na vyhladenie PWM priebehov, filtráciu vysokofrekvenčných zložiek signálu, ochranu kontaktov relé a pod.
 
Azda najjednoduchší dynamický elektrický obvod je tvorený odporom a kondenzátorom. Takýto RC člen má výrazné filtračné účinky, používa sa napríklad na vyhladenie PWM priebehov, filtráciu vysokofrekvenčných zložiek signálu, ochranu kontaktov relé a pod.
Riadok 50: Riadok 45:
 
''Časové priebehy vstupného (modrá) a výstupného (červená) napätia - simulácia.''
 
''Časové priebehy vstupného (modrá) a výstupného (červená) napätia - simulácia.''
 
</div>
 
</div>
 +
 +
 +
Ako z nameraného priebehu zistíme časovú konštantu? Zabudnite na poučky o dotyčnici v počiatočnom bode...
 +
 +
Pozrime sa, na akú hodnotu stihne vystúpiť napätie za čas rovný presne jednej časovej konštante. Ak do funkcie pre priebeh výstupného napätia dosadíme za čas  <math>t = T</math>, dostaneme
 +
 +
<div style='text-align: center;'><math>
 +
  u_{out}(T) = U_{0} K (1-e^{-T/T})  = U_{0} K (1-e^{-1})  = 0,632 U_{0} K
 +
</math></div>
 +
 +
teda na 63,2% z ustálenej hodnoty. To vieme vypočítať celkom presne, je to 0,632*5 = 3,16 V.
 +
Ak teda nájdenme na grafe hodnotu napätia  3,16 V, na časovej osi tomu zodpovedajúci čas je priamo hodnota T. Na obrázku vyššie je tento čas 2 sekundy, ale keďže skoková zmena na vstupe nastala v čase 1 sekunda, hodnota časovek konštanty je 2-1 = 1 sekunda.
 +
 +
No a presne to treba spraviť aj pomocou vášho mikropočítača. Aby sme merania vedeli priradiť k reálnemu času, potrebujeme merania robiť s nejakou presnou periódou vzorkovania. Na to nám poslúži celkom dobre počítadlo T0, ktoré každých 10 ms vyvolá prerušenie. Takáto presnosť nám postačí. V obsluhe prerušenia zmeriame hodnotu napätia a pošleme ju po sériovej linke do PC, kde ju potom graficky znázorníme. Dobré bude, keď okrem napätia na kondenzátore budeme merať aj napätie na vstupe, aspoň uvidíme aká je jeho reálna hodnota (pomôcka: nebude to 5,0 V). Okrem toho by sme k týmto dvom hodnotám mali priradiť aj časový údaj. Na to si spravíme jednoduchú premennú, ktorú v každom prerušení inkrementujeme.
 +
 +
Z teoretickej analýzy vieme odhadnúť, že na celé meranie nám bude stačiť 10 sekúnd a preto po ich uplynutí meranie ukončíme, aby sme graf nemuseli zastavovať na PC odadom od ruky.
 +
 +
 +
 +
 +
Tuto je nejaky text s odkazom na literaturu o Arduine
 +
<ref group="REF">[http://ARDUINO_V2.pdf Arduino UNO V3 pinout]</ref>
 +
a tuto pokracuje iny text, kde chcem len uviest malu poznamku
 +
<ref>Číslo portu zistíte z Device Managera.</ref>
  
  
Riadok 57: Riadok 76:
 
<tabs>
 
<tabs>
 
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
 
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
 +
/* **********************************************************
 +
*
 +
* 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
  
#include <avr/io.h>
+
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
 +
    }
 +
}
  
 
</source></tab>
 
</source></tab>
 
<tab name="Arduino code"><source lang="arduino" style="background: #9dd1e1;">
 
<tab name="Arduino code"><source lang="arduino" style="background: #9dd1e1;">
  
/* Arduino code */
+
/* Arduino code nabuduce */
  
 
</source></tab>
 
</source></tab>

Verzia zo dňa a času 09:40, 4. máj 2021

Úloha 1: Odmerajte časový priebeh signálov pri nabíjaní kondenzátora C cez rezistor R. Z nameraného grafu určte hodnotu časovej konštanty T a spresnite hodnoty R a C.


Azda najjednoduchší dynamický elektrický obvod je tvorený odporom a kondenzátorom. Takýto RC člen má výrazné filtračné účinky, používa sa napríklad na vyhladenie PWM priebehov, filtráciu vysokofrekvenčných zložiek signálu, ochranu kontaktov relé a pod.

RC-modul.jpgRC-schema1.png
Komerčný modul na ochranu kontaktov relé a jeho schéma zapojenia (RC obvod).

Schému zapojenia doplníme o označenie vstupných a výstupných signálov. Bude nás zaujímať, aký je presný priebeh napätia na kondenzátore C, ak náhle pripojíme na vstup napájacie napätie 5 Voltov. Je zrejmé, že kondenzátor sa bude nabíjať a že rýchlosť nabíjania bude závisieť od veľkosti rezistora R. Čim vyššia bude hodnota odporu, tým menší bude nabíjací prúd a tým dlhšie sa bude kondenzátor nabíjať. Podobná situácia bude platiť aj pre vybíjanie. Ale aký bude presný tvar nabíjacej krivky?

RC-schema2.png
Jednoduchý RC obvod s doplneným označením veličín.

V elektrickom obvode podľa obrázku podľa Kirchoffovho zákona platí, že súčet napätí v uzavretej slučke je nulový:


  u_{in}(t) - R i(t) - u_{out}(t) = 0,

kde i(t) je prúd v slučke a R je odpor rezistora, pričom pre výstupné napätie u_{out} ďalej platí


  u_{out}(t) = \frac{1}{C} \int_{0}^{t} i(t) dt,

kde C je kapacita kondenzátora.


Po zohľadnení počiatočných podmienok dostaneme riešením diferenciálnej rovnice pre skokovú zmenu vstupného napätia u_{in} z hodnoty 0 na U_0 v čase t=0 nasledovný priebeh výstupného napätia u_{out}:


   u_{out}(t) = U_{0} K (1-e^{-t/T})

kde K=1 je tzv. zosilnenie obvodu a T = RC je tzv. časová konštanta. Jej veľkosť určuje tvar a rýchlosť nabíjacej/vyníjacej krivky kondenzátora.


RC-simulaciaT.png
Časové priebehy vstupného (modrá) a výstupného (červená) napätia - simulácia.


Ako z nameraného priebehu zistíme časovú konštantu? Zabudnite na poučky o dotyčnici v počiatočnom bode...

Pozrime sa, na akú hodnotu stihne vystúpiť napätie za čas rovný presne jednej časovej konštante. Ak do funkcie pre priebeh výstupného napätia dosadíme za čas t = T, dostaneme


   u_{out}(T) = U_{0} K (1-e^{-T/T})  = U_{0} K (1-e^{-1})  = 0,632 U_{0} K

teda na 63,2% z ustálenej hodnoty. To vieme vypočítať celkom presne, je to 0,632*5 = 3,16 V. Ak teda nájdenme na grafe hodnotu napätia 3,16 V, na časovej osi tomu zodpovedajúci čas je priamo hodnota T. Na obrázku vyššie je tento čas 2 sekundy, ale keďže skoková zmena na vstupe nastala v čase 1 sekunda, hodnota časovek konštanty je 2-1 = 1 sekunda.

No a presne to treba spraviť aj pomocou vášho mikropočítača. Aby sme merania vedeli priradiť k reálnemu času, potrebujeme merania robiť s nejakou presnou periódou vzorkovania. Na to nám poslúži celkom dobre počítadlo T0, ktoré každých 10 ms vyvolá prerušenie. Takáto presnosť nám postačí. V obsluhe prerušenia zmeriame hodnotu napätia a pošleme ju po sériovej linke do PC, kde ju potom graficky znázorníme. Dobré bude, keď okrem napätia na kondenzátore budeme merať aj napätie na vstupe, aspoň uvidíme aká je jeho reálna hodnota (pomôcka: nebude to 5,0 V). Okrem toho by sme k týmto dvom hodnotám mali priradiť aj časový údaj. Na to si spravíme jednoduchú premennú, ktorú v každom prerušení inkrementujeme.

Z teoretickej analýzy vieme odhadnúť, že na celé meranie nám bude stačiť 10 sekúnd a preto po ich uplynutí meranie ukončíme, aby sme graf nemuseli zastavovať na PC odadom od ruky.



Tuto je nejaky text s odkazom na literaturu o Arduine [REF 1] a tuto pokracuje iny text, kde chcem len uviest malu poznamku [1]


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í...
  1. Číslo portu zistíte z Device Managera.