PIC18F452 A/D konvertering

Hejsa,

I forbindelse med et projekt arbejder jeg med en PIC 18F452, og skal lave noget A/D konvertering. Jeg har slet ikke noget erfaring med sådan en konvertering. Jeg har lavet en test opstilling, hvor jeg sender DC spænding til AN0 mellem 0-5 V. Men jeg får noget upræcise resultater. Selvom de målte og de aflæste digitale værdier passer ikke helt sammen får jeg nogenlunde fornuftige resultater spændinge under 1,25 V. Jeg programmererer i C (Hi-tech C); et udsnit af mit test program:

#include #include

void putch(unsigned char byte); void puttekst(const char *tekst); void init(void);

void putch(unsigned char byte) { while(!TXIF); /* set when register is empty */ TXREG = byte; /* output one byte */ TXIF=0; }

/* Output a string via the serial port */ void puttekst(const char *tekst) { while(tekst && *tekst) putch(*tekst++); }

void init(void) { TRISC=0x80; // RC7/TX indgang, resten er udgang TXEN=1; // enable serial port transmissions SPEN=1; //Serial Port Enable bit, serial kommunikation er aktiveret TXIE=0; // not interrupt driven

TRISA=0x2F; // RA0 input, resten output TRISE=0x07;

ADCON0=0b00000001; // ADON =1, kanal 0 ADIE=0; /* not interrupt driven */

ADCON1=0b10000000; // Højre justeret, 6 mest betydende bits in ADRESH er nul, delay(); // vent 12.86 us acqusition time. }

void main(void) { unsigned int resultat; unsigned int adc_h; unsigned int adc_l; unsigned char volts; unsigned char decivolts; unsigned char msg[50];

init();

do { GODONE=1; //konvertering start while(GODONE)continue; //vent indtil konverteringen er færdig ADIF=0; // interrupt flag nulstilles

adc_h = ADRESH; adc_l = ADRESL;

resultat = (adc_h

Reply to
Flemming Hansen
Loading thread data ...

Har godt nok kun leget med PIC18F458, men manualen er den samme til begge to, så vil da give et bud på en løsning

Jeg synes din init af din ADC er lidt lille.. Fra et gammelt project har jeg

void adcInit(void) { ADCON1bits.ADCS2 = 0 ; //TAD valgt til 3.2us ADCON0bits.ADCS1 = 0 ; ADCON0bits.ADCS0 = 1 ; ADCON0bits.CHS0 = 0 ; // Kanal 1 valgt ADCON0bits.CHS1 = 0 ; ADCON0bits.CHS2 = 0 ; ADCON0bits.ADON = 1 ; // AD converter powered on ADCON1bits.ADFM = 1 ; // Right justified ADCON1bits.PCFG3 = 0 ; // Analog inputs on whole channel A ADCON1bits.PCFG2 = 0 ; ADCON1bits.PCFG1 = 0 ; ADCON1bits.PCFG0 = 0 ; }

Har du husket at sætte ADCS til en gylding værdi. Din ADCON1 indeholder andet end information om højre og venstre justering, og ADCON0 indehloder andet end valg af kanal. Det er sikkert her det er galt.

MVH Jakob Fromm

Reply to
Jakob Fromm

Jeg har gennemtænkt alle konfigurations bittene og har ikka bare vælgt kanal :o) Jeg ville bare ikke komme ind i alle detaljer. :) Så vidt jeg kan se, der kun er 2 forskelle i vores initialiseringer. Jeg har vælgt kanal 0, altså AN0, du har vælgt kanal 1; det skulle ikke gøre det store forskel. Og jeg har vælgt konverteringsfrekvensen til at være Fosc/2, du har vælgt Fosc/8. Altså min konverterings frekvens skulle gerne være højere end din. Min PIC 18F452 køre med en 10MHz extern krystal, altså me PLL kør den med 40 MHz. Hvis man måler en DC spænding. Jeg vil prøve med en anden klokke deling end Fosc/2 og se om det er problemet...

Reply to
Flemming Hansen

Du her checket at du ikke er over max. frekvens på AD konverteren?

Reply to
HKJ

Jeg mindes at minimums tiden for en måling skal være 1.6us. Dette vil forklare hvorfor du får den ovennævnte fejl (kondensatoren i indgangen skal simpelthen ikke nå at lade op, løst fortalt.) Prøv at sætte konverteringstiden til mininum 1.6us

Side 248 i databladet:

For correct A/D conversions, the A/D conversion clock (TAD) must be selected to ensure a minimum TAD time of 1.6 ?s.

Reply to
Jakob Fromm

Det kan være at jeg har misforstået noget. I følge mine beregninger grænsen for "minimum TAD" var ved Fosc/16, og man skulle konvertere med højere hastighed. Derfor for at være på den sikre side har jeg valgt Fosc/2 til min test opstilling. Skulle jeg have vælgt f.eks. Fosc/64? Er der fidus i at vælge lavere konverterings frekvens end det man skal bruge? Måske for at udføre andre ting i PIC'en imens?

Reply to
Flemming Hansen

Dette er forkert.. PIC'en tager noget tid om at aflæse inputtet på kanalen, (mener det sker ved at lade en kondensator op), og dette skal der afsættes tid til. I dit tilfælde ville jeg vælge en Tad på 16 T Osc (se tabellen side 248 i datablad). Dette er det hurtigste du kan sample.

Med en 64 T Osc vil du ihvertfald være sikker på at det ikke er hastigheden der bremser dig.

Man vælger vel den laves konverteringstid der er tilladt alt efter hvilken applikation systemet skal anvendes i. Hvis det bare er for at tage en måling en gang imellem (monitorering af et eller anden lavfrekvent) vil jeg personlig mene at en måletid på 10 us ikke er noget problem.

MVH Jakob Fromm

Reply to
Jakob Fromm

Jeg skal bruge MPU'en(kør med 40 MHz) til at måle lydtryk, og ifølge kravspecifikationen skal den kunne måle lydsignale mellem 20 Hz-20KHz, dvs i følge Nyquist teorem skal den konvertere med mindst 40 KHz, og hvis jeg ikke har regnet forkert skulle Fosc/16 være go' nok. Men tak for forklaringerne; nu har jeg ihvertfald bedre styr på konverteringsfrekvens :o)

Reply to
Flemming Hansen

hmmmm, der ville jeg nok lure på om en ekstern ADC ik vil være en bedre løsning, til formålet, eller kigge på en PIC30Fxxxx i stedet.

--
VH
Lars Molnit
 Click to see the full signature
Reply to
Moller

Lydtryk på et 20kHz signal. Javel, men skal du kunne måle det for hver "sinus-top"? Kan du ikke leve med at dit system kræver flere "sinus-toppe", derved nedsætter du kravet til din øvre grænsefrekvens.

Jerg kender ikke ADC'en i denne processor, men hvis ADC'en er af den kapacitive convertertype, så kan også have det problem, at ADC'en belaster din kilde under konverteringen. Det har jeg oplevet på en C167. Det kunne måske være det samme her? I det tilfælde kan en buffer eller en sugekreds til stel klare det.

Hvad er f-øvre grænse for dit anti-alias filter? - nej det spurgte jeg ikke om!

VH

Reply to
Klaus C Nielsen (DK)

Så meget teknik på en gang :) Dette skulle være et "opvarmnings projekt" på et højere gående uddannelse, og mens de andre grupper beskæftiger sig med emner som termometer, eller voltmeter, har min gruppe valgt at lave lydtryksmåler.Vi har mikrofon, og har designet en forstærker kreds vha opamps. Nu har jeg løst problemet og fik konverteren til at virke takket være jeres svar. Jeg ved ikke hvordan konverteren reagerer på en 20 KHz signal, men det finder vi ud af i morgen

Reply to
Flemming Hansen

Forslag:

  1. trin : højpasfilter (Op-Amp) 20Hz, til at fjerne lavfrekvent støj!
  2. trin : tabsfri ensretter (Op-Amp)
  3. trin : lavpas filter efter med en afskæringsfrekvens under 20Hz Resultat: dc-værdi der er proportionalt med lydtrykket, og som ikke kræver hele cpu-kraften! Du kan fx. sample hver 50. millisekund, og ikke tabe information...

mvh. Kåre

Reply to
Kåre

Jeg ønsker jer al held med jeres projekt. Fortæl os om, hvordan det gik. VH

Reply to
Klaus C Nielsen (DK)

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.