eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaAVR32 UC3B0256, dziwny problem z ADC
Ilość wypowiedzi w tym wątku: 3

  • 1. Data: 2009-08-30 10:21:01
    Temat: AVR32 UC3B0256, dziwny problem z ADC
    Od: "Robbo" <p...@a...nie.mam>

    Witam,

    Pracuję nad układem, którego sercem jest uC Atmel AVR32 UC3B0256.
    Pośród innych, do układu podpięte są tranzystory i diody świecące
    (wyjścia PA05, PA06, PA07, PA08). Wejście PA03 pracuje jako
    wejście przetwornika analogowo-cyfrowego (kanał nr 6). PA04 nie jest
    do niczego podłączone. Mam ponadto podłączony wyświetlacz LCD
    (2x24) obsługiwany za pomocą mojej małej biblioteczki.
    Kwarc 12MHz, uC pracuje na 60MHz.

    Proszę spojrzeć na przykładowy program ilustrujący
    zjawisko, które opiszę poniżej.

    #include <avr32/io.h>
    #include "pm.h"
    #include "gpio.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdarg.h>
    #include "adc.h"
    #include "lcd.h"

    /* w parametrach AVR32studio ustawiono USE_8_BITS_ADC,
    * optymalizacja -O3
    */

    #define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< Default RCOsc frequency.

    #define FOSC0 12000000 //!< Osc0
    frequency: Hz.
    #define OSC0_STARTUP AVR32_PM_OSCCTRL0_STARTUP_2048_RCOSC //!< Osc0
    startup time: RCOsc periods.

    #define ADC_CHANNEL 6
    #define ADC_PIN AVR32_ADC_AD_6_PIN
    #define ADC_FUNCTION AVR32_ADC_AD_6_FUNCTION

    static volatile avr32_adc_t * adc= (volatile avr32_adc_t *) &AVR32_ADC;

    volatile avr32_gpio_port_t *gpio_port_A = &AVR32_GPIO.port[0];

    void localStartPLL(void)
    {
    pm_switch_to_osc0(&AVR32_PM, FOSC0, OSC0_STARTUP);
    pm_pll_setup(&AVR32_PM, 0, // pll.
    9, // mul.
    1, // div.
    0, // osc.
    16); // lockcount.
    pm_pll_set_option(&AVR32_PM, 0, // pll.
    1, // pll_freq.
    1, // pll_div2.
    0); // pll_wbwdisable.
    pm_pll_enable(&AVR32_PM, 0);
    pm_wait_for_pll0_locked(&AVR32_PM);
    pm_gc_setup(&AVR32_PM, 0,1,0,0,0);
    pm_gc_enable(&AVR32_PM, 0);
    pm_cksel(&AVR32_PM,
    0, // pbadiv.
    0, // pbasel.
    0, // pbbdiv.
    0, // pbbsel.
    0, // hsbdiv.
    0); // hsbsel.

    //flashc_set_wait_state(1);
    pm_switch_to_clock(&AVR32_PM, AVR32_PM_MCCTRL_MCSEL_PLL0);
    }


    void initADC()
    {
    // GPIO pin/adc-function map.
    static const gpio_map_t ADC_GPIO_MAP = {
    {ADC_PIN, ADC_FUNCTION},
    };

    // Assign and enable GPIO pins to the ADC function.
    gpio_enable_module(ADC_GPIO_MAP, sizeof(ADC_GPIO_MAP) /
    sizeof(ADC_GPIO_MAP[0]));

    // configure ADC
    adc_configure(adc);

    /* MCK/2, if PRESCAL is 0, and MCK/128, if PRESCAL is set to 63 (0x3F)
    * ADC Clock Frequency 10-bit resolution mode, 5MHz,
    * ADC Clock Frequency 8-bit resoltuion mode, 8MHz
    */
    adc->mr |= 63 << AVR32_ADC_PRESCAL_OFFSET;

    gpio_port_A->puerc = 1 << (ADC_PIN & 0x1F);

    adc_enable(adc, ADC_CHANNEL);
    }


    int main(void)
    {
    char s[25];

    localStartPLL();

    gpio_local_init();

    flashc_set_wait_state(1);

    initLCD();

    initADC();

    gpio_port_A->oders = 1 << ((AVR32_PIN_PA05) & 0x1F);

    gpio_port_A->ovrs = 1 << ((AVR32_PIN_PA05) & 0x1F); // !!!!!!

    while(1) {
    adc_start(adc);
    int aaa = adc_get_value(adc, ADC_CHANNEL);


    setCursorPos(24);
    sprintf(s, "%d ", aaa);
    showString(s);
    }

    return 0;
    }

    Jeżeli uruchomię powyżej przedstawiony program, to na wyświetlaczu LCD
    pojawi się cyfra 4. Potencjometr podłączony do ADC jest skręcony na
    minimum. Warto zauważyć, że PA05 jest ustawiony na 1 -- odpowiednia
    dioda się świeci.
    Teraz załóżmy, że modyfikujemy linię oznaczoną w kodzie znakami !!!!!!
    z:

    gpio_port_A->ovrs = 1 << ((AVR32_PIN_PA05) & 0x1F); // !!!!!!

    na:

    gpio_port_A->ovrc = 1 << ((AVR32_PIN_PA05) & 0x1F); // !!!!!!

    Innymi słowy, dioda podłączona do PA05 nie będzie teraz świecić.
    Co dziwne, teraz na wyświetlaczu możemy odczytać wartość 1, a nie
    4, jak było to uprzednio. (Zjawisko jest powtarzalne).
    Ktoś mógłby powiedzieć, że włączenie tej diody powoduje jakieś
    obciążenie układu i stąd inny wynik z ADC. Ale tak chyba nie jest
    bo po pierwsze wartość w takim przypadku powinna być mniejsza,
    a nie większa, a po drugie sprawdzane były wszelkie napięcia i nie
    wahają się one nawet o miliwolt. Ponadto, ścieżka została przecięta
    przy samym uC, żeby odciąć diodę, tranzystor, itp., ale to w ogóle
    nie wpłynęło na wynik (nadal włączenie PA05 powoduje, że wartość
    odczytana z ADC jest inna, niż w przypadku, gdy PA05 jest wyłączone).
    Dodam, że zjawisko dotyczy także innych wyjść z tranzystorami
    i diodami (PA06, PA07, PA08).
    Co dziwne, jeśli program zmodyfikujemy tak, że zamiast PA05
    sterujemy wyjściem PA04 (do niego nic nie jest podłączone), to
    wartość odczytywana z ADC jest stabilna, niezależnie od tego,
    czy PA04 jest ustawione, czy wyzerowane.

    Pytanie: co może być przyczyną?

    Z góry uprzejmie dziękuję za rady.

    Robbo



  • 2. Data: 2009-08-31 09:32:43
    Temat: Re: AVR32 UC3B0256, dziwny problem z ADC
    Od: Jerry1111 <j...@w...pl.pl.wp>

    Robbo wrote:
    > Ktoś mógłby powiedzieć, że włączenie tej diody powoduje jakieś
    > obciążenie układu i stąd inny wynik z ADC. Ale tak chyba nie jest
    > bo po pierwsze wartość w takim przypadku powinna być mniejsza,
    > a nie większa, a po drugie sprawdzane były wszelkie napięcia i nie
    > wahają się one nawet o miliwolt. Ponadto, ścieżka została przecięta
    > przy samym uC, żeby odciąć diodę, tranzystor, itp., ale to w ogóle
    > nie wpłynęło na wynik (nadal włączenie PA05 powoduje, że wartość
    > odczytana z ADC jest inna, niż w przypadku, gdy PA05 jest wyłączone).
    > Dodam, że zjawisko dotyczy także innych wyjść z tranzystorami
    > i diodami (PA06, PA07, PA08).
    > Co dziwne, jeśli program zmodyfikujemy tak, że zamiast PA05
    > sterujemy wyjściem PA04 (do niego nic nie jest podłączone), to
    > wartość odczytywana z ADC jest stabilna, niezależnie od tego,
    > czy PA04 jest ustawione, czy wyzerowane.
    >
    > Pytanie: co może być przyczyną?

    Uzywam UC3A, ale moje podejrzenie leci na prowadzenie mas w czesci I/O w
    srodku procka (zakladajac ze wyeliminowales pobor mocy z tego pinu
    odcinajac sciezke) - innymi slowy znajdz se pin, ktory tego efektu nie
    ma. Odczyt z ADC spadnie, gdy poplynie dodatkowy prad przez sciezke masy
    podlaczona do wejscia ADC. Troche dziwnie, bo roznica 0x03 dla 8bit i
    3.3V jest 40mV - sprawdzales na innym procku? Sprawdzales czy dla innych
    napiec na ADC zjawisko jest takie same?


    --
    Jerry1111


  • 3. Data: 2009-09-01 13:52:07
    Temat: Re: AVR32 UC3B0256, dziwny problem z ADC
    Od: "Robbo" <p...@a...nie.mam>

    Problem rozwiazany. W programie odczytywalem
    wartosc ADC z pinu PA30 (kanal 6), a potencjometr
    byl podlaczony do PA03. Jakims cudem na pinie PA30
    pojawial sie sygnal, ale przeklamany.


strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: