Riadenie sústavy 1. rádu
Z SensorWiki
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. Veľa krát je vo funkcii filtra PWM signálu, je regulovaná sústava. To je náš prípad.
Schému zapojenia doplníme o označenie vstupných a výstupných signálov. . Bude nás zaujímať priebeh napätia na kondenzátore po pripojení napätia 5V. 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? Nabíjacia krivka je vlastne prechodová charakteristika. Prepokladáme, že pripojený zdroj má prakticky nulový vnútorný odpor.
V elektrickom obvode podľa obrázku podľa Kirchoffovho zákona platí, že súčet napätí v uzavretej slučke je nulový:
kde je prúd v slučke a je odpor rezistora, pričom pre výstupné napätie ďalej platí
kde 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 z hodnoty 0 na v čase nasledovný priebeh výstupného napätia :
kde je tzv. zosilnenie obvodu a je tzv. časová konštanta. Jej veľkosť určuje tvar a rýchlosť nabíjacej/vybíjacej krivky kondenzátora. Vybíjacia krivka predpokladá skrat vstupných svoriek. Nestačí len rozpojiť spínač.
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 , dostaneme
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 počítadlo T2, ktoré nastavíme tak, aby vyvolalo požiadavku o výpis hodnoty napätia na kondenzátore každých 10 ms. Samotné počítadlo bude generovať prerušenie každé 2 ms. Toto prerušenie použijeme ako “generátor” 10ms vzoriek a na opakované spustenie AD prevodu. [1]. Teoretická hodnota časovej konštanty je 0,5 s. T.j. Presnosť merania postačuje. Napätie na kondenzátore je merané nasledovným spôsobom: AD prevodník je nastavený na maximálnú možnú rýchlosť realizácie AD prevodu. Prevod je spustený v prerušení od T2, t.j. každé 2ms. Je povolené prerušenie od ukončenia AD prevodu. V obsluhe prerušenia prečítame napätie na kondenzátore. Ak treba, môžeme ho aj, napr. Filtrom typu “kĺzavý priemer” filtrovať. Ak by sme merali viac AD kanálov nastavili by sme ďalší analógový vstup. Spustenie AD prevodu sa zase uskutoční v prerušení od T2 (každé 2 ms).
Vzorový program predpokladá pripojenie 5V (pin D5) na RC člen. V takomto prípade by sme mohli vykreslovať aj meraný priebeh napätia nav stupe RC člena. My ale budeme vstupné napätie generovať ako PWM signal (Fast PWM MOD3 výstup na pin D5). T.j. bude vhodnejšie vykreslovať teoretický priebeh strednej hodnoty PWM signálu. Na začiatku nastavíme plnenie na nulu, čo odpovedá napätiu 0V a po 1 s zmeníme na plnenie odpovedajúce hodnote napr. 4V (plnenie nastavíme do registra … ako číslo z intervalu (0 až 255)). Teoretický čas ustálenia napätia na kondenzátore je 5*T (časová konštanta RC člena - T=R*C) Po tomto čase výpis cez sériový kanál na SERIAL PLOTER ukončíme. Ak by sme chceli opakovanie vykreslovať prechodovú charakteristiku, musíme najskôr kondenzátor vybiť. To sad á napr. Tak, že pripojíme malý resistor, napr. 330Ohm cez pin D4. Ten na začiatku nastavíme ako výstupný na hodnotu LOW. V okamžiku začatia generovania PWM signálu pin D4 nastavíme ako vstupný a vybíjanie tým ukončíme. Keďže potrebujeme poznať čas ( násobok 10ms) budeme na základe info s T2 inkrementovať premenú, ktorá bude načítavať údaj o čase. Je vhodné do grafu okrem napätia na kondenzátore vykreslovať ustálenú hodnotu a hodnotu odpovedajúcu “časovej konštante”. Vykreslovať môžeme realizovať v rozsahu 0 až 5V, resp. v rozsahu AD prevodníka 0 až 1023, resp. v tzv. MU rozsah 0 až 1.
Ú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.
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 */
Zdrojové program upravíme tak, aby sme mohli regulovať napätie na kondenzátore. Najskôr pomocou P regulátora. Na začiatku treba povedať, že vstupom regulátora sú a v rozsahu 0 až 1023. Výstup (plnenie PWM signálu) je z rosahu (0 až 255)). To znamená, že ak chceme nastaviť zosilnenie P regulátora na hodnotu , musí tomu odpovedať rovnica:
kde .
Regulačnú odchýlku počítame podľa vzťahu
Samoyrejme nesmieme zabudnúť na obmedzenie akčného zásahu (min = 0 a max = 255).
Na “pozadí” beží spojitý čas timeVal
a my z neho využívame len disktretne vzorky, teda
V programe použíjeme namiesto premennú poc_time
typu int.
Môžeme to povedať, aj tak, že regulovaný system mimo týchto okamžikov pracuje “v otvorenej slučke”. Perióda vzorkovania musí byť dostatočne malá, aby sa sta systému medzi vzorkami zmenil len nepatrne. V zhode s prednáškou vyhovuje ms. Ak by sme použili PI, resp. PS regulátor, bolo by vhodné nastaviť samostatnú periódu vzorkovania pre zbiehanie PS algoritmu a samostatnú pre výpis priebehu regulovanej veličiny, akčného zásahu, želanej veličiny,...
Úloha 2:
- Realizovať regulator pre K_P = 1, 2,3 a porovnať teoretickú a skutočnú trvalú regulačnú odchýlku.
- Ak sa niekomu podarí doplniť aj I zložku regulátora môže pripojiť aj záťať regulovaného systému. Viď. prednáška.
Samozrejme, že podkladové programy nie sú napísané dokonale. Študenti môžu programy upravovať a vylepšovať. Napr.: AntiWindUpReset, Ručné riadenie, Zmena w_zel pomocou potenciometra, …
Literatúra
- ↑ Pravdepodobne zistíte, že 8-bitovým počítadlom T0 s kryštálom 16 MHz sa vám nepodarí nastaviť preddelič a register OCR na takú kombináciu, aby interval bol naozaj presne 10,00 ms. V rámci presnosti nášho merania to nevadí, ale je to principiálny problém. Buď by sme museli použiť 16-bitové počítadlo T1, alebo zmeniť hodnotu kryštálu napr. na 18,432 MHz, v takom prípade by nám čas vyšiel presne.