Sida 1 av 2
Problem med ADC på PIC18F14K50
Postat: 19 augusti 2012, 23:23:50
av Lightsource
Hoppas någon kan hjälpa mig med detta, får inte ADC-läsningen att fungera.
Det som händer är att om jag läser från 2 kanaler så påverkar de varandra, jag får inte 2 separata värden.
Processorn är en PIC18F14K50.
Om jag bara läser vardera för sig så är det inga problem, men försöker jag läsa båda i min reglerloop så påverkar de varandra. Men av de första faktumet kan slutsats dras att kopplingen inte är fel, ingångarna fungerar var för sig.
Min ADC-funktion ser ut såhär:
Kod: Markera allt
unsigned int Read_ADC(u8 ADC_channel){
unsigned int ADRES;
ADCON0 = 0b00000001;
ADCON0 = ADCON0 | (0b00111100 & (ADC_channel << 2));
GODONE = 1;
while(GODONE);
ADRES = ADRESL;
ADRES += (ADRESH << 8);
return ADRES;
}
Ena kanalen är en temperatursensor, andra en potentiometer.
När jag försöker läsa in båda i min reglerloop så påverkar potentiometern temperatursensor-värdet.
Jag har prövat att lägga in "ADRESH = 0; och ADRESL = 0;" men det gör ingen skillnad.
I min reglerloop ligger dessa läsningar:
Kod: Markera allt
temperature.TempC = (Read_ADC(6)*3)/10;
temperature.ad5 = Read_ADC(5);
Kommenterar jag ut någon av dem så blir den andra OK, men det funkar inte att ha med båda.
Har prövat olika hastigheter på reglerloopen utan resultat...
Tacksam för input!
Här är lite register som kan vara intressanta från min initiering:
Kod: Markera allt
ADCON0 = 0b00000001; // A/D CONTROL REGISTER 0
ADCON1 = 0b00000000; //A/D CONTROL REGISTER 1
ADCON2 = 0b10000110; // A/D CONTROL REGISTER 2
Re: Problem med ADC på PIC18F14K50
Postat: 19 augusti 2012, 23:37:05
av Icecap
Har du kondensator som avkoppling på AD-ingångarna? Annars får du just denna påverkan mellan kanalerna.
Re: Problem med ADC på PIC18F14K50
Postat: 20 augusti 2012, 00:11:37
av Lightsource
Nej det har jag inte! Tack för svaret, vilket värde bör jag ha tro?
Vad är det som gör att ingångarna påverkar varandra om man inte har dessa kondensatorer?
Re: Problem med ADC på PIC18F14K50
Postat: 20 augusti 2012, 05:47:48
av Icecap
Rekommenderade värden står i databladet men de vanliga 100nF är helt OK.
Orsaken är att AD-omvandlaren använder en kapacitiv spänningsdelare och därför kan det finnas kvar restladdning helt enkelt. Då kan kanalerna "smitta av" på varandra om det inte är ganska lång tid mellan omvandlingarna.
Re: Problem med ADC på PIC18F14K50
Postat: 20 augusti 2012, 07:22:20
av barbarossa
Jag har för mig att tidiga hårdavarurevisioner av pic18f14k50 hade en del problem i ADC modulen. Kolla errata.
//A
Re: Problem med ADC på PIC18F14K50
Postat: 20 augusti 2012, 08:47:20
av Swech
På AVR är det så att man inte kan växla kanal hursomhelst eftersom AD värdena då
kan bli "tokiga". Man måste följa en viss timing....
Nu kör du ju C och PIC så det är svårt att veta vad som egentligen händer.
Ett förslag att testa är
Kod: Markera allt
temperature.TempC = Read_ADC(6); ; dummy read
temperature.TempC = (Read_ADC(6)*3)/10;
temperature.ad5 = Read_ADC(5); ;dummy read
temperature.ad5 = Read_ADC(5);
swech
Re: Problem med ADC på PIC18F14K50
Postat: 20 augusti 2012, 08:49:45
av sodjan
Jag vet inte hur denna processor eller verktyget du programmerar fungerar,
men har Read_ADC(n) inbyggt "acquisition time" ? Vissa nyare PICs
har automatik för det. Vad händer om du i koden inför en fördröjning
mellan de två mätningarna? Du har väl redan testat det...
Re: Problem med ADC på PIC18F14K50
Postat: 20 augusti 2012, 09:04:02
av Lightsource
Tack för infon!
Jag tittade återigen i databladet, och i avsnittet för ADC nämns inget om sådana kondensatorer. Det som nämns är att en delay behövs när man byter kanal, innan nästa konvertering kan påbörjas.
Men en liten fråga, om jag förstår rätt så ska jag alltså införa en kondensator för varje kanal kopplad mot jord? Jag förstår inte riktigt hur detta skulle ta bort rest-laddningen i den kapacitiva spänningsdelaren i ADC'n (sample & hold-kretsen)? kondensatorn stabiliserar ju bara spänningen in på ingångarna?
sodjan & Swech; Jo jag tror detta har med timing att göra främst. Jag ska labba lite mer med tiderna och se hur det påverkar. Jag har ju ingen automatik för hur lång tid det skall gå från att en mätning är avslutad till att jag påbörjar nästa, bara under själva mätningen då jag pollar "GODONE".
Edit: Den där extra "dummy-mätningen" är ju en bra idé, den skall testas ikväll!
Re: Problem med ADC på PIC18F14K50
Postat: 20 augusti 2012, 09:45:20
av sodjan
Nej, kondingen stabiliserar bara varje enskild kanal för sig ifall
spänningen är väldigt brusig (eller impedansen lite för låg).
Jag tror att det är ett timing problem vid bytet av kanal.
Blir det någon skillnad mellan
temperature.TempC = (Read_ADC(6)*3)/10;
temperature.ad5 = Read_ADC(5);
och
temperature.ad5 = Read_ADC(5);
temperature.TempC = (Read_ADC(6)*3)/10;
D.v.s får du t.ex konsekvent den första mätta kanalens värde på båda?
Läs på om "acquisition time". Och om ACQT och ADCS bitarna i ADCON2.
Beräkningsexempel är lite väl röriga kanjag tycka, men om du kör med
saäg 10-20 us så borde det fugera bättre.
Re: Problem med ADC på PIC18F14K50
Postat: 20 augusti 2012, 11:02:50
av Lightsource
Ok.
Det blir inte någon skillnad om jag kastar om dem, det är som om kanal 5 smittar av sig på kanal 6 om jag kör dem för tätt inpå. Men jag ska göra en djupdykning i timingen så får vi se vad det ger, jag ska även mäta exakt vad jag har för tider.
Re: Problem med ADC på PIC18F14K50
Postat: 20 augusti 2012, 11:19:50
av sodjan
OK.
Det beror ju även på hur snabbt du loopar tillbaka till avläsningen.
Jag antog att det var en paus innan. Om du loopar ganska
snabbt så spelar ju ordningen ingen roll. Däremot är det lite konstigt
att det alltid är just kanal 5 som "styr".
Vad menar du med "smittar av sig". Exakta mätvärden är alltid
bättre än luddiga tolkningar och konstiga otekniska ordval.
> om jag kör dem för tätt inpå.
Vad menar du med det mer exakt ?
Vad är "för tätt inpå" ??
Re: Problem med ADC på PIC18F14K50
Postat: 20 augusti 2012, 11:51:21
av jesse
Har du väldigt hög impedans på temperaturingången?
Påverkas värdet på pot-ingången också när du läser av båda?
Men jag gissar att Swech är något på spåren. Det är något som processorn inte hinner med att nollställa vid kanalbyte och så blir nästa läsvärde fel.
Annars, om det är kapacitansen som spökar: ADC:ns interna kapacitans brukar vara på några tiotal pF. Om du klämmer på en 100nF på ingången kommer laddningen från 100nF att gå över till den interna på nolltid och du får rätt värde. Vad som händer om du inte har en kondensator, är att den interna laddningen påverkar spänningen så det blir en liten spik på ingången - denna räknas med i resultatet.
Re: Problem med ADC på PIC18F14K50
Postat: 20 augusti 2012, 12:03:16
av Lightsource
Ok, jag trodde det var att den interna kapacitansen i sample & hold-kretsen inte hann laddas ur?
Det verkar som båda kanalerna påverkar varandra, som om värdena adderas. Men jag har inte gjort så väldigt många tester, jag ville först veta om jag missat något uppenbart. jag vet t.ex. inte om den går på det högre värdet av de 2, så kan det ju vara.
sodjan; om jag var ute efter en exakt bedömning hade jag mätt upp mer först.
Jag ville i första hand veta om jag missat något simpelt.
Nu har jag fått många bra svar om principerna och ska labba. Men får jag inte till det så kommer jag givetvis mäta upp allt och precisera mer än dessa "luddigheter".

Re: Problem med ADC på PIC18F14K50
Postat: 20 augusti 2012, 12:57:17
av sodjan
> ...inte hann laddas ur?
Inte hinner laddas till rätt värde.
Inte "ur".
> Det verkar som båda kanalerna påverkar varandra, som om värdena adderas.
Vad saker och ting "verkar som" är ointressant. Tala om vilka värden då får!
> jag ville först veta om jag missat något uppenbart.
Hur ska vi kunna veta det?

Re: Problem med ADC på PIC18F14K50
Postat: 20 augusti 2012, 13:53:30
av Lightsource
Men snälla, nu är du lite väl gnällig tycker jag.
Jag la upp min kod, och ville veta om det var något uppenbart fel på den.
Nej jag kan inte testa när jag sitter på jobbet, lugn i stormen.
Och med att laddas ur, enligt databladet så ska "sample & hold"-kretsen laddas ur efter varje mätning, min tanke var att om den inte hann laddas ur så kunde nästkommande värde påverkas av en spänning som ligger kvar där.
Dessutom, jag har ju redan fått de svar jag behöver, vilket jag skrev i tidigare inlägg, och oavsett hur mycket exakta värden vi diskuterat så tycker jag inputen jag fått av både dig och övriga är både matnyttig och intressant, så nu släpper vi detta tills jag testat, OK?