Sida 1 av 1

Metoder för att läsa av flera ADC-ingångar sekventiellt

Postat: 8 juni 2011, 11:16:33
av Korken
Godagens!

Jag har funderat på olika sätt att "parallellt" läsa av ett antal ADC ingångar i bestämda intervaller.
Då detta inte riktigt går så får man köra detta sekventiellt. Men hur brukar ni göra är ni ska ha in flera ADC värden?
För jag själv brukar ha en "trigger-timer" som bestämmer när den ska köras och sedan lite kod i ADCns ISR som får den att automatiskt cykla genom alla ingångar den ska läsa av.

Halvdan PSUEDO-kod (inte riktigt såhär jag brukar göra det, men metoden stämmer iaf):

Kod: Markera allt

 //Säg att vi ska läsa av ADC0, 1 och 2. ADC_MUX = 0 vid initialisering
ADC_VALUES[3] = {0}

TIMER1_ISR: // Oftast fixar hårdvaran detta, men för förståelsens skull får det vara med
	ADC_START_CONVERSION = 1

ADC_ISR:
	static i = 0
	ADC_VALUES[i++] = ADC_RESULT
	ADC_MUX = i

	IF i > 2 THEN:
		i = 0
		ADC_MUX = 0
	ELSE
		ADC_START_CONVERSION = 1
Men jag funderar på om ni har några andra sätt att göra detta på?
Det skulle vara kul och se hur folk brukar göra detta. :)

Re: Metoder för att läsa av flera ADC-ingångar sekventiellt

Postat: 8 juni 2011, 11:25:53
av AndLi
Har sett en hel del HW stöd för sådant, någon där man ställde in start och stop, sen hoppa den automatiskt efter varje.
Tror det gick att kombinera med något freerun mode och dma, så man kontinuerligt fick in nya värden, hur den skötte timeingen grävde jag mig inte ner i.

Men något standardsätt har jag inte, brukar inte använda massor av ADC så ofta..

Re: Metoder för att läsa av flera ADC-ingångar sekventiellt

Postat: 8 juni 2011, 11:56:53
av Icecap
På Renesas M16C ställer man in start- och stopp-kanal, sedan ger man den en startkommando. När alla är omvandlade kommer det en interrupt och varje kanal har ett eget 16-bit register för värdet. Man kan välja mellan att låta den omvandla kontinuerligt på alla kanaler (en åt gången såklart) eller om man vill köra one-shot.

På Fujitsu's FMC16LX får man en interrupt för varje omvandling och kan välja mellan att låta den omvandla nästa kanal automatisk eller att trigga den från mjukvaran.

På PIC använder jag sättet du beskriver: Låt timern trigga en omvandling om det behövs med en lägre hastighet än den har "frittlöpande" och sedan ta hand om nästa kanal och omtriggning i ISR'n.

Re: Metoder för att läsa av flera ADC-ingångar sekventiellt

Postat: 9 juni 2011, 10:31:57
av laban12
Jag har en app där jag använder åtta ADC ingångar.
Löste det ungefär så:

Skapa en åtta bytes cirkulär buffer i RAM.
Skapa en irq-rutin som triggar på ADConversion Completed.
I irq rutinen flytta aktuellt ADC värde till cirkulärbuffer, peka ut nästa ADC kanal och öka cirkulärbufferpekaren.

När jag sedan i programmet behövde något av dessa värden så läste jag dem ur cirkulärbuffern...
Då går adc-omvandlingen hela tiden i sin egen takt i bakgrunden!

Re: Metoder för att läsa av flera ADC-ingångar sekventiellt

Postat: 10 juni 2011, 19:54:54
av Gustav180
Jag gjorde ett sådant kort en gång i tiden som just tog 8 analoga värden i samma tidsögonblick. Varje ingång har en egen S/H-krets som läses samtidigt och sedan kommer ihåg det analoga värdet i en kondensator. Därefter läses S/H-kretsarna sekventiellts av i en ADC och sparas i minne. Du kan nog inte göra det direkt i en PIC, den läser en analog ingång i taget, omvandlar och sparar. Men du kan använda PIC som ADC och låta den läsa av S/H-kretsarna. Det gäller bara att läsningen sker hyfsat snabbt så att sista S/H-kondensatorn inte hinner att ladda ur sig nämnvärt.

Re: Metoder för att läsa av flera ADC-ingångar sekventiellt

Postat: 13 juni 2011, 09:42:35
av Korken
Tackar för lite mer insikt!
Personligen arbetar jag mestadels med AVR och jag ska se om det finns, som ni beskriver det, en start/stop kanal och låta hårdvaran sköta det.
Jag har inte sätt det, men ska läsa igenom databladet igen. För om något sånt finns så vore det guld. :)

Re: Metoder för att läsa av flera ADC-ingångar sekventiellt

Postat: 14 juni 2011, 16:58:28
av Gustav180
Finns där en analog MUX i AVR, så kan du använda den för att läsa in en kanal i taget när de samplats. I annat fall får du lägga dit en sådan också för A/D-omvandlaren.