Inkrementálny snímač

Z SensorWiki
Prejsť na: navigácia, hľadanie
Autori: Igor Jakubička, Rastislav Vyletel
Študijný odbor: Aplikovaná mechatronika 2. Ing. (2014)

Zadanie

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

Incremental-optical-encoder.jpgModular-incremental-rotary-encoders-14356-3126190.jpg

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

Sokovka.jpg

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:

Signal.jpg

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.

Súbor-PWM duty cycle with label.gif

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

Kitedb.jpg

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.

232ft.jpgFot232.jpg

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

Schemhd.jpgFothd.jpg


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):

Inte.jpg

Regulátor počíta regulačnú odchýlku ako rozdiel žiadanej hodnoty a regulovanej veličiny.

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.

800px-PI controller2.png


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:

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:

Prevodka.jpg


// *** 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

Náhľad výslednej HW aplikácie

Kompdoska2.jpg

Kompdoskaback2.jpg

Nameraná výsledná prechodová charakteristika regulátora

Prechodd.jpg

Literatúra

  • OPTOELEKTRONICKÉ INKREMENTÁLNE A ABSOLÚTNE SNÍMAČE [1]
  • Datasheet IRC I40-I41 [2]
  • Datasheet AT MEGA 16 [3]
  • EvB 5.1 v5 User’s Guide [4]
  • PI regulátor [5]
  • PID Without a PhD (Tim Wescott)[6]