pic18F2553 met instabiel resultaat uit ADC

Beste C.O.leden
Ik heb een 18F2553

instellingen:
xtal =20
declare adin_res =12
declare adin_tad = frc
declare adin_stime = 50
adcon0 = 00000000
adcon1 = 00001110 voeding en gnd als vref en Poort AN0 actief
adcon2 = 00000111 frc als clock

programma:
variabele = adin 0
if portc.2 = 1 then print at 1,2,dec variabele

Met een vaste 2.5 volt op de AN0 krijg ik de volgende waardes:
33248
33184
33584
33376
33264
33072
33184
33584
33360
33568
33328

Wat kan ik doen om die waardes dichter bij elkaar te krijgen, of mooier constant te krijgen.
(de waardes zijn normaal niet af te lezen, de 33 cijfers staan vast de andere zijn wazig).
Ik print nu om de zoveel tijd de waarde op het scherm, dit doet een met een externe klok gestuurde uitgang via een ingang op deze pic, dus geen delay.

Lucky Luke

Golden Member

Wat is de maximale waarde die uit je ADC komt? Hoeveel bits is ' ie?
Wat is je referentiespanning?

Als ik uitga van 3.3V referentiespanning en 12 bits, dan komt dat neer op 3v3/4096 = 0,8 mV per bit

Van het rijtje waardes dat je geeft is 33072 de laagste en 33584 de hoogste. Het verschil ertussen is 512 (Hé, dat is toevallig, dat is een mooi rond binair getal, 2^9...), wat neerkomt op 412 mV.

Dan zou je ADC waarde dus bijna een halve volt driften... òf je referentiespanning drift.

In elk geval: zorg dat je referentiespanning goed stabiel is. Haal je die uit de voedingsspanning of heb je er een los referentiespanning-chipje voor?

Wat schrijft de datasheet van die PIC over ADC referentiespanning? (Bij AVR's raden ze een LC filtertje aan als je de adc referentie uit de voeding haalt, of op zijn minst extern een condensatorje op Vref)

Als je referentiespanning en ADC voeding stabiel zijn (100nF dicht bij de chip!) kun je je te-meten-spanning eens gaan bekijken. Is dat DC, dan kan er waarschijnlijk wel een RC netwerkje / laagdoorlaatfilter op. Is het AC, dan moet dat laagdoorlaatfilter zelfs, maar dan om vouwvervorming (aliassing) te voorkomen. (Het filter moet dan frequenties groter dan de helft van je samplefrequentie tegenhouden. Maar het best sample je dus 10x of 20x sneller dan dat je signaal is, dan kun je met een simpeler filter toe)

Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)
Arco

Special Member

Er moest eigenlijk bij zulke vreemde waardes al een lampje gaan branden natuurlijk... ;)
Een 12 bits waarde is maximaal 4096, voor 33000 heb je 16 bits nodig...

Je hebt ADCON2:ADFM bit verkeerd ingesteld, staat op left-justified (moet right justified zijn)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 9 april 2020 11:30:09 schreef Arco:

Je hebt ADCON2:ADFM bit verkeerd ingesteld, staat op left-justified (moet right justified zijn)

Bedankt voor de eerste correctie.
ik heb nu de volgende uitlezingen:
2068
2079
2104
2101
2078
2072
2069
2085

nog steeds niet stabiel
Is dat te veranderen, te verbeteren?

Op 9 april 2020 11:28:52 schreef Lucky Luke:
Wat is de maximale waarde die uit je ADC komt? Hoeveel bits is ' ie? datablad zegt 12
Wat is je referentiespanning? staat in de vraag

In elk geval: zorg dat je referentiespanning goed stabiel is. Haal je die uit de voedingsspanning of heb je er een los referentiespanning-chipje voor? staat in de vraag

Wat schrijft de datasheet van die PIC over ADC referentiespanning? (Bij AVR's raden ze een LC filtertje aan als je de adc referentie uit de voeding haalt, of op zijn minst extern een condensatorje op Vref) datablad geeft aan dat je mag kiezen: vul in in adcon1

Als je referentiespanning en ADC voeding stabiel zijn (100nF dicht bij de chip!) kun je je te-meten-spanning eens gaan bekijken. Is dat DC, staat in de vraag dan kan er waarschijnlijk wel een RC netwerkje / laagdoorlaatfilter op.

declare adin_res =12
adcon1 = 00001110 voeding en gnd als vref en Poort AN0 actief
Met een vaste 2.5 volt op de AN0

Arco

Special Member

Heb je een stabiele referentiespanning voor de a/d converter?
Als je gewoon Vcc en Vss van de controller gebruikt zonder verdere maatregelen, dan zal 't niet veel beter worden dan dit.

Verschil tussen 2068 en 2104 = 36. Dat is bij 3.3v: (3.3/4096) * 36 = 29mV. (da's gewoon de ruis die op de voedingsspanning zit.
Je zult de A/D converter een eigen stabiele en schone referentiespanning moeten geven voor een beter resultaat.

(je kunt proberen of voeden uit een batterij al een verbetering geeft)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Lucky Luke

Golden Member

Op 9 april 2020 11:30:09 schreef Arco:
Er moest eigenlijk bij zulke vreemde waardes al een lampje gaan branden natuurlijk... ;)
Een 12 bits waarde is maximaal 4096, voor 33000 heb je 16 bits nodig...

En daar heb ik dus straal overheen gekeken... Ben ik getal-dyslectisch ofzo?

Anyway. ADFM staat nu goed, dan komt het alsnog aan op een stabiele referentiespanning en een (anti-aliassing)filter

Je referentie is dus je voedingsspanning. Staat die op een losse pin waar je eventueel een R/C of L/C netwerkje voor kunt zetten, of heb je die mogelijkheid niet?

Waar komt die 2.5V vandaan? Spaningsdeler uit dezelfde voeding? Andere voeding? 2.50V referentie?

Goed, goed, het "staat in de vraag" - dan is mijn antwoord "zie datasheet". Oh, en of het te verbeteren is? Ja hoor.

Als je trouwens alleen 2.5V wilt meten, heb je die hele adc niet nodig. 3103, klaar. Volgende!

Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)

Op 9 april 2020 11:54:23 schreef Arco:
Heb je een stabiele referentiespanning voor de a/d converter?
Als je gewoon Vcc en Vss van de controller gebruikt zonder verdere maatregelen, dan zal 't niet veel beter worden dan dit.

Ik gebruik de voeding en gnd zoals je mag kiezen in adcon1.
Ik zal eens wat proberen met een ref voltage, ik meen daar nog wel wat voor te hebben.
Bedankt voor de tip
sluit je dan die ref spanning aan op ref + (an3) en de gnd als gnd?
Krijg je dan adcon1= 0001 1011

Op 9 april 2020 12:00:18 schreef Lucky Luke:
[...]

Als je trouwens alleen 2.5V wilt meten, heb je die hele adc niet nodig. 3103, klaar. Volgende!

Lijkt me de enige manier om te kijken of je achter de oorzaak van een storing kan komen, door een vaste spanning aan te bieden.

[Bericht gewijzigd door stortbak op donderdag 9 april 2020 12:08:09 (23%)

Arco

Special Member

VRef+ ja,

Je moet ook voldoende dikke/korte verbindingen gebruiken voor Gnd anders krijg je ook problemen.
(op een breadboard krijg je waarschijnlijk ook geen stabiel geheel. Je kunt 't proberen met zo kort mogelijke verbindingen)
Ook altijd beide Vss/Gnd verbindingen van de chip aansluiten. tussen Vss en Vdd een 100nF zo dicht mogelijk op de pic.

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 9 april 2020 12:13:27 schreef Arco:
VRef+ ja

De REF03 (2,50V) geeft geen verbetering en ook de beperking dat je 3.4 volt niet meer kan verwerken.
Omdat je bij 2,5 al volle schaal hebt.

Nog andere ideeën ?

Heeft het nog wat te maken met frequentie en sample time of is dat nvt wanneer je proton het commando geeft adin 0?

Ik heb me suf gebladerd op dit forum maar kan geen voorbeelden vinden waarbij je "op commando van een ingang 1 meting doet".

Weet iemand wel waar dat eerder beschreven staat?
iets met GO/DONE en ADON wellicht?
Dat heb ik nog niet eerder gebruikt.

Lambiek

Special Member

Op 9 april 2020 11:08:02 schreef stortbak:
voeding en gnd als vref

En wat is de voedingsspanning op de Vref?? Dat zie ik nog nergens of ik moet er overheen kijken. :)

Als je haar maar goed zit, GROETEN LAMBIEK.
Arco

Special Member

Vref+ aan Vdd via een rf bead of varkensneusje en aan de vRef pin een 1uF folie of chip condensator (naar Gnd) geeft meestal al een hele verbetering...

https://media.rs-online.com/t_large/F8997280-01.jpg

Als je niet zo'n grote resolutie nodig hebt (is nu 0.8mV/bit), kun je het resultaat ook naar rechts shiften (met >> 4 wordt 't 8 bits)

[Bericht gewijzigd door Arco op donderdag 9 april 2020 14:14:04 (24%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
paaltje73

Golden Member

Weet iemand wel waar dat eerder beschreven staat?
iets met GO/DONE en ADON wellicht?
Dat heb ik nog niet eerder gebruikt.[/quote]

In de Data Sheet!
Voorzetje,
WHILE 1 = 1

SET ADCON0.0 ' zet adc aan (ADON)
DELAYMS 10 ' acquisition time.
SET ADCON0.1 ' Start Conversion (GO bit)
WHILE ADCON0.1 = 1: WEND ' conversion finished ???
CLEAR ADCON0.0 ' zet adc uit (ADON)
MWnieuw = ADIN 0 ' haal het resultaat.

IF MWnieuw <> MWOud THEN GOSUB Printen
MWOud = MWnieuw
WEND

Op 9 april 2020 16:21:04 schreef paaltje73:

Voorzetje,

Bedankt, dit werkt. (ook met een wachttijd van 2µs, want "delay" hoort niet in een programma!)
Op dezelfde manier als normaal,
maar met veel tekst en dus zonder toegevoegde waarde.
Maar: ik heb geprobeerd of dat beter resultaat gaf: niet dus. :)

Op 9 april 2020 12:00:18 schreef Lucky Luke:
[...]
Oh, en of het te verbeteren is? Ja hoor.

Zou je dan alsjeblieft willen vertellen hoe?

Arco

Special Member

Je moet stabielere spanningen hebben voor een 12 bits A/D. Of gebruik anders maar 8 bits, dan krijg je een redelijk stabiel getal...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Niemand heeft het nog over je ingangscircuit... hoe ziet dat eruit? Is je meetspanning hoogohmig? Zit er een C'tje aan?

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein