Inlezen van analoge signalen met behulp van de ADC

Met behulp van de Dwengo-bibliotheek kan je heel gemakkelijk de analoge sensoren uitlezen die aangesloten zijn op kanaal AN0-AN4 zonder je zorgen te maken over allerlei technische details. Op deze pagina gaan we in meer detail en leggen we uit hoe je zelf de ingebouwde ADC-module (Analoog Digitaal Conversie) moet instellen en hoe je alle ADC-kanalen kan benutten. Op de PIC18F4550 zijn er immers maar liefst 13 pinnen die je kan gebruiken om analoge sensoren uit te lezen. De analoog-digitaal-conversie kan gebeuren met een nauwkeurigheid van 10 bits.

Om de routines voor analoog-digitaal-conversie te gebruiken moeten volgende bibliotheken ingeladen worden:

  1. #include <p18f4550.h>
  2. #include <adc.h>
  3. #include <delays.h>

Na het initialiseren van de ADC-module met OpenADC(), kan je de analoge waarde van een sensor inlezen. Een aantal belangrijke argumenten moeten worden meegegeven met OpenADC():

  • ADC_FOSC_64: instellen van de ADC-conversieklok, ook wel TAD = ADC_FOSC_64/FOSC. Volgens de PIC18F4550 datasheet External link moet 1 TAD een waarde tussen 0,7 us en 25 us hebben. Aangezien we FOSC met behulp van de configuratiebits ingesteld hebben op 48 MHz bekomen we als TAD 1,33 us wat mooi binnen de opgegeven grenzen ligt.
  • ADC_RIGHT_JUST: enkel de minst significante bits gebruiken. Echter bij het gebruik van de functie ReadADC() heeft dit geen invloed en worden alle 10 bits als waarde teruggegeven.
  • ADC_6_TAD: acquisitietijd, minimaal 1,4 us zijn vereist om goede ADC te kunnen doen. Door 6 TAD's te gebruiken voldoen we zeker aan deze voorwaarde.
  • ADC_INT_OFF: geen gebruik maken van ADC-gebaseerde interrupts.
  • ADC_VREFPLUS_VDD: de positieve spanning van de microcontroller (5 V) gebruiken als positieve referentiespanning.
  • ADC_VREFMINUS_VSS: de negatieve spanning van de microcontroller (de grond, 0 V) gebruiken als negatieve referentiespanning.
  • 0b1010: hiermee kan je aanduiden welke pinnen op poort A je gebruikt om analoge sensoren op aan te sluiten (zie register 21-2 in de PIC18F4550 datasheet External link. Met 0b1010 geef je aan dat AN0-AN4 wil gebruiken voor analoog-digitaal-conversie. Maar met bijvoorbeeld 0b0010 geef je aan dat je alle 13 de ANx-pinnen wil gebruiken.
  1. /*
  2.   ADC_FOSC_64: conversion clock, table 21-1, 1TAD = 1,33 us (has to be between 0,7 us and 25 us)
  3.   ADC_RIGHT_JUST: least significant bits
  4.   ADC_6_TAD: acquisition time, 6 TAD's used for good conversion, minimal 1,4 us required
  5.   ADC_CH0: standaard kanaal waarvan je leest, we kiezen voor AN0.
  6.   ADC_INT_OFF: no adc-interrupts
  7.   ADC_VREFPLUS_VDD and ADC_VREFMINUS_VSS: use PIC ground and source as voltage reference
  8.   0b1010: pins AN0-AN4 configured as analog input pins
  9.   */
  10. OpenADC(ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_6_TAD,
  11. ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS,
  12. 0b1010); // Configuring ADC

Uiteindelijk komen we tot het uitlezen van de sensor zelf. We zullen de sensor continu uitlezen, zolang het Dwengo-bord onder spanning staat, en telkens de uitgelezen waarde naar het scherm schrijven.

Het uitlezen van een analoge sensor gebeurt typisch in 5 stappen:

  1. Kies het kanaal (of de poort) dat je wil uitlezen. We kiezen voor AN0. Merk op dat de standaard-poort is waarvan we lezen zoals we ingesteld hebben met de functie OpenADC(). In feite zouden we deze stap in dit voorbeeld kunnen overslaan. De stap is echter belangrijk indien je meerdere sensoren zou willen uitlezen met het Dwengo-bord.
  2. Wacht tot het juiste kanaal geselecteerd werd door de microcontroller. Doordat de pinnen belast zijn neemt dit enige tijd in beslag, het is aangewezen een beetje te wachten.
  3. De conversie starten.
  4. Wachten tot wanneer de waarde is uitgelezen.
  5. Uitlezen van de waarde en opslaan in een variabele. Met de functie ReadADC() lees je alle 10 bits uit. Je krijgt dus een waarde tussen de 0 en 1023 terug. Hierbij komt 0 overeen met 0 V en 1023 met 5 V zoals ingesteld werd met ADC_VREFPLUS_VDD en ADC_VREFMINUS_VSS bij het initialiseren van de ADC-module. Merk op dat de analoog-digitaal-conversie lineair verloopt en dat 512 dus overeenkomt met 2,5 V.
  1. SetChanADC(ADC_CH0); // choose ADC channel (override ADC_CH0)
  2. Delay10TCYx(150); // wait a bit
  3. ConvertADC(); // start conversion
  4. while(BusyADC()); // wait for conversion
  5. data = ReadADC(); // read result

Met behulp van CloseADC() kan de ADC-module gesloten worden wat handig is als je sommige pinnen slechts tijdelijk wenst te gebruiken voor analoog-digitaal-conversie (en na de analoog-digitaal-conversie de pinnen als digitale ingang of uitgang te gebruiken).