František Pospíšil

Na svých stránkách popisuji cesty, kterými jsem došel k zamýšleným cílům. Cíle se občas během cesty změnily.

ElektronikaLaboratorní zdroj

Laboratorní zdroj – 6. programování DA a AD převodníku

Laboratorní zdroj má na analogové desce procesor ATmega16. Jeho úkoly jsou zatím tyto:

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

laboratorní zdroj

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.

Laboratorní zdroj – 1. úvod

Laboratorní zdroj – 2. popis zapojení

Laboratorní zdroj – 3. volba součástek

Laboratorní zdroj – 4. návrh modulu zdroje

Laboratorní zdroj – 5. komunikace po sériové lince

Laboratorní zdroj – 6. programování DA a AD převodníku

Laboratorní zdroj – 7. regresní funkce měření napětí

6 komentářů: „Laboratorní zdroj – 6. programování DA a AD převodníku

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *