Inkrementálny snímač: Rozdiel medzi revíziami
Zo stránky SensorWiki
(52 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 6: | Riadok 6: | ||
*************************************************************************************************** | *************************************************************************************************** | ||
--> | --> | ||
{| | {| | ||
|Autori: || '''Igor Jakubička, Rastislav Vyletel''' | |Autori: || '''Igor Jakubička, Rastislav Vyletel''' | ||
Riadok 20: | Riadok 19: | ||
== Analýza == | == Analýza == | ||
Riadok 49: | Riadok 40: | ||
Napr. ak delenie kotúča je 3600 na 1 otáčku, nameraný počet inkrementov je 360000, absolútna hodnota otáčok je 100. Hrozí tu však riziko „pretečenia“ hodnoty, t. j. počet prechodov po predelení počtom delnia kotúčov bude tak vysoký, že jednoducho ho vyhodnocovacia elektronika nebude vedieťzobraziť | Napr. ak delenie kotúča je 3600 na 1 otáčku, nameraný počet inkrementov je 360000, absolútna hodnota otáčok je 100. Hrozí tu však riziko „pretečenia“ hodnoty, t. j. počet prechodov po predelení počtom delnia kotúčov bude tak vysoký, že jednoducho ho vyhodnocovacia elektronika nebude vedieťzobraziť | ||
IRC z pravidla obsahuje 2 hlavné vyhodnocovacie signály A a B, ktoré sú posunuté o 90° pomocou signálov A a B vieme určiť smer otáčania, rýchlosť a uhlové natočenie. Z IRC signály A a B dostaneme aj v negovanej forme pre potlačenie rušenia (diferenciálny výstup). | IRC z pravidla obsahuje 2 hlavné vyhodnocovacie signály A a B, ktoré sú posunuté o 90° pomocou signálov A a B vieme určiť smer otáčania, rýchlosť a uhlové natočenie. Z IRC signály A a B dostaneme aj v negovanej forme pre potlačenie rušenia (diferenciálny výstup). | ||
Signál z IRC: | |||
[[Súbor:Signal.jpg]] | |||
'''Popis ovládania DC motora''' | '''Popis ovládania DC motora''' | ||
Riadok 123: | Riadok 118: | ||
a po spracovaní sa potom tieto zložky znovu sčítajú do riadiaceho zásahu u(t). | a po spracovaní sa potom tieto zložky znovu sčítajú do riadiaceho zásahu u(t). | ||
Potom je vzorec pre u(t): | Potom je vzorec pre u(t): | ||
[[Súbor:Inte.jpg]] | [[Súbor:Inte.jpg]] | ||
Regulátor počíta regulačnú odchýlku ako rozdiel žiadanej hodnoty a regulovanej veličiny. | Regulátor počíta regulačnú odchýlku ako rozdiel žiadanej hodnoty a regulovanej veličiny. | ||
[[Súbor:Regod.jpg]] | |||
Algoritmov číslicovej regulácie dnes existuje veľmi veľa. Je možné vytvárať rôzne varianty riadiacich algoritmov podľa zvoleného modelu sústavy, podľa kritéria akosti regulácie, podľa matematického prístupu k odvodení rovnice regulátoru atd. Najznámejší typ regulátoru v diskrétnej oblasti je regulátor PSD. | |||
Pre náš model DC motora sme zvolili PS regulátor, ktorý je podobný PI regulátoru proporcionálna zložka predstavuje zosilnenie regulátoru a integračná zložka je nahradená sumou predchádzajúcich regulačných odchýlok. V perióde 100 ms. | |||
[[Súbor:800px-PI_controller2.png]] | |||
Riadok 133: | Riadok 134: | ||
=== Algoritmus a program === | === Algoritmus a program === | ||
Tento algoritmus Riadenia v uzavretej slučke bol vytvorený v jazyku C, vo vývojovom prostredí Atmel Sludio 6. | |||
Vývojový diagram programu: | |||
[[Súbor:Diagram2.jpeg]] | |||
Vykonali sme linearizáciu medzi plnením OCR registra a otáčkami, pretože samotný motorček s prevodovkou bol "vybehaný" a mal veľkú vôľu (preskakoval o niekoľko zubov). | |||
Nameraná prevodová charakteristika: | |||
[[Súbor:Prevodka.jpg]] | |||
<source lang="c"> | <source lang="c"> | ||
/* | // *** F_CPU bola nastavena na 16 MHz | ||
#include <avr/interrupt.h> | |||
#include <avr\io.h> | |||
#include "SerialATmega16.h" // Nasa kniznica... | |||
#include "LcdATmega16.h" // Nasa kniznica... | |||
#include <stdio.h> | |||
#include <util/delay.h> | |||
#include <stdlib.h> | |||
void regulator(void); // PS (PI) regulator -> vypocet akcneho zasahu 'output' | |||
void tlac_displej(void); // vypis otacok (ziadanych, skutocnych) na displej | |||
void citaj_tlacidlo(void); // nacitanie tlacidla pre zmenu otacok | |||
FILE mystdout = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE); | |||
volatile unsigned int otacky=0 , otacky_priemer=0; // skutocne otacky | |||
volatile unsigned int pocitadlo=0, pocitadlo1=0; // pocet impulzov zachytenych IRC-snimacom | |||
volatile unsigned int a=0, i=0; // pomocne premenne | |||
volatile int Kp=10; // Kp=1 zvacsenie x10 ...proporcna konstanta | |||
volatile int Ki=5; // Ki=0.5 zvacsenie x10 ... integracna konstanta | |||
volatile int error, w=0, I=0, P=0 ; // reg. odchylka, ziadane otacky, I a P -> parametre regulatora | |||
volatile long output=0, u=0; // u => akcny zasah, output -> akcny zasah s ohranicenim | |||
//************ prerusenie od IRC **************************************************************************************** | |||
ISR(INT0_vect) // prerusenie pri zachyteni impulzu od IRC snimaca | |||
{ | |||
pocitadlo++; // pocet impulzov | |||
} | |||
//************ prerusenie od casovaca T0 ******************************************************************************** | |||
ISR (TIMER0_OVF_vect) // pretecenie nastane kazdu 1ms | |||
{ | |||
if(i==100){ // perioda vzorkovanie 100ms | |||
pocitadlo1=pocitadlo; //zachytenie stavu IRC snimaca | |||
otacky = (pocitadlo*6)/10; // prepocet impulzov IRC na ot/min | |||
i = 0; // zmazanie pomocnej casoveho premennej | |||
pocitadlo = 0; // zmazanie stavu pocitadla impulzov | |||
TCNT0 = 5; // nastavenie casovaca T0 -> pretecenie nastane kazdu 1ms | |||
regulator(); // vypocet akcneho zasahu 'output' | |||
} | |||
i++; // inkrementovanie pomocnej casovej premennej | |||
} | |||
//************ main ***************************************************************************************************** | |||
int main() | |||
{ | |||
lcd_init(LCD_DISP_ON); // inicializacia displeja | |||
inituart(); // inicializacia UART komunikacie | |||
stdout = &mystdout; // Odteraz funguje printf() -> pri UART | |||
DDRC = 0x00; // port C nastaveny ako vstupny | |||
PORTC = 0xFF; // port C -> kazdy pin nastaveny na log. 1 | |||
DDRD &= ~(1<<PD2); // vstup pre IRC | |||
DDRD |= (1<<PD5) ; // vystup PWM | |||
PORTD |= (1<<PD2); // PD2 -> log. 1 | |||
PORTD &= ~(1<<PD5); // PD5 -> log. 0 | |||
MCUCR |= (1 << ISC01); // reakcia na dobeznu hrana INT0 | |||
GICR |= (1 << INT0); // povol prerušenia od INT0 | |||
TCCR0 |= (1<<CS01)|(1<<CS00); // T0 -> preddelicka 64 | |||
TCNT0 = 5; // nastavenie casovaca T0 -> pretecenie nastane kazdu 1ms | |||
TCCR1A = 0b10100010; // Mod casovaca: FAST PWM | |||
TCCR1B = 0b00011011; // Preddelicka 1:64 | |||
TIMSK = 0b00000001; // prerušenie pri pretečení TCNT0 | |||
sei(); // povolenie preruseni | |||
ICR1 = 0x1387; // T = 20ms -> f = 50Hz | |||
TCNT1 = 0x00; // pociatocny stav pocitadla T1 | |||
printf("Spustenie prenosu\n"); // vypis do Terminalu | |||
_delay_ms(100); | |||
for(;;) // hlavna programova 'slucka' | |||
{ | |||
citaj_tlacidlo(); // nacitanie s tavu tlacidla pre zmenu otacok motora | |||
printf("%lu %u\n", u, otacky); // vypis akcneho zasahu a otacok do terminalu | |||
_delay_ms(50); | |||
OCR1A = output; // akcny zasah -> riadi plnenie PWM | |||
tlac_displej(); // tlac otacky (ziadane, skutocne) na displej | |||
} | |||
return 0; | |||
} | |||
//************ funkcia regulatora *************************************************************************************** | |||
void regulator(void){ // PS (PI) regulator -> vypocet akcneho zasahu 'output' | |||
error = w - otacky; // vypocet reg. odchylky 'e' | |||
P = error; // vypocet parametra 'P' | |||
if(error>30){ // vypocet parametra 'I' s obmedzenim na error | |||
I = I + error; | |||
} | |||
u = (Kp*P + Ki*I)/10; // vypocet akcneho zasahu | |||
if(u<751) output = ((u + 162)*10)/12; // prepocet otacok na plnenie OCR1A podla rovnice: y=1.15x-162 | |||
else output = ((750 + 162)*10)/12; // obmedzenie akcneho zasahu | |||
} | } | ||
//************ funkcia displeja ***************************************************************************************** | |||
void tlac_displej(void){ // vypis otacok (ziadanych, skutocnych) na displej | |||
a++; // inkrementovanie pomocnej casovej premennej | |||
otacky_priemer = otacky_priemer + otacky; // scitavanie otacok potrebnych na ich priemerny vypocet | |||
if(a>5){ // vypis LCD kazdych 300 ms | |||
otacky_priemer = otacky_priemer / 6; // priemerovanie otacok -> 6 vzoriek / 300 ms | |||
char text[32]; // pole znakov pre vypis na displej | |||
// ***vypis prveho riadku*** | |||
lcd_gotoxy(0, 0); // nastavenie vypisu na pociatocnu poziciu | |||
sprintf(text,"Zadane: "); // ulozenie 'sprintf' do pola 'text' | |||
lcd_puts(text); // zobrazi retazec znakov | |||
lcd_gotoxy(8, 0); // nastavenie vypisu na x, y poziciu | |||
sprintf(text,"%u",w); // ulozenie 'sprintf' do pola 'text' | |||
lcd_puts(text); // zobrazi retazec znakov | |||
lcd_gotoxy(12, 0); | |||
sprintf(text,"rpm"); | |||
lcd_puts(text); | |||
// ***vypis druheho riadku*** | |||
lcd_gotoxy(0, 1); | |||
sprintf(text,"Realne: "); | |||
lcd_puts(text); | |||
lcd_gotoxy(8, 1); | |||
sprintf(text,"%u",otacky_priemer); | |||
lcd_puts(text); | |||
lcd_gotoxy(12, 1); | |||
sprintf(text,"rpm"); | |||
lcd_puts(text); | |||
otacky_priemer = 0; | |||
a = 0; | |||
} | |||
} | |||
//************ funkcia pre nacitanie tlacidla *************************************************************************** | |||
void citaj_tlacidlo(void){ // nacitanie tlacidla pre zmenu otacok | |||
if(w < 741){ // MAX ohranicenie zvacsovania otacok | |||
if((PINC & (1 << PC7)) == 0){ // ak je tlacidlo 'S1' zatlacene (log. 0) | |||
w = w + 10; // zvacsenie ziadanych otacok o 10 ot/min | |||
} | |||
} | |||
else w = 750; // MAX otacky | |||
if(w > 351){ // MIN ohranicenie znizovania otacok | |||
if((PINC & (1 << PC6)) == 0){ // ak je tlacidlo 'S2' zatlacene (log. 0) | |||
w = w - 10; // znizenie ziadanych otacok o 10 ot/min | |||
} | |||
} | |||
else w = 350; // MIN otacky | |||
} | |||
</source> | </source> | ||
[[Médiá:SerialATmega16.c|SerialATmega16.c]], [[Médiá:SerialATmega16.h|SerialATmega16.h]], [[Médiá:LcdATmega16.c|LcdATmega16.c]], [[Médiá:LcdATmega16.h|LcdATmega16.h]] | |||
Hlavný program: [[Médiá:IRC snimac.c|IRC snimac.c]], | |||
=== Overenie === | |||
= | *'''Videoukážka implementácie PS regulátora''' https://www.youtube.com/watch?v=fZJTMSjYuZo | ||
Náhľad výslednej HW aplikácie | |||
[[Súbor:Kompdoska2.jpg]] | |||
[[Súbor:Kompdoskaback2.jpg]] | |||
Nameraná výsledná prechodová charakteristika regulátora | |||
[[Súbor:Prechodd.jpg]] | |||
== Literatúra == | == Literatúra == | ||
* OPTOELEKTRONICKÉ INKREMENTÁLNE A ABSOLÚTNE SNÍMAČE [ | * OPTOELEKTRONICKÉ INKREMENTÁLNE A ABSOLÚTNE SNÍMAČE [http://www.sjf.tuke.sk/kvtar/1/files/inkrementaly.pdf] | ||
* Datasheet IRC I40-I41 [http://www.lika.it/eng/prodotti.php?id_titolo=I40-I41] | * Datasheet IRC I40-I41 [http://www.lika.it/eng/prodotti.php?id_titolo=I40-I41] | ||
* Datasheet AT MEGA 16 [http://www.atmel.com/images/doc2466.pdf] | * Datasheet AT MEGA 16 [http://www.atmel.com/images/doc2466.pdf] |
Aktuálna revízia z 19:45, 2. február 2015
Autori: | Igor Jakubička, Rastislav Vyletel | |
Študijný odbor: | Aplikovaná mechatronika | 2. Ing. (2014) |
Zadanie
- Naprogramujte PS regulátor otáčok DC motora riadeného PWM signálom, ktorý má v spätnej väzbe zapojený inkrementálny enkóder(IRC).
Analýza
Inkrementálny snímač
Pod optoelektronickým snímaním budeme rozumieť spôsob snímania lineárnej alebo rotačnej dráhy/odchýlky, kedy sa fyzikálna hodnota zmeny polohy (lineárnej alebo rotačnej) premieňa na výstupný prírastkový alebo absolútny elektrický signál sinusového alebo TTL/HTL priebehu formou prerušovania svetelného lúča presne formátovaným rastrom (mriežkou, delením) vytvoreným na nosiči (väčšinou sklenenom, ale aj kovovom) gravírovaním, leptaním alebo nanášaním (väčšinou kovového povlaku). Prírastkovým (inkrementálnym) snímaním budeme rozumieť spôsob snímania meranej veličiny, kedy meraná hodnota sa sníma formou inkrementálneho (prírastkového) napočítavania jednotkového signálu zo snímača (prerušenie svetelného toku = inkrement, prírastok), pričom počiatok načítavania môže byť zadefinovaný v ľubovoľnom bode pracovného rozsahu snímača, napr. prerušením napájania, značkou alebo inak. U inkrementálnych snímačov uhlového natočenia a rotačných snímačov sa sníma aktuálna poloha – vychádzajúca z jedného vzťažného bodu – načítaním meracích krokov, resp. načítaním periód signálu.
Princíp merania optoelektronického snímača
Inkrementálny rotačný snímač prevádza rotačný pohyb na elektrické signály. Prevod mechanického pohybu na elektrické signály sa zabezpečuje fotoelektrickým bezkontaktným spôsobom. Snímač má potom takú rozlišovaciu schopnosť a takú presnosť, s akou presnosťou je vyrobený raster na kotúčoch snímača, ako jeho jadra. Z časového sledu elektrických signálov je možné zistiť uhol pootočenia, smer pootočenia, smer otáčania, rýchlosť otáčania sa jedného mechanického celku voči druhému. Vysoká rozlišovacia schopnosť, fotoelektrické bezkontaktné snímanie pohybu a mechanická odolnosť konštrukcie zabezpečuje vysokú presnosť a spoľahlivosť inkrementálneho rotačného snímača. Principiálne to funguje nasledovne : svetelný signál zo zdroja (LED) je usmernený optickou sústavou (šošovka) do dostatočne lineárneho svetelného prúdu, ten sa prechodom cez optickú mriežku rozkladá na úzke vzorky, ktoré dopadajú na kalibrovaný merací etalón s presným rastrom. Cez mriežku etalónu prenikajú na svetlocitlivý fotosnímač(fotobunka, fotónka), ktorých je spravidla viac s fázovým posunutím. V prípade rotačného snímača obmedzenie v otáčkach nemusí striktne existovať(n x 360°).
Merací krok závisí od jemnosti mriežky základného a etalónového kotúča. Napr. ak vzdialenosť rysiek na mriežke lineárneho snímača predstavuje 0,001mm a vyhodnocovacia jednotka príjme 5000 prechodov 1/0, znamená to, že sme namerali absolútnu hodnotu 5 mm. V prípade rotačného snímača je postup podobný. Odčítavanie uhlového natočenia v rámci jednej otáčky je úplne zhodné so spôsobom snímania prechodov
Optoelektronické inkrementálne snímanie
Napr. ak delenie kotúča je 3600 na 1 otáčku, nameraný počet inkrementov je 360000, absolútna hodnota otáčok je 100. Hrozí tu však riziko „pretečenia“ hodnoty, t. j. počet prechodov po predelení počtom delnia kotúčov bude tak vysoký, že jednoducho ho vyhodnocovacia elektronika nebude vedieťzobraziť IRC z pravidla obsahuje 2 hlavné vyhodnocovacie signály A a B, ktoré sú posunuté o 90° pomocou signálov A a B vieme určiť smer otáčania, rýchlosť a uhlové natočenie. Z IRC signály A a B dostaneme aj v negovanej forme pre potlačenie rušenia (diferenciálny výstup).
Signál z IRC:
Popis ovládania DC motora
Otáčky DC motora sú závislé na výške napájacieho napätia. V našom prípade to je úroveň napájania 0-5V, ktorou regulujeme otáčky, samozrejme zaťažiteľnosť pinov MCU nie je postačujúca pre rozbeh motora preto pomocou MCU ovládame výkonový člen, tranzistor spínaný PWM moduláciou. Impulzová šírková modulácia alebo pulzno- šírková modulácia skr. PWM (z angl. Pulse width modulation) je modulácia periodického signálu zmenou striedy v závislosti od nejakej vstupnej veličiny za účelom prenosu informácie, alebo vysoko efektívnej regulácie elektrického výkonu, dodávaného do záťaže. Vysoká účinnosť pri regulácii výkonu je daná tým, že regulátor je (v ideálnom prípade) vždy buď úplne uzavretý, alebo úplne otvorený. Nevznikajú v ňom preto tepelné straty v dôsledku úbytku napätia na regulačnom prvku s odporovým charakterom (rezistor, polovodičový priechod), ako je tomu pri spojitých regulátoroch. Je to však vykúpené zložitejším zapojením nespojitých regulátorov, vysokými nárokmi na použité spínacie súčiastky a vysokofrekvenčným rušením, vznikajúcim rýchlym prerušovaním výkonového obvodu, ktoré je potrebné odstraňovať filtrami a elektromagnetickým tienením nespojitého regulátora.
Použitie PWM vo výkonovej elektronike
Tranzistor má nízke straty v dvoch prevádzkových stavoch. Keď je plne vypnutý, alebo keď je plne zopnutý. Keď je plne vypnutý, je na ňom napätie, ale netečie cez neho prúd, takže sú v tomto stave jeho straty nulové. Keď je plne zopnutý, môže cez neho tiecť prúd, ale je na ňom len saturačné napätie, ktoré je pomerne nízke, takže jeho stratový výkon je v tomto stave aj nízky. Pretože pri každom zapnutí alebo vypnutí prechádza tranzistor cez oblasť vysokých strát, s frekvenciou spínania straty rastú. Vďaka možnosti preniesť Dvojhodnotové modulovaný signál pri danej spínacej frekvencii dnes patrí pulzne šírková modulácia k základným technikám, na ktorých stojí súčasná výkonová elektronika.
Takmer všetky súčasné DC / DC meniče, meniče frekvencie alebo striedače využívajú nejakú formu pulzne šírkovej modulácie. Napríklad striedač môže pripájať na jednosmerný elektromotor pulzne-šírkovo modulované napätie. Rozptylová indukčnosť motora sa potom chová ako dolnofrekvenční priepusť, takže prúd a teda aj moment motora je spojitý.
Podobne sa PWM používa u meničov frekvencie s trojfázovými elektromotormi. Indukčnosť motora tu tiež pôsobí ako dolnofrekvenční priepusť, tri fázy motora sú pripojené na tri pulzne-šírkovo modulovaná napätia. Motor sa pri dostatočne veľkej nosnej frekvencii modulácie chová podobne, ako by na neho priložená napätie nebola modulovaná. Vzhľadom k tomu, že nulový vodič motora sa nezapája, rozhodujúce sú len rozdiely napätia (tj. Okamžitá združená napätie) vstupujúci do modulátorov.
V spotrebnej elektronike môžu využívať PWM tzv. Zosilňovače triedy D, ktorých hlavnou výhodou sú nízke straty, čo vedie k úspore energie a na zníženie rozmerov zariadenia. To má význam najmä u prístrojov napájaných z batérie.
Nosná frekvencia modulácie býva väčšinou konštantný, ale nemusí to tak byť vždy. Napríklad niektoré striedače pre riadenie motora môžu zámerne každú periódu náhodne meniť frekvenciu nosného signálu, aby bolo redukované nepríjemné pískanie motora súvisiaci s nosnou frekvenciou modulácie.
Popis riešenia
Popis vývojového kitu
EVB 5.1 je založený na dvoch typov populárnych Atmel mikroprocesorov ATmega16 a ATMEGA32. Doska je vybavená radom obvodových prvkov, ktoré sú napojené na kolíkových lištách, ktoré umožňujú užívateľovi rýchlu realizáciu ktoréhokoľvek projektu, aby nebolo nutné objednať špecializovanú vývojovú dosku. Všetky lišty sú označené. Nachádzajú sa v blízkosti periférií s ktorými sú spojené. To umožňuje intuitívne prepojenie bez nutnosti čítať dokumentáciu. EVB 5.1 set bol navrhnutý ako pre menej skúsených užívateľov, ktorí prvé kroky vo svete mikroprocesorov začínajú, tak aj pre profesionálnych programátorov, ktorí hľadajú univerzálnu platformu pre svoje projekty. Staršie verzie EvB4.3 rady boli úspešne použité pre celý rad veľkých projektov na poľských vysokých školách a pri vedeckých výskumoch. V súčasnej dobe naše dosky sa používajú na univerzitách v Sliezsku.
EvB 5.1 v5 kit obsahuje:
- AVR ATMega32 alebo ATMega644p Processor s DIP40 púzdrom
- Real time clock PCF8563
- EEPROM AT24C02 memory
- TSOP4836 infra-red receiver
- Infra-red transmiter
- DS18B20 temperature detector
- RS485 converter
- micro SD card socket
- 8 push buttons
- 8 LEDs
- RGB led
- 8 transistor outputs of 500mA each
- 2 analogue potentiometers
- 4x7 segment display
- USB port
- ISP port
- 5 pins of voltage +5V
- 5 pins of voltage +3.3V
- 5 pins of mass
- LCD of 2x16 characters
Komunikácia
Komunikácia EVB 5.1 kitom s PC bola navrhnutá na použitie USB-UART FT232RL prevodníka (virtuálny COM port). Systém je FT232RL pripojený k TxD a RxD liniek procesora, ktorý nevyžaduje žiadnu potrebu pre jeho napájanie.
Display
16-pin konektor pre pripojenie LCD modulu na základe HD44780 kontrolera. Displej sa ovláda pomocou 4 alebo 8bit adresovo/dátovej zbernice. Signály zobrazenia sú spojené s konektorom HD44780 označeného pod ním. Kontrast displeja možno nastaviť pomocou potenciometra
Regulátor
PI regulátor čiže proporcionálny a integračný regulátor je najjednoduchší lineárny regulátor. PI regulátor patrí k najpoužívanejším typom regulátorov v technike elektrických pohonov. Regulačná odchýlka e(t) predstavujúca rozdiel požadovanej hodnoty na výstupe od aktuálnej (vypočítaná zo spätnej väzby) je vstupom do dvoch samostatných blokov (obvodov):
- P - proporcionálna - obyčajný zosilňovač s nastaviteľným zosilnením
- I - integračná - integrátor s nastaviteľným koeficientom
a po spracovaní sa potom tieto zložky znovu sčítajú do riadiaceho zásahu u(t). Potom je vzorec pre u(t):
Regulátor počíta regulačnú odchýlku ako rozdiel žiadanej hodnoty a regulovanej veličiny.
Algoritmov číslicovej regulácie dnes existuje veľmi veľa. Je možné vytvárať rôzne varianty riadiacich algoritmov podľa zvoleného modelu sústavy, podľa kritéria akosti regulácie, podľa matematického prístupu k odvodení rovnice regulátoru atd. Najznámejší typ regulátoru v diskrétnej oblasti je regulátor PSD. Pre náš model DC motora sme zvolili PS regulátor, ktorý je podobný PI regulátoru proporcionálna zložka predstavuje zosilnenie regulátoru a integračná zložka je nahradená sumou predchádzajúcich regulačných odchýlok. V perióde 100 ms.
Algoritmus a program
Tento algoritmus Riadenia v uzavretej slučke bol vytvorený v jazyku C, vo vývojovom prostredí Atmel Sludio 6.
Vývojový diagram programu:
Vykonali sme linearizáciu medzi plnením OCR registra a otáčkami, pretože samotný motorček s prevodovkou bol "vybehaný" a mal veľkú vôľu (preskakoval o niekoľko zubov). Nameraná prevodová charakteristika:
// *** F_CPU bola nastavena na 16 MHz
#include <avr/interrupt.h>
#include <avr\io.h>
#include "SerialATmega16.h" // Nasa kniznica...
#include "LcdATmega16.h" // Nasa kniznica...
#include <stdio.h>
#include <util/delay.h>
#include <stdlib.h>
void regulator(void); // PS (PI) regulator -> vypocet akcneho zasahu 'output'
void tlac_displej(void); // vypis otacok (ziadanych, skutocnych) na displej
void citaj_tlacidlo(void); // nacitanie tlacidla pre zmenu otacok
FILE mystdout = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE);
volatile unsigned int otacky=0 , otacky_priemer=0; // skutocne otacky
volatile unsigned int pocitadlo=0, pocitadlo1=0; // pocet impulzov zachytenych IRC-snimacom
volatile unsigned int a=0, i=0; // pomocne premenne
volatile int Kp=10; // Kp=1 zvacsenie x10 ...proporcna konstanta
volatile int Ki=5; // Ki=0.5 zvacsenie x10 ... integracna konstanta
volatile int error, w=0, I=0, P=0 ; // reg. odchylka, ziadane otacky, I a P -> parametre regulatora
volatile long output=0, u=0; // u => akcny zasah, output -> akcny zasah s ohranicenim
//************ prerusenie od IRC ****************************************************************************************
ISR(INT0_vect) // prerusenie pri zachyteni impulzu od IRC snimaca
{
pocitadlo++; // pocet impulzov
}
//************ prerusenie od casovaca T0 ********************************************************************************
ISR (TIMER0_OVF_vect) // pretecenie nastane kazdu 1ms
{
if(i==100){ // perioda vzorkovanie 100ms
pocitadlo1=pocitadlo; //zachytenie stavu IRC snimaca
otacky = (pocitadlo*6)/10; // prepocet impulzov IRC na ot/min
i = 0; // zmazanie pomocnej casoveho premennej
pocitadlo = 0; // zmazanie stavu pocitadla impulzov
TCNT0 = 5; // nastavenie casovaca T0 -> pretecenie nastane kazdu 1ms
regulator(); // vypocet akcneho zasahu 'output'
}
i++; // inkrementovanie pomocnej casovej premennej
}
//************ main *****************************************************************************************************
int main()
{
lcd_init(LCD_DISP_ON); // inicializacia displeja
inituart(); // inicializacia UART komunikacie
stdout = &mystdout; // Odteraz funguje printf() -> pri UART
DDRC = 0x00; // port C nastaveny ako vstupny
PORTC = 0xFF; // port C -> kazdy pin nastaveny na log. 1
DDRD &= ~(1<<PD2); // vstup pre IRC
DDRD |= (1<<PD5) ; // vystup PWM
PORTD |= (1<<PD2); // PD2 -> log. 1
PORTD &= ~(1<<PD5); // PD5 -> log. 0
MCUCR |= (1 << ISC01); // reakcia na dobeznu hrana INT0
GICR |= (1 << INT0); // povol prerušenia od INT0
TCCR0 |= (1<<CS01)|(1<<CS00); // T0 -> preddelicka 64
TCNT0 = 5; // nastavenie casovaca T0 -> pretecenie nastane kazdu 1ms
TCCR1A = 0b10100010; // Mod casovaca: FAST PWM
TCCR1B = 0b00011011; // Preddelicka 1:64
TIMSK = 0b00000001; // prerušenie pri pretečení TCNT0
sei(); // povolenie preruseni
ICR1 = 0x1387; // T = 20ms -> f = 50Hz
TCNT1 = 0x00; // pociatocny stav pocitadla T1
printf("Spustenie prenosu\n"); // vypis do Terminalu
_delay_ms(100);
for(;;) // hlavna programova 'slucka'
{
citaj_tlacidlo(); // nacitanie s tavu tlacidla pre zmenu otacok motora
printf("%lu %u\n", u, otacky); // vypis akcneho zasahu a otacok do terminalu
_delay_ms(50);
OCR1A = output; // akcny zasah -> riadi plnenie PWM
tlac_displej(); // tlac otacky (ziadane, skutocne) na displej
}
return 0;
}
//************ funkcia regulatora ***************************************************************************************
void regulator(void){ // PS (PI) regulator -> vypocet akcneho zasahu 'output'
error = w - otacky; // vypocet reg. odchylky 'e'
P = error; // vypocet parametra 'P'
if(error>30){ // vypocet parametra 'I' s obmedzenim na error
I = I + error;
}
u = (Kp*P + Ki*I)/10; // vypocet akcneho zasahu
if(u<751) output = ((u + 162)*10)/12; // prepocet otacok na plnenie OCR1A podla rovnice: y=1.15x-162
else output = ((750 + 162)*10)/12; // obmedzenie akcneho zasahu
}
//************ funkcia displeja *****************************************************************************************
void tlac_displej(void){ // vypis otacok (ziadanych, skutocnych) na displej
a++; // inkrementovanie pomocnej casovej premennej
otacky_priemer = otacky_priemer + otacky; // scitavanie otacok potrebnych na ich priemerny vypocet
if(a>5){ // vypis LCD kazdych 300 ms
otacky_priemer = otacky_priemer / 6; // priemerovanie otacok -> 6 vzoriek / 300 ms
char text[32]; // pole znakov pre vypis na displej
// ***vypis prveho riadku***
lcd_gotoxy(0, 0); // nastavenie vypisu na pociatocnu poziciu
sprintf(text,"Zadane: "); // ulozenie 'sprintf' do pola 'text'
lcd_puts(text); // zobrazi retazec znakov
lcd_gotoxy(8, 0); // nastavenie vypisu na x, y poziciu
sprintf(text,"%u",w); // ulozenie 'sprintf' do pola 'text'
lcd_puts(text); // zobrazi retazec znakov
lcd_gotoxy(12, 0);
sprintf(text,"rpm");
lcd_puts(text);
// ***vypis druheho riadku***
lcd_gotoxy(0, 1);
sprintf(text,"Realne: ");
lcd_puts(text);
lcd_gotoxy(8, 1);
sprintf(text,"%u",otacky_priemer);
lcd_puts(text);
lcd_gotoxy(12, 1);
sprintf(text,"rpm");
lcd_puts(text);
otacky_priemer = 0;
a = 0;
}
}
//************ funkcia pre nacitanie tlacidla ***************************************************************************
void citaj_tlacidlo(void){ // nacitanie tlacidla pre zmenu otacok
if(w < 741){ // MAX ohranicenie zvacsovania otacok
if((PINC & (1 << PC7)) == 0){ // ak je tlacidlo 'S1' zatlacene (log. 0)
w = w + 10; // zvacsenie ziadanych otacok o 10 ot/min
}
}
else w = 750; // MAX otacky
if(w > 351){ // MIN ohranicenie znizovania otacok
if((PINC & (1 << PC6)) == 0){ // ak je tlacidlo 'S2' zatlacene (log. 0)
w = w - 10; // znizenie ziadanych otacok o 10 ot/min
}
}
else w = 350; // MIN otacky
}
SerialATmega16.c, SerialATmega16.h, LcdATmega16.c, LcdATmega16.h
Hlavný program: IRC snimac.c,
Overenie
- Videoukážka implementácie PS regulátora https://www.youtube.com/watch?v=fZJTMSjYuZo
Náhľad výslednej HW aplikácie
Nameraná výsledná prechodová charakteristika regulátora