PIC18F452 A/D konvertering

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Danish to

Threaded View
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 <pic18.h>
#include <stdio.h>

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<<8)|adc_l; //højre justeret
    volts=0;
  for(decivolts=(resultat*10*5/1023);decivolts>10%;decivolts-10%)
  {
   volts++;
  }

    sprintf(msg,"%cHEX værdi: %03X A2D = %d.%d
volts",0x0D,resultat,volts,decivolts);
    puttekst(msg);
    delay();  //2 delays giver ca 30 ms
    delay();

 } while(1);

}

Jeg troede i første omgang at problemet lå i min "2x8 bit registre til en 10
bit omsætning", men har testet det, og det virker. Det ser ud som om
konverteren ikke følger med i spændingsændringerne, og giver en afvigelse på
ca 500 mV indtil 1,25 V, og noget større afvigelser op efter. Har nogen en
ide om hvad det er jeg laver forkert? Eventuelt en tutorial på hvordan man
man laver sådan en konvertering



Re: PIC18F452 A/D konvertering
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

Quoted text here. Click to load it

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.

Quoted text here. Click to load it

MVH Jakob Fromm

Re: PIC18F452 A/D konvertering
Quoted text here. Click to load it


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...

Quoted text here. Click to load it



Re: PIC18F452 A/D konvertering
Quoted text here. Click to load it

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

Re: PIC18F452 A/D konvertering
Quoted text here. Click to load it

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:
<citat>
For correct A/D conversions, the A/D conversion clock
(TAD) must be selected to ensure a minimum TAD time
of 1.6 μs.
</citat>

Re: PIC18F452 A/D konvertering
Quoted text here. Click to load it

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?



Re: PIC18F452 A/D konvertering
Quoted text here. Click to load it

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.

Quoted text here. Click to load it

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

 > Er der fidus i at
Quoted text here. Click to load it

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

Re: PIC18F452 A/D konvertering

Quoted text here. Click to load it

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)



Re: PIC18F452 A/D konvertering
Quoted text here. Click to load it

    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
MZ ETZ 300 CDi ReedValve, MZ TS 250/1 Supra5
We've slightly trimmed the long signature. Click to see the full one.
Re: PIC18F452 A/D konvertering
Quoted text here. Click to load it

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

Re: PIC18F452 A/D konvertering
Quoted text here. Click to load it


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



Re: PIC18F452 A/D konvertering
Quoted text here. Click to load it
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

Re: PIC18F452 A/D konvertering
Quoted text here. Click to load it
Jeg ønsker jer al held med jeres projekt.
Fortæl os om, hvordan det gik.
VH

Site Timeline