Analoog- digitaalconversie: een lichtmeter
In deze tutorial maken we een tool waarmee je de hoeveelheid licht kan mee meten. Hiervoor maken we gebruik van een fototransistor die we aansluiten op het Dwengo-bord. Je leert hoe je analoge sensoren kan aansluiten op het Dwengo-bord en hoedat je de ingebouwde ADC-module (Analoog Digitaal Conversie) moet gebruiken.
Benodigdheden
- Een Dwengo-bord
- Een Dwengo-programmer
- De bijbehorende kabels
- Een fototransistor met bijhorende 22 kOhm weerstand, maar ook andere analoge sensoren kunnen gebruikt worden
- Eventueel een Dwengo-breadbord voor het gemakkelijk bouwen van je analoge schakeling en wat draadjes
Uitlezen van analoge sensoren
Het uitlezen van analoge sensoren is met behulp van het Dwengo-bord een eenvoudige zaak. We kunnen immers gebruik maken van de ingebouwde ADC-module (Analoog Digitaal Conversie) van de microcontroller, de PIC18F4550, die het Dwengo-bord gebruikt. Er zijn maar liefst 13 pinnen die gebruikt kunnen worden om analoge sensoren uit te lezen, op het schema aangeduid als AN0-AN12. De analoog-digitaal conversie gebeurt met een nauwkeurigheid van 10 bits.
Naast de standaard-bibliotheek voor de microcontroller en de bibliotheek voor de wachtroutines en het scherm laden we de ADC-bibliotheek in:
#include <p18f4550.h> #include <adc.h> #include <delays.h> #include "lcd.h"
Naast het instellen van de configuratiebits definiëren we weer een macro TRUE.
#define TRUE 1
De hoofdlus starten we met het declareren van de variabele data waarin we de uitkomst van de ADC-conversie zullen in opslaan. Daarnaast doen we de nodige initialisaties voor het LCD-scherm.
void main(void) { int data; initLCD(); clearLCD();
Vooraleer je een analoge waarde van een sensor kan omzetten, dien je de ADC-module van de microcontroller juist te initialiseren met behulp van de functie OpenADC(). Een aantal belangrijke argumenten moeten worden meegegeven:
- ADC_FOSC_64: instellen van de ADC conversieklok, ook wel TAD = ADC_FOSC_64/FOSC. Volgens de PIC18F4550 datasheet
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
. Met 0b1010 geef je aan dat AN0-AN4 wil gebruiken voor analoog-digitaal conversie.
/* ADC_FOSC_64: conversion clock, table 21-1, 1TAD = 1,33 us (has to be between 0,7 us and 25 us) ADC_RIGHT_JUST: least significant bits ADC_6_TAD: acquisition time, 6 TAD's used for good conversion, minimal 1,4 us required ADC_CH0: standaard kanaal waarvan je leest, we kiezen voor AN0. ADC_INT_OFF: no adc-interrupts ADC_VREFPLUS_VDD and ADC_VREFMINUS_VSS: use PIC ground and source as voltage reference 0b1010: pins AN0-AN4 configured as analog input pins */ OpenADC(ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_6_TAD, ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS, 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:
- 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.
- Wachten 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.
- De conversie starten.
- Wachten tot wanneer de waarde is uitgelezen.
- 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.
LCDBacklightOn(); while(TRUE) { clearLCD(); appendStringToLCD("Light: "); SetChanADC(ADC_CH0); // choose ADC channel (override ADC_CH0) Delay10TCYx(150); // wait a bit ConvertADC(); // start conversion while(BusyADC()); // wait for conversion data = ReadADC(); // read result appendIntToLCD(data); Delay10KTCYx(120); // wait 100 ms } CloseADC(); // never called (example purpose only) } // end of main
Vooraleer je het programma kan testen zal je echter een analoge sensor moeten aansluiten op pin AN0 van de uitbreidingsconnector van het Dwengo-bord.
Aansluiten van de lichtsensor
In wat volgt leggen we uit hoe je een analoge sensor kan aansluiten op het Dwengo-bord. Je kan het Dwengo-breadbord gebruiken om de schakeling te bouwen. We leggen dit uit a.d.h.v. de fototransistor.
De fototransistor is een elektrisch element dat meer of minder stroom zal geleiden in functie van het licht. De fototransistor ziet er uit als een LED maar heeft dus een andere werking. Om de stroom door de transistor te beperken dien je deze steeds in combinatie te gebruiken van een weerstand van voldoende grootte, typisch een aantal kOhm. De bedoeling is de schakeling op het volgende schema na te bouwen op het breadbord:

Plooi het lange beentje (de emittor) en het korte beentje (de collector) van de fototransistor zodat je het proper in het Dwengo-breadboard kan prikken. Het lange beentje dien je in een met "-" aangeduid gat te steken van de connector op het Dwengo-breadbord. Als je niet zeker bent, ga dit nauwgezet na op de foto.

Het kort beentje (de collector) prik je in één van de gaatjes van het Dwengo-breadbord en in een gaatje van dezelfde serie prik je eveneens één van de beentjes van de 22 kOhm weerstand. Eveneens van dezelfde serie gaatjes vertrek je met een draadje naar pin AN0 van de connector op het Dwengo-breadboard.
Het andere beentje van de weerstand prik je in een andere serie gaatjes waarvan je eveneens een draadje - typisch rood gekleurd - laat lopen naar één van de pinnen met "+" aangeduid op de connector van het Dwengo-breadbord.
Verifieer of je schakeling overeenkomt met het schema en de foto. Wanneer dit het geval is kan je je bord programmeren en de schakeling testen. Wanneer je je hand over de fototransistor houdt zal je zien dat de op de LCD-scherm weergegeven waarde groot wordt. Schijn je daarintegen met een lichtbron op de fototransistor, dan wordt de weergegeven waarde heel klein. Veel plezier met je lichtmeter!
- Key words:
- Type:

Uw winkelwagen