ADC problem med PIC16F88

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
jfri
Inlägg: 180
Blev medlem: 1 februari 2010, 21:41:20

ADC problem med PIC16F88

Inlägg av jfri »

Försöker använda AN6 st13 på en 16F88 som analog ingång . Med multimeter mäter jag stabilt 1.72 V på denna pinne. Programmet nedan skriver dock ut värden mellan 0 och 170 lite slumpmässigt. Teoretiskt borde det ju bli cirka 360. Om jag kopplar 0 V till AN6 skrivs dock resultat värdet 0 ut konsekvent. AN6 är kopplad till en icke inverterande op koppling med motstånd 1k och 6.1k så ADC borde se en impedans mindre än 10k. Rutinen för att läsa ADC har använts i andra sammanhang och har då fungerat som den ska. Har gått igenom min kod och hittar ingen miss vid konfigureringen av ADCn. Så jag uppleveratt jag fastnat här.

Kod: Markera allt

#include <htc.h>
#include <stdio.h>
#include "usart.h"

#define	_XTAL_FREQ	4000000L

#define	TRUE	1
#define	FALSE	0

__CONFIG(INTIO & WDTDIS & PWRTDIS & BORDIS & UNPROTECT & LVPDIS);

void	Init_PIC()
{
	OSCCON	=0b01100000;			//Klockfrekvens för PIC 4 MHz
	ANSEL	=0b01000000;			//Config AN6 som analog ingång
	ADCON0	=0b01110001;			//FOSC/8 ADC ON CH6
	ADCON1	=0b10000000;			//Right adjusted result ADCS2=0		
	TRISB 	=0b10000100;			//RB2 ingång för RS232 och RB7 för analog funktion för AN6
	init_comms();				//Initera serial AUSART kommunikation	
}

unsigned short	Read_Adc(unsigned char channel)
{
ADCON0 &= 0b01000001;				//clear channel bits
ADCON0  |= (channel<<3);				//set channel
__delay_us(50);
GODONE=1;					// initiate conversion on the selected channel
while(GODONE)continue;
return	(ADRESL | (ADRESH<<8));
}

void	main(void)
{
	unsigned short	adcraw;					//Spara värde från ADC här
	
	Init_PIC();						//Initiera PIC 16F88
	printf("Hello ADC test\n\r");
	do
	{
		__delay_ms(900);	
		adcraw=Read_Adc(6);			//läs kanal 6 AN6
		printf("Temp=%d\n\r",adcraw);		//skriv erhållet värde till PC serieport
	} 	while(TRUE);
}
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: ADC problem med PIC16F88

Inlägg av blueint »

Stabiliserad matning?
Jordning?
EMC?
Avskärmning?
Hur signalen ut i oscilloskop? (multimeter = medelvärdesbildning)
jfri
Inlägg: 180
Blev medlem: 1 februari 2010, 21:41:20

Re: ADC problem med PIC16F88

Inlägg av jfri »

Matning från PICkit 2
Har kollat att stift som ska jordas är det. Också den spänning på 1.72 V jag får är ungefär vad jag teoretiskt förväntar mig från OP kopplingen.
Har tyvärr inget oscilloskop.
Bild visar inte offset trimpot och jordning samt Vcc
[img]
scematic.JPG
[/img]
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: ADC problem med PIC16F88

Inlägg av sodjan »

Det första du ska göra om du vill felsöka är att ersätta hela kopplingen
med en vanlig 5-10 kohm pot. Försök aldrig att felsöka flera olika
varabler/parametrar samtidigt. Se *först* till att få själva ADC'n
att fungera och fundera sedan på opamp kopplingen. Jag skulle
även göra detsamma med koden. Se först till att det fungerar
med en "rak" kod med alla register hårdkodade (inga funktioner,
shift av parametrar o.s.v).
jfri
Inlägg: 180
Blev medlem: 1 februari 2010, 21:41:20

Re: ADC problem med PIC16F88

Inlägg av jfri »

Jag ersatte kopplingen med en vanlig spänningsdelare och resultatet blev precis det teoretiskt förväntade stabila adc värdet utan dessa variationer. OP kopplingen kopplades till en annan analog ingång AN4 och uppvisade där samma onormala beteende.
Så felet ligger uppenbart i op kopplingens hårdvara. Inspänningen till + ingången uppmätes till 218 mV +/- någon mV. Detta är förväntat från LM35 temperatur sensorn vid rumstemperatur. Utgången uppmätes till 2.25 V +/- någon tiondels volt. Uppmätt med multimeter.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: ADC problem med PIC16F88

Inlägg av Marta »

Känner Du till att CA3130 saknar intern frekvenskompensering? Du MÅSTE ha en kondensator mellan pinne 1 och 8 på denna för att den skall vara stabil.

Testa med t.ex. 56pF. Alternativt byt till CA3160, som är samma men med inbyggd kompensering och är stablil ända ned till 1:1 förstärkning. Då Din applikation inte behöver maxxad bandbredd finns det ingen anlening att välja just CA3130. Du måste även ha avkoppling på matningsspänningen till såväl MCU som OP.

Du måste också mäta med oscilloskop för att veta VAD Du mäter. En multimeter säger ingenting om vad det är som mäts. Stabil DC eller självsvängande trasig kretslösning, Du vet inte vilket. Ett primitivt sätt att testa med en multimeter är att se om utspänningen från OP'n ändrar sig när Du håller handen i närheten eller berör något i kopplingen med en isolerad skruvmejsel. I så fall kan Du vara ganska säker på att ha byggt en oscillator istället för en förstärkare.
Skriv svar