Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

LPC1768 - błędne wartości z ADC

genzi 25 Cze 2010 11:12 1461 2
  • #1 25 Cze 2010 11:12
    genzi
    Poziom 9  

    Witam,

    mam problem z przetwornikiem ADC w LPC1768.
    W instrukcji użytkownika LPC1768 jest napisane, że ADC jest 12-bitowy ale gdy wartość rejestru danych ADGDR jest równa 0x3FF (10 bitów !!!) jest to już napięcie bliskie/równe Vrefp. W moim przypadku z rejestru ADGDR odczytuję wartości większe od 0x3FF.
    Na wejście przetwornika podaję napięcie zmienne o wartości maksymalnej 1,75V (sprawdzone przy pomocy oscyloskopu), natomiast moja zmienna "maxVoltage" jest równa 3,3V. Proszę o pomoc.

    Code:

    const float maxAdcBits = 4095.0f; // Using Float for clarity
    const float maxVolts = 3.3f;      // Using Float for clarity ( VREFP = 3,3V)
    const float voltsPerBit = (maxVolts / maxAdcBits);

    uint16_t AD_last;

     void ADC07_init (void) {

      LPC_PINCON->PINSEL0 &= ~(3<<4);      /* P0.2 is GPIO                      */
      LPC_PINCON->PINSEL0 |=  (2<<4);      /* P0.2 is AD0.7                     */

      LPC_SC->PCONP       |=  (1<<12);      /* Enable power to ADC block          */

      LPC_ADC->ADCR        =  (1<<7) |     /* select AD0.7 pin                   */
                              (4<< 8) |     /* ADC clock is 25MHz/5               */
                              (1<<21);      /* enable ADC                         */

      //LPC_ADC->ADINTEN     =  (1<< 8);      /* global enable interrupt            */
      LPC_ADC->ADINTEN = 0x00000180;
      NVIC_SetPriority(ADC_IRQn, 0x1F);
      NVIC_EnableIRQ(ADC_IRQn);             /* enable ADC Interrupt               */
    //  LPC_ADC->ADCR |= (1<<16);          //ciagla konwersja
    }

    void ADC_IRQHandler(void) {

            AD_last = (LPC_ADC->ADGDR>>4) & 0xFFF;/* Read Conversion Result             */

            yourVoltage = AD_last * voltsPerBit;
            if(yourVoltage>maxVoltage)
                    maxVoltage = yourVoltage;
    }

    [/code]

    0 2
  • #2 28 Cze 2010 10:14
    flapo213
    Poziom 21  

    Witaj,

    nie za bardzo rozumiem Twój problem, max. wartości powinna być wartość 0x1000hex co zresztą masz zdefiniowane ...4095. Uderza mnie jeden fakt nie znam tego procka ale czemu podajesz napięcie zmienne na ADC. Ja póki co się nie spotkałem z procesorem który by mierzył napięcie zmienne a tymbardziej ujemen względem masy.

    Sprecyzuj

    Pozdrawiam

    0
  • #3 28 Cze 2010 11:59
    genzi
    Poziom 9  

    Witam,

    jeśli chodzi o maksymalną wartość rejestru danych podaną w dokumentacji jako 0x3FF to jest to błąd, ponieważ wcześniejsze procesory miały ADC 10-bitowy i wartość 0x3FF nie została poprawiona na 0xFFF. Na wejście przetwornika podaję napięcie z przedziału od 0V do maksymalnie 1,75V. Napięcie na wejściu nie jest bliskie Vrefp, wiec w rejestrze danych nigdy nie powinna pojawic sie wartość 0x0FFF co ma miejsce.

    0