Da li bi mi neko mogao odgovoriti u cemu je problem kada se vrsi AD konverzija, a rezultat je nestabilan. Pokusavam da napravim uredjaj za merenje temperature, na USB portu, uz mogucnost pamcenja kompletnog merenja u tabeli i grafickog prikaza merenja. Uredjaj ima 8 kanala. Deo na PC sam realizovao u VB.net. To je u redu. Koristim pic18f4550 i PicBasicPro. Tokom konverzije na razvojnom sistemu, kada okrecem trimer rezultat je u redu, ali mi nije jasno zbog cega je kada na taj isti port dovedem recimo napon sa baterije od 1.5V taj napon nestabilan, i iznosi 1,46 pa u sledecem merenju 1,43 pa 1,45 pa 1,46 i tako ciklicno se ponavljaju te vrednosti. Kada napon pretvorim u temperaturu, imam odstupanja od skoro 1 C izmedju dva merenja. Mislim da je nesto u vezi vremena smirivanja AD konvertora na pic-u, ali nikako da uspem to da smirim. Inace koristim 10bitni AD konvertor. Pokusao sam i sa 8bitnim, ali nisam imao veceg uspeha osim sto sam malo smanjio te nestabilnosti, dodavajuci neke pauzice izmedju konvertovanja. Ako bi neko mogao da mi kaze na sta da obratim paznju, ili se vec susretao sa ovakvim problemom, zamolio bih za pomoc.Hvala unapred. Kod u PICBASICu je sledeci
DEFINE OSC 8 'Oscilator
Define ADC_BITS 10 'Broj bita AD konvertora
Define ADC_CLOCK 1 'Klok (Oscilator /8)
AD_Rez_1 VAR WORD 'Rezultat AD konverzije
AD_Rez_2 VAR WORD 'Rezultat AD konverzije
AD_Rez_3 VAR WORD 'Rezultat AD konverzije
AD_Rez_4 VAR WORD 'Rezultat AD konverzije
AD_Rez_5 VAR WORD 'Rezultat AD konverzije
AD_Rez_6 VAR WORD 'Rezultat AD konverzije
AD_Rez_7 VAR WORD 'Rezultat AD konverzije
AD_Rez_8 VAR WORD 'Rezultat AD konverzije
USBBufferSizeMax con 18 ' Maksimalna velicina bafera
USBBufferSizeTX con 18 ' Ulaz
USBBufferSizeRX con 18 ' Izlaz
'USB baferi
USBBuffer Var Byte[USBBufferSizeMax]
USBBufferCount Var Byte
ADCON1 = %00000111
'Odabiranje pojedinih AD kanala
ADCON0 = %00000001 'Odabran kanal AN0 na RA0 pinu i omogucun
'A/D modul
ADCON0 = %00000101 'Odabran kanal AN1 na RA1 pinu i omogucun
'A/D modul
ADCON0 = %00001001 ' Odabran kanal AN2 na RA2 pinu i omogucen
'A/D modul
ADCON0 = %00001101 'Odabran kanal AN3 na pinu RA3 i omogucen
' A/D modul
ADCON0 = %00010001 'Odabran kanal AN4 na pinu RA5 i omogucen
'A/D modul
ADCON0 = %00010101 'Odabran kanal AN5 na pinu RE0 i omogucen
'A/D modul
ADCON0 = %00011001 'Odabran kanal AN6 na pinu RE1 i omogucen
'A/D modul
ADCON0 = %00011101 'Odabran kanal AN7 na pinu RE2 i omogucen
'A/D modul
ADCON2 = %10010001 'Desno poravnanje, oscil Fosc/8
Pause 1000
usbinit 'inicijalizacija USB-a
Pocetak:
ProgramStart:
gosub DoUSBIn
goto ProgramStart
'Podprogram za citanje podataka sa PC-a
DoUSBIn:
USBBufferCount = USBBufferSizeRX 'Velicina RX bafera
USBService 'Odrzi konekciju
USBIn 1, USBBuffer, USBBufferCount, DoUSBIn 'Procitaj podatke
If USBBuffer[0] = 254 Then
Gosub DoUSBOut
Endif
Return
'Podprogram za upis podatana na PC-u
DoUSBOut:
USBBufferCount = USBBufferSizeTX 'Velicina TX bafera
USBService 'Odrzi konekciju
USBBuffer[0]=254
'Realizacija AD konverzije
ADCIN 3, AD_Rez_1 'Izvrsi konverziju na RA3 i 10 bita
'rezultata smesti u AD_Rez_1
adcin 2, ad_rez_2 'Izvrsi konverziju na RA2 i 10 bita
'rezultata smesti u AD_Rez_2
adcin 1, ad_rez_3 'Izvrsi konverziju na RA1 i 10 bita
'rezultata smesti u AD_Rez_3
ADCIN 0, AD_Rez_4 'Izvrsi konverziju na RA0 i 10 bita
'rezultata smesti u AD_Rez_4
adcin 4, ad_rez_5 'Izvrsi konverziju na RA5 i 10 bita
'rezultata smesti u AD_Rez_5
adcin 5, ad_rez_6 'Izvrsi konverziju na RE0 i 10 bita
'rezultata smesti u AD_Rez_6
ADCIN 6, AD_Rez_7 'Izvrsi konverziju na RE1 i 10 bita
'rezultata smesti u AD_Rez_7
adcin 7, ad_rez_8 'Izvrsi konverziju na RE2 i 10 bita
'rezultata smesti u AD_Rez_8
'Smestanje rezultata konverzije
USBBuffer[1]=AD_rez_1.LowByte 'Nizi bajt rezultata smesten u USBBuffer[1]
USBBuffer[2]=AD_rez_1.HighByte 'Visi bajt rezultata smesten u USBBuffer[2]
USBBUFFER[3]=AD_REZ_2.LOWBYTE
USBBUFFER[4]=AD_REZ_2.HIGHBYTE
USBBUFFER[5]=AD_REZ_3.LOWBYTE
USBBUFFER[6]=AD_REZ_3.HIGHBYTE
USBBUFFER[7]=AD_REZ_4.LOWBYTE
USBBUFFER[8]=AD_REZ_4.HIGHBYTE
USBBUFFER[9]=AD_REZ_5.LOWBYTE
USBBUFFER[10]=AD_REZ_5.HIGHBYTE
USBBUFFER[11]=AD_REZ_6.LOWBYTE
USBBUFFER[12]=AD_REZ_6.HIGHBYTE
USBBUFFER[13]=AD_REZ_7.LOWBYTE
USBBUFFER[14]=AD_REZ_7.HIGHBYTE
USBBUFFER[15]=AD_REZ_8.LOWBYTE
USBBUFFER[16]=AD_REZ_8.HIGHBYTE
USBOut 1, USBBuffer, USBBufferCount, DoUSBOut 'Posalji podatke PC-u
PAUSE 1000
Return
DEFINE OSC 8 'Oscilator
Define ADC_BITS 10 'Broj bita AD konvertora
Define ADC_CLOCK 1 'Klok (Oscilator /8)
AD_Rez_1 VAR WORD 'Rezultat AD konverzije
AD_Rez_2 VAR WORD 'Rezultat AD konverzije
AD_Rez_3 VAR WORD 'Rezultat AD konverzije
AD_Rez_4 VAR WORD 'Rezultat AD konverzije
AD_Rez_5 VAR WORD 'Rezultat AD konverzije
AD_Rez_6 VAR WORD 'Rezultat AD konverzije
AD_Rez_7 VAR WORD 'Rezultat AD konverzije
AD_Rez_8 VAR WORD 'Rezultat AD konverzije
USBBufferSizeMax con 18 ' Maksimalna velicina bafera
USBBufferSizeTX con 18 ' Ulaz
USBBufferSizeRX con 18 ' Izlaz
'USB baferi
USBBuffer Var Byte[USBBufferSizeMax]
USBBufferCount Var Byte
ADCON1 = %00000111
'Odabiranje pojedinih AD kanala
ADCON0 = %00000001 'Odabran kanal AN0 na RA0 pinu i omogucun
'A/D modul
ADCON0 = %00000101 'Odabran kanal AN1 na RA1 pinu i omogucun
'A/D modul
ADCON0 = %00001001 ' Odabran kanal AN2 na RA2 pinu i omogucen
'A/D modul
ADCON0 = %00001101 'Odabran kanal AN3 na pinu RA3 i omogucen
' A/D modul
ADCON0 = %00010001 'Odabran kanal AN4 na pinu RA5 i omogucen
'A/D modul
ADCON0 = %00010101 'Odabran kanal AN5 na pinu RE0 i omogucen
'A/D modul
ADCON0 = %00011001 'Odabran kanal AN6 na pinu RE1 i omogucen
'A/D modul
ADCON0 = %00011101 'Odabran kanal AN7 na pinu RE2 i omogucen
'A/D modul
ADCON2 = %10010001 'Desno poravnanje, oscil Fosc/8
Pause 1000
usbinit 'inicijalizacija USB-a
Pocetak:
ProgramStart:
gosub DoUSBIn
goto ProgramStart
'Podprogram za citanje podataka sa PC-a
DoUSBIn:
USBBufferCount = USBBufferSizeRX 'Velicina RX bafera
USBService 'Odrzi konekciju
USBIn 1, USBBuffer, USBBufferCount, DoUSBIn 'Procitaj podatke
If USBBuffer[0] = 254 Then
Gosub DoUSBOut
Endif
Return
'Podprogram za upis podatana na PC-u
DoUSBOut:
USBBufferCount = USBBufferSizeTX 'Velicina TX bafera
USBService 'Odrzi konekciju
USBBuffer[0]=254
'Realizacija AD konverzije
ADCIN 3, AD_Rez_1 'Izvrsi konverziju na RA3 i 10 bita
'rezultata smesti u AD_Rez_1
adcin 2, ad_rez_2 'Izvrsi konverziju na RA2 i 10 bita
'rezultata smesti u AD_Rez_2
adcin 1, ad_rez_3 'Izvrsi konverziju na RA1 i 10 bita
'rezultata smesti u AD_Rez_3
ADCIN 0, AD_Rez_4 'Izvrsi konverziju na RA0 i 10 bita
'rezultata smesti u AD_Rez_4
adcin 4, ad_rez_5 'Izvrsi konverziju na RA5 i 10 bita
'rezultata smesti u AD_Rez_5
adcin 5, ad_rez_6 'Izvrsi konverziju na RE0 i 10 bita
'rezultata smesti u AD_Rez_6
ADCIN 6, AD_Rez_7 'Izvrsi konverziju na RE1 i 10 bita
'rezultata smesti u AD_Rez_7
adcin 7, ad_rez_8 'Izvrsi konverziju na RE2 i 10 bita
'rezultata smesti u AD_Rez_8
'Smestanje rezultata konverzije
USBBuffer[1]=AD_rez_1.LowByte 'Nizi bajt rezultata smesten u USBBuffer[1]
USBBuffer[2]=AD_rez_1.HighByte 'Visi bajt rezultata smesten u USBBuffer[2]
USBBUFFER[3]=AD_REZ_2.LOWBYTE
USBBUFFER[4]=AD_REZ_2.HIGHBYTE
USBBUFFER[5]=AD_REZ_3.LOWBYTE
USBBUFFER[6]=AD_REZ_3.HIGHBYTE
USBBUFFER[7]=AD_REZ_4.LOWBYTE
USBBUFFER[8]=AD_REZ_4.HIGHBYTE
USBBUFFER[9]=AD_REZ_5.LOWBYTE
USBBUFFER[10]=AD_REZ_5.HIGHBYTE
USBBUFFER[11]=AD_REZ_6.LOWBYTE
USBBUFFER[12]=AD_REZ_6.HIGHBYTE
USBBUFFER[13]=AD_REZ_7.LOWBYTE
USBBUFFER[14]=AD_REZ_7.HIGHBYTE
USBBUFFER[15]=AD_REZ_8.LOWBYTE
USBBUFFER[16]=AD_REZ_8.HIGHBYTE
USBOut 1, USBBuffer, USBBufferCount, DoUSBOut 'Posalji podatke PC-u
PAUSE 1000
Return