PIC16F877 ADC ulykkesfugl

B

bagud

Guest
Hej alle,
Jeg er desperat leder efter arbejde kode 16F877 ADC.Jeg ønsker at vise den analoge værdi på 3-cifret LED-display.Når jeg vise det, det virker fint, men når tilførslen analoge værdi ændres, skærmen bliver uregelmæssig.Hvis det viser 100 som den analoge værdi, og når jeg udvider det så displayet viser følgende værdier.

100
101
102
99 <
104
105
106
103 <
108
109
110
107
112
113
114
111 <

Ingen, der har haft lignende problemer???

 
Det er svært at sige noget uden at kigge på din kode, men bemærk, at allevalue - it's a clue.

fjerde værdi viser den fjerde foregående
værdi - det er et fingerpeg.
Har du nogen operationer på data fra ADC, der kan påvirke det?

/ Rambo

 
Der kan være støj på dine input, men så igen det kan være din kode både hard ware og software skal ses her.Deres 5 volt regulator kan være svingende.Du vil måske ikke give den ADC nok tid til at prøve fuldt ud.Vi har brug for at se din kode.

 
Her er koden for ADC.

//===================================
//----- ADC intialisation funktion ----
void ADC_init (void)
(
//---- Initialise ADC ----
ADCON1 = 0x09; / / - RA0-RA4 OG RE0 er Analoge indgange, resten er alle digitale benene på PORTA
ADCON0 = 0x80; / / - Nulstil til standard

ADCS1 = 1; //--|
/ / |---- Prøve klokken = fosc/32 = 20MHz/32 = 1.2us
ADCS0 = 0; //--|
Adon = 1 / / - Slå ADC OM

)

//----- Læse ADC på RA0 ----
unsigned long Sample_ADC (unsigned int kanal)
(
unsigned long ADC_VALUE;
ADRESL = 0;
ADRESH = 0;

DelayUs (20);
/ * CHS0 = 0;
CHS1 = 0;
CHS2 = 0; * /
if (kanal == 0)
(
CHS0 = 0;
CHS1 = 0;
CHS2 = 0;
)
else if (kanal == 1)
(
CHS0 = 1;
CHS1 = 0;
CHS2 = 0;
)
else if (kanal == 2)
(
CHS0 = 0;
CHS1 = 1;
CHS2 = 0;
)
else if (kanal == 3)
(
CHS0 = 1;
CHS1 = 1;
CHS2 = 0;
)
/ * Else if (kanal == 4)
(
CHS0 = 0;
CHS1 = 0;
CHS2 = 1;
)
else if (kanal == 5)
(
CHS0 = 1;
CHS1 = 0;
CHS2 = 1;
) * /

DelayUs (20) / / - Sikre tilstrækkelig prøveudtagning
ADGO = 1 / / - Drej ADC Converter On
while (ADGO) / / - Vent til omstilling til at fuldføre
(
DelayUs (20);
)
ADC_VALUE = ADRESL;
ADC_VALUE = (ADRESH <<

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Kølig" border="0" />

;
return (ADC_VALUE); //--- return resultat ----
)Tilføjet efter 3 minutter:Anden forespørgsel:

Hvordan kan jeg reducere flimren i displayet, dvs., Når værdien ændringer i de sidste ciffer, dvs., 100 til 101 eller så, det sidste ciffer blinker mellem 0 og 1 Hvordan reducerer jeg det?

 
Hej

U kan have et kig på din hardware også.
Der kan være nogle noice genereres i det.Kontrollér, at.

og kommer til at vise du kan vente til engang at få din værdi stablize.
for eksempel hvis der er den værdi, at få ændret bare meningsmåling igen og sikre, at værdien er permanent ændrede det kan gøres i softwaren.

men jeg Tro dine udsving i adc værdier kan være påvirket af din hardware også lige have et kig.

hilsen
Gopi

 
Opladning tid, der kræves for ADC er typisk 10uSec "PER" kanal min.Du er prøveudtagning 3 kanaler udseende kun giver 20us prøve tid for alle 3 kanaler.Fysisk, kan du ikke prøve 3 kanaler i 20uSec
Prøv sekvensering operationerne.

/ / Eksempel

switch (adch ) / / 01xxx001
(Case 0:
adcon0 = 0b01000001; / / set_adc_channel (0);
break;
case 1:
read_adc (ADC_START_ONLY);
break;
case 2:
adcraw [0] = adresse;
adcon0 = 0b01001001; / / set_adc_channel (1);
break;
case 3:
read_adc (ADC_START_ONLY);
break;
case 4:
adcraw [1] = adresse;
adcon0 = 0b01010001; / / set_adc_channel (2);
break;
case 5:
read_adc (ADC_START_ONLY);
break;
case 6:
adcraw [2] = adresse;
adcon0 = 0b01011001; / / set_adc_channel (3);
break;

 
Hvordan får du de værdier, 100, 101 etc?Jeg mener, skal du gøre noget med ADC_VALUE
før det er dispalyed?

Grunden til jeg spørger er fordi du ADFM til 0, hvilket betyder, at
Resultatet fra ADC vil blive overladt berettiget, dvs de 6 laveste bits i ADRESL vil være 0.
Det betyder, at den laveste værdi (bortset fra 0) fra ADC vil blive 0000000001000000b
der er 64.Skal jeg ikke hellere være 1?Du kan prøve og sæt ADFM til 1 og se om det løser
problemet med det samme.Hvis ikke, har vi også brug koden til skærmen del ...

<img src="http://www.edaboard.com/images/smiles/icon_wink.gif" alt="Wink" border="0" />/ Rambo

 
Hej,
Jeg er direkte under de 10 bit ADC værdi og vise det som decimaltal (interval fra 0 til 1.024, men at vise dem i tre-cifret display, så fra 000 til 999)

Problemet med spring værdier er blevet fastsat, når jeg har ændret tidsforsinkelse fra 20 mikro sek til 40 mikro sek.

Tak til SAR.

Nu kan nogen råd mig om, hvordan man stopper den flimren i displayet, dvs., Når værdien ændres, det holder flimrende mellem den gamle værdi og nye værdi (det sidste ciffer i displayet) Kan nogen uddybe teknikker for at undgå dette? ?

 
Hvor ofte har du opdatere din skærm?
I mit eget display rutiner jeg kun opdatere skærmen hver 0,5 sekund, som du
behøver ikke mere hyppige opdateringer og også for at spare CPU-tid.

 

Welcome to EDABoard.com

Sponsor

Back
Top