SVETELEKTRO

10. apríla 2016   Verzia pre tlač Verzia pre tlač

Laboratorní zdroj – 4. část


ok2jnj

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.
 

Master_koncept
 

V hlavní smyčce programu, kterým ovládám laboratorní zdroj, se věnuji hlavně zobrazování na displeji:

 

 

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:

Master_displej


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:

sériová komunikace
 

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.

 

 

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

 

 

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

 

 

Nakonec ještě nastavení registrů mikroprocesoru:

 


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:

 

 

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

 

 

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:

 

 

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

 

 

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:

 

 

Proměnné jsou deklarovány jako 16-ti bitové, jenom součty jsou 32-ti bitové long int.
 

OLYMPUS DIGITAL CAMERA


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

Ako sa vám páčil tento článok?
  • Páči sa mi (1)
  • Súhlasím (0)
  • Zábavné (0)
  • Informatívne (0)

Pridaj komentár