Simpele A/D-converter voor PIC

Gepost door Jeroen Vreuls op maandag 16 januari 2006

Stel, je hebt een PIC zonder A/D converter maar om een of andere reden moet je een analoog signaal inlezen. De logische stap is dan natuurlijk om voor een paar euro alsnog een PIC mét A/D converter te gaan kopen. Heb je daar geen zin in, dan kun je met deze schakeling met behulp van een paar standaard componenten ook een redelijk nauwkeurige A/D converter toevoegen aan de PIC die je al hebt.

Het idee achter de A/D converter is eenvoudig: met behulp van de PIC ontladen we een condensator. Die laden we vervolgens op via een weerstand met de te meten spanning. De tijd die het duurt voordat de spanning over de condensator weer een bepaald niveau heeft bereikt is gerelateerd aan de te meten spanning.

In z'n simpelste vorm kun je dit doen met twee weerstanden en één condensator, en dan kan het op één PIC pin. De bereikte nauwkeurigheid is dan echter erg laag en het ingangsbereik erg onhandig. Het getoonde schema lost die problemen voor een groot deel op.

Het hart van het schema wordt gevormd door R3/C1. Dit is de RC combinatie waarover opgeladen wordt om de spanning te meten. R4 is de ontlaadweerstand. Deze zorgt ervoor dat de ontlaadpin nooit meer dan 25 mA hoeft te leveren.

Tussen de ingang en R3/C1 is er een inverterende versterker rond T1. Deze verbetert de ingangsimpedantie. De trap is opgebouwd met een PNP transistor omdat op deze manier ook spanningen tussen 0 en 0,7 V kunnen worden gemeten; bij een NPN trap zouden die onder de Vbe drempel vallen.

T2/T3 is een standaard Schmitt-trigger. De Schmitt-trigger wordt hoog bij een spanning van ongeveer 1,7 V. PIC's hebben intern ook Schmitt-Triggers; de drempelspanning daarvan is echter een stuk hoger, wat het meetbereik nadelig beïnvloed.

Het softwaregedeelte van de A/D converter is samengevoegd in drie macro's. De ad_setup macro zorgt voor de setup van TMR0 die wordt gebruikt voor de tijdsmeting. De ad_meting macro voert een meting uit, door de condensator te ontladen en vervolgs te kijken hoe lang het duurt voordat die weer opgeladen is. De ad_interrupt macro is een stukje code dat onderdeel moet zijn van de interrupt handler van het programma dat de A/D converter gebruikt. Dit is nodig om de volgende reden: als er onvoldoende spanning wordt aangeboden, dan zal de condensator nooit opladen tot over de drempel van de Schmitt-Trigger. Om te voorkomen dat de A/D converter dan vastloopt, moet je een timout gebruiken. Als de timeout optreedt, zorgt de interrupt code ervoor dat de condensator geforceerd wordt opgeladen.

Het resultaat van de A/D conversie wordt opgeslagen in variabele ad_waarde. Dit is een getal van 0 tot 160. De waarde 255 geeft aan dat er een fout is opgetreden. Door de constructie van de A/D converter heeft dit getal geen lineair maar een exponentiëel verband met de gemeten waarde. Ijking is nodig om het exacte verband vast te leggen. Een voorbeeld grafiek is getoond in onderstaande figuur.

Simpele A/D-converter voor PIC calibratieSimpele A/D-converter voor PIC calibratie

De code is ontwikkeld en getest op een PIC16F648A draaiend op 20 MHz. Om de converter te testen, kan het demo programma worden gebruikt. Dit demo programma reageert op input van de USART door een A/D conversie uit te voeren en het resultaat in decimale representatie te versturen. De broncode van deze schakeling is hier te downloaden.

Schema Simpele A/D-converter voor PIC

Begroting

Deze schakeling kost ongeveer € 2,00.

Onderdelenlijst

  • R1 = 47 kΩ
  • R2, R4, R7 = 220 Ω
  • R3, R6 = 1 kΩ
  • R5 = 4,7 kΩ
  • R8, R9 = 10 kΩ
  • C1 = 100 nF
  • T1 = BC557B
  • T2, T3 = BC547B