Inkrementální čidlo

Požár Marek, Kaňa Leoš
xkanal03stud.feec.vutbr.cz, xpozar00stud.feec.vutbr.cz 

Obsah:

  1. Úvod
  2. Realizace
  3. Závěr
  4. Soubory
  5. Literatura

Úvod

Projekt se zabývá ovládáním D/A převodníku AD5627 pomocí mechanického inkrementálního čidla. Mechanické inkrementální čidlo P-RES30S je připojeno k mikrokontroleru ATMega128. Mikrokontroler vyhodnocuje směr otočeni a následné ovládání D/A převodníku AD5627. D/A převodník je ovládán pomocí sběrnice I2C. Piny pro I2C komunikaci má mikrokontroler přímo implementovány a vyvedeny na svém chipu. Tento projekt bude použit jako část diplomové práce na téma: Laboratorní zdroj řízený MCU.


Zapojeni inc cidla a prubehy vystupu

Obr.1: Zapojení inkrementálního čidla a průběhy jejich výstupů [1]

Mechanicke inkrementalni cidlo

Obr.2: Mechanické inkrementální čidlo P-RE30S [1]

Realizace

Základní a důležité parametry jsou uvedeny v tabulce Tab1. Inkrementální čidlo je připojeno k mikrokontroleru pomocí 3 pinů. Jeden vývod inkrementálního čídla (vývod A) je připojen na  externí přerušení mikrokontroleru a druhý vývod inkeremetnálního čídla (vývod B) je připojen k normální pinu mikrokontroleru. Jestliže dojde k otočení čidla vyvolá se externí přerušení mikrokontroleru (EXT7) a testuje se druhý pin na který je připojen vývod B daného inkrementálního čidla. Poslední 3 vývod inkrementální čidla (vývod C) je připojen k dalšímu externímu přerušení mikrokontroleru. Slouži pro přepínání „hrubého“ nebo „jemného kroku“ nastavování výstupního napětí.


Napájecí napětí AD5627 5V
Referenční napětí AD5627 5V
Komunikace s mikrokontrolerem Sběrnice I2C
Max. výstupní napětí 5V
Krok D/A převodníku AD5627 12/16bit
Počet kroku na otáčku IR čidla 30
Životnost IR čidla 15000
Max. proud kontakty IR čidla 10 mA
Nízká cena 55 Kč

Tab.1: Přehled důležitých parametrů



Blokový diagram přípravku

Obr.3: Blokový diagram přípravku 


    D/A převodník je ovládán pomocí sběrnice I2C. Paket pro komunikaci s D/A převodníkem má pevně danou délku pro 12,14 nebo 16 bitů. Hodnota pro D/A převodník je inkrementována v externím přerušení mikrokontroleru, které je vyvoláno IR_čidlem.

Výstupní hodnota D/A převodníku je dána pomocí vzorce (1.1):

                                                            Rovnice                                            (1.1)

    Struktura komunikace D/A převodníku s mikrokontrolerem  je na obr. 4. Nejprve je potřeba uskutečnit inicializaci sběrnice I2C. Poté vyslat příkazový  byte. Tento byte obsahuje, které bude bráno referenční napětí, jaký bude zapnutý výstup, nulovaní registru zápisu atd. Poté se vysílá adresovací byte, který obsahuje adresu  zařízení v našem případě adresa AD5627 a nakonec datový byte, který obsahuje hodnotu D (4096 -65535) podle vzorce 1.1, který zajišťuje velikost výstupního napětí s příslušným krokem.

Struktura zapisu na sbernici

Obr.4: Struktura zapisu na sbernici I2C pro AD5627

AD5627 12-bit

Obr.5: Struktura zapisu na sbernici I2C pro AD5627 12-bitová komunikace

    Hlavni program main.c a jeho strukturu lze popsat tímto způsobem. Při zapnutí mikrokontroleru se před vstupem do nekonečné smyčky provede inicializace lcd diplaje a inicializace komunikace po sběrnici I2C. Nastaví se PORTE jako vstupní a vnitřní A/D převodník mikrokontroleru se nastaví na vybraný pin na kterém se měří napětí a také jeho reference. Dále se pošle do D/A převodníku hodnota pro nastavení při prvním spuštění mikrokontroleru.  Poté se nastaví a povolí přerušení INT7, které se využívá pro spuštění testování inkrementálního čidla. Poté se v nekonečné smyčce posílá požadované napětí z inkrementálního čidla do D/A převodníku a zobrazuje se hodnota výstupního napětí na LCD_display.


#include <avr/io.h> 
#include <stdio.h> 
#include <util/delay.h>
#include "lcd_h.h"
#include <avr\iom128.h>
#include <avr\interrupt.h>
#include "DA_prevodnik.h"
#include "i2cmaster.h"

#define ADC_PROUD  0x01                                 //Výběr referenčního vstupu pro A/D převodník
#define ADC_NAPETI 0x02



char buffer[20],buffer_napeti_nast[20],buffer_proudu_nast[20];
   
int proud_nast=10,napeti_nast=430,napeti_poz=0,napeti_rozdil=0;

unsigned int napeti_mer,proud_mer,napeti_display,proud_display; 

int main( void )

{
   
    float napeti_uprava,proud_uprava;
    int jednotky,desitky,jednotky_p,desitky_p;
   
    DDRE=0b00000000;

    lcd_init();
        lcd_clrscr();
 
       i2c_init();
    
      sei();
   
    ADMUX = ADC_NAPETI;  
      ADCSRA = 0xef;
 
      EICRB=0b11001100;
      EIMSK=0b10100000;
   
    DA_prevod(napeti_nast);   
     
   
    while (1)
   
    {

  DA_prevod(napeti_poz);

napeti_uprava =  4.93/ 1024;                             //Konstanta pro převod A/D převodníku
napeti_uprava =  napeti_uprava * napeti_mer     //Vynasobená konstanta se změřenou  hodnoutou z registru ADCW//
napeti_display= napeti_uprava*615;                   //Vynasobení hodnotou 600 pro správné zobrazení na LCD_display//
         
           
        jednotky = napeti_display/100;                   //Převod na celé číslo pro zobrazení napětí na LCD//
        desitky  = napeti_display%100;                  //Převod na desetinné číslo pro zobrazení na LCD//
        desitky  = desitky/10;                                 //Převod na desetinné číslo pro zobrazení na LCD//
        
        lcd_gotoxy(0,0);
          sprintf(buffer,"Vyst. napeti:%02d.%01dV",jednotky,desitky);
          lcd_puts(buffer);
            

    }



}

/*------------- Meřeni napětí a proudu pomocí vnitřního AD převodníku ------------------*/

ISR (ADC_vect)                                                 //přerušení od vnitřního A/D převodníku

{

    ADCSRA=0x6f;

    if (ADMUX==ADC_NAPETI)

        {
       
        napeti_mer=ADCW;
        ADMUX=ADC_PROUD;
       
        }
   
    else

        {

        proud_mer=ADCW;
        ADMUX=ADC_NAPETI;

        }

    ADCSRA = 0xef;

}


/*----------------------- IR_čidlo na nastavení výstupního napětí ----------------------*/

ISR (INT7_vect)                                                //přerušení od inkementální čidla "Napětí"

{


       
    _delay_ms(5);

    if (bit_is_set(PINE,7))

        {
  
        if(bit_is_clear(PINE,2))
 
            {

            napeti_poz+=10;
     
            if (napeti_poz>3000)

                {

                napeti_poz=3000;

                }

             }

   
        else
       
            {

            napeti_poz-=10;

            if (napeti_poz<0)

                {

                napeti_poz=0;

                }
   
            }

        }
        
}



Funkce pro komunikaci s D/A převodníkem jsou umístěny v souboru DA_prevodnik.c. Poslání dat na sběrnici probíhá pomocí  i2c_write(napeti_DA). Zákmity inkrementálního čidla jsou ošetřeny testováním daného pinu přerušení, jestli má skutečně danou hodnotu.

Závěr

Při nahrání kódu do mikrokontroleru se jeho spuštění se provede inicializace. Poté stačí ovládat inkrementální čidlo a zvyšovat tak nebo snižovat výstupní napětí, které je měřené pomocí vnitřního A/D převodníku v mikrokontoroleru ATMega128. Měřené napětí je zobrazeno na LCD_diplady s přesností na 100 mV.

Soubory

Kód hlavního programu (main.c)
Kód D/A převodníku (D/Aprevodnik.c)

Literatura

[1] Mechanické inkrementální čidlo P-RE30S[online]. [citováno 5.5.2010]. Dostupný z WWW: http://www.gme.cz/_dokumentace/dokumenty/532/532-087/dsh.532-087.1.pdf

[2] D/A převodník AD5627[online]. [citováno 5.5.2010]. Dostupný z WWW: http://www.analog.com/static/imported-files/data_sheets/AD5627R_5647R_5667R_5627_5667.pdf