Laboratorní zdroj - 4. část

Podobné dokumenty
Vánoční hvězda 2. Publikované: , Kategória: Blikače a optika.

Laboratorní zdroj - 6. část

Návrh konstrukce odchovny 2. dil

Program PID regulátoru mikropájky

Laboratorní zdroj - 1. část

LED_007.c Strana: 1/5 C:\Michal\AVR\Výukové programy\archiv\ Poslední změna: :01:48

Vzdálené ovládání po rozvodné síti 230V

SEMESTRÁLNÍ PROJEKT Y38PRO

Mikropočítačová vstupně/výstupní jednotka pro řízení tepelných modelů. Zdeněk Oborný

1. GPIB komunikace s přístroji M1T330, M1T380 a BM595

AD4RS. měřící převodník. 4x vstup pro měření unifikovaného signálu 0 10 V, 0 20 ma, 4 20 ma. komunikace linkami RS232 nebo RS485

PiKRON s.r.o. ( ) 16. července Filtrace vstupních dat z AD převodníků... 3

Ṁikroprocesory v přístroj. technice. Ohm-metr ... Petr Česák

Úvod do mobilní robotiky AIL028

4x vstup pro měření unifikovaného signálu 0 10 V, 0 20 ma, 4 20 ma. komunikace linkami RS232 nebo RS485

ROUTPRO FX Programovatelný převodník RS485 na RS232. Katalogový list. prosinec Komunikační převodníky

Přednáška A3B38MMP. Bloky mikropočítače vestavné aplikace, dohlížecí obvody. 2015, kat. měření, ČVUT - FEL, Praha J. Fischer

Popis programu EnicomD

5. A/Č převodník s postupnou aproximací

Použití UART a radia na platformě micro:bit

Komunikační protokol MODBUS RTU v displejích TDS

Rozšiřující desce s dalšími paralelními porty Rozšiřující desce s motorkem Elektrickém zapojení Principu činnosti Způsobu programování

Direct Digital Synthesis (DDS)

RS485/MODBUS-RTU ver. 4 s rozšířením pro R24

Inteligentní převodníky SMART. Univerzální vícevstupový programovatelný převodník. 6xS

Komunikační protokol MODBUS RTU v displejích TDS

MĚŘICÍ PŘÍSTROJ PRO PC. 4 VSTUPY: 0 10 V ZESÍLENÍ : 1x, 2x, 4x, 8x VÝSTUP: LINKA RS232 RS232 DRAK 4 U1 U2 U3 U4

Telemetrický komunikační protokol JETI

Číslicový zobrazovač CZ 5.7

24 bitový dvoukanálový AD převodník s obvodem HX711

idrn-st Převodník pro tenzometry

Manuál přípravku FPGA University Board (FUB)

K8055D.DLL v Technická příručka. Úvod. Obecné. Konvence volání. Nastavení adresy karty

D/A převodník se dvěma napěťovými nebo proudovými výstupy. (0 10 V, 0 5 V, ±10 V, ±5 V, 4 20 ma, 0 20 ma, 0 24 ma)

DIGITÁLNÍ ODPALOVACÍ PULT

Popis obvodu U2403B. Funkce integrovaného obvodu U2403B

CNC Technologie a obráběcí stroje

1. MIKROPROCESOR ATMEGA A/D PŘEVODNÍK MÓDY PŘEVODNÍKU Single Conversion Mode Auto Triggering Start...

NAPOJENÍ ZAŘÍZENÍ S KOMUNIKACÍ BELIMO MP-BUS NA SÍŤ AUTOMATŮ MICROPEL

Obsah. Popis funkcí. RS485/MODBUS-RTU ver Komunikace s převodníkem probíhá na principu MASTER - SLAVE. Protokol MODBUS mát tuto strukturu:

Tel-30 Nabíjení kapacitoru konstantním proudem [V(C1), I(C1)] Start: Transient Tranzientní analýza ukazuje, jaké napětí vytvoří proud 5mA za 4ms na ka

Programování mikropočítačů platforma Arduino

Komunikační protokol pro Fotometr 2008

Manuální, technická a elektrozručnost

Technická dokumentace MĚŘIČ TEPLOTY. typ PT100DIG.

Projektová dokumentace ANUI

Témata profilové maturitní zkoušky z předmětu Souborná zkouška z odborných elektrotechnických předmětů (elektronická zařízení, elektronika)

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Komunikační protokol MODBUS RTU v jednotce M4016. Seznam služeb protokolu MODBUS podporovaných řídící jednotkou M4016 je v tabulce.

ochranným obvodem, který chrání útlumové články před vnějším náhodným přetížením.

Jízda po čáře pro reklamní robot

Střední průmyslová škola a Vyšší odborná škola, Hrabákova 271, Příbram. III / 2 = Inovace a zkvalitnění výuky prostřednictvím ICT

Praktické úlohy- 2.oblast zaměření

Komunikační protokol MODBUS RTU v přípojné desce EPD.

MK3x3 programovatelné relé

Komunikační protokol pro Fotometr 2008 (verze s rozhraním RS232)

PROTOKOL RDS. Dotaz na stav stanice " STAV CNC Informace o stavu CNC a radiové stanice FORMÁT JEDNOTLIVÝCH ZPRÁV

9. Rozšiřující desky Evb_Display a Evb_keyboard

Modul univerzálních analogových vstupů R560. Shrnutí

Laboratorní zdroj - 3. část

Programovatelný časový spínač 1s 68h řízený jednočip. mikroprocesorem v3.0a

Uživatelský manuál. KNXgal

Laboratorní cvičení z předmětu Elektrická měření 2. ročník KMT

Návod na zapojení a ovládání řídící jednotky výtahových dveří VVVF-4

Technická data. Upozornění ohledně bezpečnosti

Modbus RTU v DA2RS. kompletní popis protokolu. 13. března 2018 w w w. p a p o u c h. c o m

M-Bus Master MultiPort 250D DATOVÝ LIST

RS , , RS 485, USB, GSM/GPRS

FILIP SCHWANK. Katedra měření, listopad 2017

Konferenční zařízení. Cíl projektu. Vybavení. Jak jsem postupoval. Projekt Nekoř 2009 Jan Sixta,

OM ProfiBus POPIS PROTOKOLU/KOMINUKACE

Střední průmyslová škola a Vyšší odborná škola, Hrabákova 271, Příbram. III / 2 = Inovace a zkvalitnění výuky prostřednictvím ICT

Prostředky automatického řízení

DRAK 3 INTELIGENTNÍ A/D PŘEVODNÍK. 3 VSTUPY: 0(4) - 20mA, 0-5/10V VÝSTUP: LINKA RS485 MODUL NA DIN LIŠTU RS485

Quido RS 2/16 OC. 2 vstupy pro kontakt 16 digitálních výstupů 1 teploměr -55 až +125 C komunikace přes RS485 nebo RS232

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ Fakulta informačních technologií

EC Motor. IO Modul EC200. EC200 Int. EC200 Ext. Verze 1.20, revize PMControl s.r.o.

5. MĚŘENÍ TEPLOTY TERMOČLÁNKY

Činnost CPU. IMTEE Přednáška č. 2. Několik úrovní abstrakce od obvodů CPU: Hodinový cyklus fáze strojový cyklus instrukční cyklus


Návod na obsluhu Pípáku2 verse V0.1 (PŘEDBĚŽNÝ NÁVOD).

APLIKACE MIKROKONTROLÉRŮ PIC32MX

APOSYS 10. Kompaktní mikroprocesorový regulátor APOSYS 10. MAHRLO s.r.o. Ľudmily Podjavorinskej 535/ Stará Turá

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

FVZ K13138-TACR-V004-G-TRIGGER_BOX

Úvod do mobilní robotiky NAIL028

STRUčNÝ NÁVOD PRO KONFIGURACI FREKVENčNÍCH MĚNIčŮ

eses výukový multi shield pro Arduino UNO

KARTA ŘADIČE DCF A GPS ME3

IMP (Mikroprocesorové a vestavěné systémy)

Analyzátor sítě ADR. Návod na použití

9. Robot pro Robotický den 2012

[Otázky Autoelektrikář + Mechanik elektronických zařízení 1.část] Na rezistoru je napětí 25 V a teče jím proud 50 ma. Rezistor má hodnotu.

11. Odporový snímač teploty, měřicí systém a bezkontaktní teploměr

ASYNCHRONNÍ ČÍTAČE Použité zdroje:

NDEM 02 Síťový terminál pro docházkové aplikace

Technická dokumentace MĚŘIČ TEPLOTY. typ Term

Temp-485-Pt100. Teplotní čidlo (senzor Pt100 nebo Pt1000) komunikující po sběrnici RS-485 s jednoduchým komunikačním protokolem. Temp-485-Pt100 Box2

OM ProfiBus POPIS PROTOKOLU/KOMUNIKACE

Sběrnice Massoth Control BUS

Transkript:

Laboratorní zdroj - 4. část Publikované: 10.04.2016, Kategória: Silové časti www.svetelektro.com Komunikace po sériové lince a programování DA a AD převodníku Aby bylo možné komunikovat s podřízeným procesorem na analogové desce laboratorního zdroje, připojil jsem k ní a naprogramoval provizorní řídící desku. Je osazena procesorem ATmega162 a alfanumerickým displejem s rozlišením 16 x 40 znaků. Displej je osazen řadičem HD61830. Rád takovou desku používám pro první oživování nových věcí. Na displej se vejde spousta informací o běžícím programu, takže není potřeba JTAG. Mezivýsledky výpočtů, které programuji, jsou pořád někde zobrazovány a já můžu kontrolovat jejich správnost. Nemusím se starat a do procesoru nahrávat obsáhlou znakovou sadu potřebnou pro řízení barevného displeje, který bude použit později, takže desítky přeprogramovávání při vývoji programu v AVR studiu jsou velmi rychlé. No a na univerzální desku si můžu připájet periferie, které zrovna potřebuji. Teď je na ní jenom stabilizátor, rotační kodér a sériová linka. V konečné verzi zdroje bude použita řídící deska s procesorem ATxmega128 a 4,3 TFT displej. V hlavní smyčce programu, kterým ovládám laboratorní zdroj, se věnuji hlavně zobrazování na displeji:

if( RotStatus == 0 ) LCD_Write_String( 0, 0, " * * S E T T I N G V O L T A G E * * " ); else LCD_Write_String( 0, 0, " * * * * * * V O L T A G E * * * * * * " ); LCD_Write_String( 0, 1, " > " ); LCD_Write_Dec16_Point3( VoltageDaMilivolt ); // nastavene napeti pro DA - z rotacniho koderu LCD_Write_String( 9, 1, " V DA" ); LCD_Write_String( 15, 1, " > " ); LCD_Write_Dec16( VoltageDaOutput ); // vypocitane dilky pro DA prevod LCD_Write_String( 23, 1, " dilku DA "); LCD_Write_Signed_Dec8( VoltageDaMilivolt - VoltageAdMilivolt ); LCD_Write_String( 0, 2, " > " ); LCD_Write_Dec16_Point3( VoltageAdMilivolt ); // vypocitane napeti z dilku AD LCD_Write_String( 9, 2, " V AD" ); LCD_Write_String( 15, 2, " > " ); LCD_Write_Dec16( VoltageAdInput ); // namerene dilky AD prevodniku napeti LCD_Write_String( 23, 2, " dilku AD "); LCD_Write_Dec16( VoltageAdInput1 ); // namerene dilky bez prumerovani!!!!!!!!!!!!!!! if( RotStatus == 1 ) LCD_Write_String( 0, 4, " * * S E T T I N G C U R R E N T * * " ); else LCD_Write_String( 0, 4, " * * * * * * C U R R E N T * * * * * * " ); LCD_Write_String( 0, 5, " > " ); LCD_Write_Dec16( CurrentDaMiliamper ); // nastaveny proud pro DA - z rotacniho koderu LCD_Write_String( 9, 5, " ma DA" ); LCD_Write_String( 15, 5, " > " ); LCD_Write_Dec16( CurrentDaOutput ); // vypocitane dilky pro DA prevod LCD_Write_String( 23, 5, " dilku DA "); LCD_Write_String( 0, 6, " > " ); LCD_Write_Dec16( CurrentAdMiliamper ); // vypocitany proud z dilku AD LCD_Write_String( 9, 6, " ma AD" ); LCD_Write_String( 15, 6, " > " ); LCD_Write_Dec16( CurrentAdInput ); // namerene dilky AD prevodniku proudu LCD_Write_String( 23, 6, " dilku AD "); LCD_Write_Dec16( CurrentAdInput1 ); // namerene dilky bez prumerovani!!!!!!!!!!!!!!!

Je potřeba zobrazit napětí nastavené na rotačním kodéru a z něj vypočítaný údaj odesílaný na DA převodník. Ten samozřejmě v budoucnu nebude potřeba, ale teď se hodí. Je potřeba hlídat, jestli dobře funguje rovnice, která hodnotu pro DA převodník počítá. Na dalším řádku je průměrná hodnota z AD převodníku a z něj vypočítané naměřené napětí v milivoltech. Na kraji displeje je ještě rozdíl nastavené a naměřené hodnoty a aktuální číslo z AD převodníku. Podobné údaje se opakují pro nastavení a měření proudu. Ve spodní části displeje jsou další věci, které zrovna programuji. No a na posledním řádku je výpis komunikace mezi procesory zase pro jistotu, abych na první pohled viděl, že procesory mezi sebou komunikují. Celé to pak vypadá takto: Komunikace po sériové lince Komunikaci bude řídit procesor ATmega162 na řídící desce. Podřízeným procesorem je ATmega16 na analogové desce zdroje. Na začátku komunikace Master vyšle nějaký textový řetězec, ze kterého je zřejmé, pro který procesor je informace určena a od koho se zároveň očekává odpověď. Já zvolil řetězec Zdroj_01. Za ním jde skupina dat: 16 bitů 2 bajty: požadované napětí pro DA převodník 16 bitů 2 bajty: požadovaný proud pro DA převodník 8 bitů 1 bajt: nastavení relé, které jsou na desce zdroje 8 bitů 1 bajt: počet měření na AD převodníku, která budou průměrována 16 bitů 2 bajty: záloha Slave procesor ví, že má přijmout 16 bajtů. Přitom kontroluje textový řetězec, aby bylo možno rozhodnout, že je informace pro něj. Pokud ano, tak přijme všechna data do pole dat SerialRxArray. Z něj budou údaje použity v dalších částech programu. Po přijetí posledního znaku začne slave procesor okamžitě vysílat svoji zprávu pro Master. Začíná stejně, řetězcem Zdroj_01 a pokračuje skupinou dat: 16 bitů 2 bajty: aktuální naměřené napětí 16 bitů 2 bajty: aktuální naměřený proud 16 bitů 2 bajty: průměrné naměřené napětí 16 bitů 2 bajty: průměrný naměřený proud 16 bitů 2 bajty: naměřené napětí z teplotního čidla integrovaného v referenčním zdroji 8 bitů 1 bajt: stav zdroje zdroj napětí nebo proudu 40 bitů 5 bajtů: záloha Master data přijme a uloží do svého pole přijatých dat SerialRxArray. Vysílání z procesoru Master je řízeno podprogramem přerušení od časovače. Ten spouští vysílání zprávy přibližně 5x za sekundu. Na logickém analyzátoru to vypadá takto:

Program přerušení od časovače odešle jednou za 200ms první písmeno řetězce. Po jeho odeslání vznikne požadavek na přerušení od vysílače sériového kanálu, který odesílá zbytek.

ISR(TIMER1_CAPT_vect) SREG = 0x00; // zastavi globalni preruseni if ( TimCounter == 200 ) // pocita interval 0,2 sekunda k odeslani dat na seriovy kanal TimCounter = 0; // pocitadlo milisekund v casovaci SerialString = "Zdroj_01"; while (!( UCSR0A & (1<<UDRE0))); UDR0 = (*SerialString); // zacatek odesilani SerialString++; SerialTxCounter = 0; TimCounter++; SREG = 0x80; // pusti globalni preruseni

Začátek programu přerušení aktivovaný při dokončení odesílání znaku na sériové lince:

ISR(USART0_TXC_vect) if (*SerialString!= '') // hleda konec retezce UDR0 = *SerialString; // posle dalsi pismeno SerialString++; else switch (SerialTxCounter) case 0: // horni polovina DA prevodniku napeti UDR0 = (unsigned char) (VoltageDaOutput >> 8); break; case 1: // spodni polovina DA prevodniku napeti UDR0 = (unsigned char) (VoltageDaOutput); break; case 2: // horni polovina DA prevodniku proudu UDR0 = (unsigned char) (CurrentDaOutput >> 8); break; case 3: // spodni polovina DA prevodniku proudu UDR0 = (unsigned char) (CurrentDaOutput); break;

Program přerušení aktivovaný při dokončení přijímání znaku na sériové lince:

ISR(USART0_RXC_vect) LED_G_Set; SerialRxArray[SerialRxCounter] = UDR0; switch (SerialRxCounter) case 0: // prijima znaky do pole SerialRxArray, prvni tri znaky kontroluje if(serialrxarray[0] == 'Z') SerialRxCounter++; break; case 1: if(serialrxarray[1] == 'd') SerialRxCounter++; else SerialRxCounter = 0; break; case 2: if(serialrxarray[2] == 'r') SerialRxCounter++; else SerialRxCounter = 0; break; case 23: // posledni prijaty znak SerialRxCounter = 0; LED_G_Clr; break; default: SerialRxCounter++; break;

Nakonec ještě nastavení registrů mikroprocesoru:

// * * * * * * * * * * * * * * * * * * * * * * * * * Nastaveni preruseni GICR = 0b10000000; // povoleni preruseni INT1 MCUCR = 0b00001010; // aktivace preruseni sestupnou hranou // * * * * * * * * * * * * * * * * * * * * * * * * * Nastaveni casovace T1 TCCR1A = 0b00000010; // Frekvence = F krystal TCCR1B = 0b00011001; // rezim PWM 14 TIMSK = 0b00001000; // preruseni pri preteceni ICR1 = 8000; // 1000 Hz kmitocet PWM // * * * * * * * * * * * * * * * * * * * * * * * * * Nastaveni serioveho kanalu UBRR0H = 0; UBRR0L = 51; // rychlost prenosu 9600 baudu UCSR0B = 0b11011000; // povoleni vysilace a prijimace, preruseni pri vysilani i pri prijmu UCSR0C = 0b10001110; // bez parity, osum bitu

Procesor ATmega16 na analogové desce laboratorního zdroje má zatím tyto úkoly: Po dvou sekundách od zapnutí připojit relé, které zkratuje 10Ω rezistor používaný pro pomalé nabíjení filtračního kondenzátoru. Je použita dvojice 10mF kondenzátorů. Přijímat data z Master procesoru, vyhodnotit zda jsou určena pro analogovou desku a odpovědět vysláním zprávy po sériové lince. To je řešeno funkcemi přerušení od sériového kanálu. Nastavovat DA převodníky podle přijatých dat, periodicky v hlavním programu. V hlavním programu periodicky měřit pomocí AD převodníků, získané údaje ukládat do pole a počítat průměrné hodnoty. Nastavovat relé přepínání vinutí transformátoru, když je požadováno větší napětí. Nastavovat relé přepínání filtrů na výstupních svorkách a relé, které ovládá zesilovač napětí z bočníku pro měření proudu. DA převodník DAC8563 16-ti bitový převodník má dva výstupní kanály, jeden je použit k nastavení napětí, druhý pro nastavení maximálního proudu. Obvod komunikuje po SPI lince procesoru. Takže jsem odněkud opsal jednoduchou funkci pro ovládání SPI:

unsigned char SPI_Send(unsigned char val) SPDR = val; // odesilana data while(!(spsr & (1<<SPIF))); return SPDR; // prijata data

Tuto funkci jsem použil v programu, který ovládá DA převodník:

void DAC8563_Send(unsigned char command, unsigned int val) SPCR = 0b01010100; // zmena dat na vzestupnou hranu CLK, cteni na sestupnou hranu DA_SYNC_clr; SPI_Send( command ); // data pro rizeni prevodniku SPI_Send( val >> 8 ); // horni bajt 16-ti bitoveho prevodniku SPI_Send( val ); // spodni bajt 16-ti bitoveho prevodniku DA_SYNC_set;

Funkce je pravidelně spouštěna v hlavní smyčce programu. Příkaz pro řízení převodníku má hodnotu 0b00011001 pro kanál napětí a hodnotu 0b00011000 pro kanál proudu. Před zahájením práce, někde na začátku programu je potřeba resetovat a nastavit převodník:

DAC8563_Send( 0b00101000, 1 ); // Reset DAC8563_Send( 0b00111000, 0 ); // Disable internal reference DAC8563_Send( 0b00100000, 3 ); // power up DAC-A and DAC-B DAC8563_Send( 0b00000010, 0 ); // Gain = 2 DAC8563_Send( 0b00110000, 3 ); // LDAC pin inaktive for DAC-A and DAC-B

AD převodník ADS8341 I tento obvod pro komunikaci s procesorem používá SPI linku. Akorát data jdou na sestupnou hranu signálu CLK, narozdíl od DA převodníku. Trvalo mi čtyři hodiny, než jsem na to přišel a na začátku funkcí ovládajících převodníky změnil stav registru SPCR, který ovládá SPI linku procesoru. Řídící bity převodníku jsou nastaveny tak, aby byl využíván interní oscilátor (PD1=1, PD0=0). Tomuto nastavení odpovídá polarita sledování signálu BUSY v programu. Referenční napětí převodníku je 2,5V. Převodník tedy měří v rozsahu -2,5V až +2,5V vůči pinu COM. Když je pin COM připojen na referenční napětí, posune se rozsah měřeného napětí o 2,5V nahoru. Takže rozsah měření bude 0 5V s rozlišením 16 bitů.

unsigned int ADS8341_Send(unsigned char command) unsigned int AdVal; SPCR = 0b01011100; //zmena dat na sestupnou hranu CLK, cteni na vzestupnou hranu AD_CS_set; SPI_Send( command ); while( PINB&0x02 ); // ceka na signal BUSY AD_CS_clr; while(~pinb&0x02 ); AD_CS_set; AdVal = SPI_Send( 0 ) << 8; AdVal = AdVal + (SPI_Send( 0 )); SPI_Send( 0 ); AdVal = AdVal - 32768; AD_CS_clr; return ( AdVal );

Příkaz pro řízení AD převodníku může mít tyto hodnoty: 0b10010110 kanál 0: měří napětí z bočníku, zobrazuje proud 0b11010110 kanál 1: měří napětí z děliče, zobrazuje napětí 0b11100110 kanál 3: referenční zdroj REF5025 má na jeden z pinů přiveden analogový teploměr. Výpočet průměrné hodnoty z naměřených dat Hodnoty naměřené AD převodníkem jsou zatíženy šumem. Proto je nutné, aby program počítal průměrnou hodnotu z několika měření. První nápad byl, uložit do pole dat např. 100 naměřených hodnot, ty sečíst a součet vydělit 100. Problém je, že změna mezi dvěma takto získanými průměry může být hodně velká. Chtělo by to vymyslet způsob, jak průměr měnit plynule, po každém měření. Po každém měření přičteme novou hodnotu k součtu VoltageAdd, nebo CurrentAdd. Zároveň je potřeba odečíst hodnotu z druhého konce pole dat. Periodicky spouštěný program pro měření a výpočet průměru je tady:

SREG = 0x00; VoltageActual = ADS8341_Send( AdVoltage ); // data z AD prevodniku CurrentActual = ADS8341_Send( AdCurrent ); SREG = 0x80; VoltageArray[Pointer] = VoltageActual; // ulozeny do pole CurrentArray[Pointer] = CurrentActual; VoltageAdd += VoltageArray[Pointer]; // pricte namerene k prumeru CurrentAdd += CurrentArray[Pointer]; if( Pointer == MaxPointer ) Pointer = 0; // posune ukazatel else Pointer++; VoltageAdd -= VoltageArray[Pointer]; // odecte data z druheho konce pole CurrentAdd -= CurrentArray[Pointer]; VoltageAverage = (unsigned int) ( VoltageAdd / MaxPointer ); CurrentAverage = (unsigned int) ( CurrentAdd / MaxPointer );

Proměnné jsou deklarovány jako 16-ti bitové, jenom součty jsou 32-ti bitové long int. Na obrázku je procesor, převodníky, referenční zdroj. Trimr slouží k nastavení referenčního napětí 2,5V. V horní části obrázku jsou optočleny, které oddělují sériovou linku. Autori článku: František OK2JNJ a Michal OK2HAZ