PIC 16F88 analoge ingang te grof en in stappen

Heren en dames(?), graag wat hulp bij de PIC 16F88 met Analoge ingang.
Ik heb bij PICbasic de 16F628 leren gebruiken en ben nu ivm het ontbreken van analoge ingangen op de 628, de 88 gaan proberen.

Het lijkt allemaal te werken, maar nu het probleem.
Eerst wat achtergrond informatie: ik heb een modelstoominstallatie en daar ben ik de keteldruk en de branderkraan aan elkaar aan het koppelen.
Als de druk te ver op loopt regelt een servo de gaskraan, echter deze kan ook zover dichtgaan dat de vlam uit gaat.
Nu heb ik een thermokoppel geplaatst en wil ik met de 16F88 die miliVolt waarde gaan gebruiken als terugkoppeling dat als die spanning onder een bepaald niveau daalt dat dan de servo toch (ondanks de te hoge druk) weer verder openstuurt.

Nu heb ik bij 0 tot 12mV een uitlees waarde op het PIC display van 0000
van 12 tot 17mV een waarde van 01
van 17 tot 22mV een waarde van 02
van 22 tot 27mV een waarde van 03
van 27 tot 32mV een waarde van 04

Wat kan ik veranderen om een continue waarde te krijgen?
Nu zit er tussen 17 en 22 mV verschil geen verandering in de waarde die de PIC uitstuurt (leest), dit is veel te grof.

Het volgende programma zit erin.
Best mogelijk dat er daar wat fout zit, gelieve dit dan ook te melden.
Alvast bedankt.

pic basic code:


DEVICE 16F88               
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF, MCLR_OFF, HS_OSC 
 ALL_DIGITAL TRUE              
 XTAL 20

 
SYMBOL Potmeter     = PORTA.3 
DIM Meting          AS WORD   
DIM PotmeterInst    AS WORD   
DIM BD1             AS BYTE   

PORTA  = %00000000
PORTB  = %00000000
TRISA  = %11001110            
ADCON1 = %00001000            
ANSEL  = %00001110            
CLEAR                         
DELAYMS 500                  
CLS  
                         
PRINT AT 1, 2, "Analoog:"     
PRINT AT 2, 1, "Potmeter:"

FOR BD1 = 1 TO 4              
  LED = ~LED                  
  DELAYMS 300                 
NEXT

WHILE 1 = 1
  Meting = ADIN 1     
  PotmeterInst = ADIN 3   
  PRINT AT 2, 11, DEC4 PotmeterInst
  PRINT AT 1, 11, DEC4 Meting
WEND

[Bericht gewijzigd door Henry S. op dinsdag 31 juli 2012 19:22:41 (1%)

Deze mc heeft een 10-BIT ADC = 1024 stappen, dus 4.88 mV per stap.

Wat is de waarde van de pull down / up weerstand?

Read the fuc.... manual and read the fuc.... datasheet! {Proton IDE: V2.0.1.2 / Proton Compiler: V3.5.4.5}

Nu heb ik een thermokoppel geplaatst

Die zul je moeten versterken, Maxim bv heeft daar mooie ic's voor:

http://www.maxim-ic.com/datasheet/index.mvp/id/7273

It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
Arco

Special Member

Je moet de A/D conversie wel op 10 bits zetten, en Tad instellen (aquisition delay).
En stop een delay in die while loop. Nu lees/schrijf je als een wilde de A/D en het display...

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

Golden Member

Ik mis je declare's, zie hiervoor de handleiding van proton. ADCON1 staat nu dat je een externe Vref- gebruikt. ook na de ADIN een korte delay plaatsen.

Voorbeel:

pic basic code:

Device = 16F877
Declare Xtal = 4
Declare Adin_Res = 10 ' 10-bit result required
Declare Adin_Tad = FRC ' RC OSC chosen
Declare Adin_Delay = 50 ' Allow 50us sample time

Dim Raw as Word
Dim Volts as Float

Symbol Quanta = 5.0 / 1024 ' Calculate the quantising value

Cls

TRISA = %00000001 ' Configure AN0 (PortA.0) as an input
ADCON1 = %10000000 ' Set analogue input on PortA.0

While 1 = 1
 Raw = Adin 0
 Volts = Raw * Quanta
 Print At 1,1,Dec2 Volts,"V "
Wend
People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years

Stan, bedankt voor deze info.
Duidelijk dat mijn toepassing niet werkt met de 16F88.

Roland, ik wilde een simpele besturing maken, zonder een extra IC.

Arco en marcob, met die waardes had ik al geëxperimenteerd en die gaven geen verandering.

Dan ga ik toch maar verder met de wel werkende versie met de 16F628 en een extra AD converter (ADC0804), helaas kost het dan maar een IC extra.
(kosten zijn het niet, maar je moet het wel weer op een printje plakken, dat dan ook weer in de boot extra plaats in neemt die al bijna op is)

Ik zal nog kijken naar een ander thermokoppel, mogelijk zijn er die meer spanningsverschil geven bij een kleinere temperatuur verandering.

Voor de belangstellenden is hier een verslag van de ombouw naar RC-besturing van het schip:

stoomsleper

Arco

Special Member

Het heeft weinig nut, om als je programma niet werkt een andere MCU of A/D te kiezen. Je kunt beter kijken wat er mis is... (Een ADC0804 is trouwens 8 bit, dus dan wordt de boel nog 4x zo grof...)

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

Overleden

Op 30 juli 2012 16:34:26 schreef Stan1:
Deze mc heeft een 10-BIT ADC = 1024 stappen, dus 4.88 mV per stap.

Wat is de waarde van de pull down / up weerstand?

Kan je de Vref niet op 1024 (of 256) mV zetten. dan heb je 1 (of 0.25) mV/stap.

wat is de max waarde (mV) die van de thermokoppel afkomt ?

Wie de vraag stelt, zal met het antwoord moeten leren leven.

Arco, ik heb nu een werkende schakeling met de volgende gegevens:
2mV (uit thermokoppel)-0 (decimale waarde)
10-5
15-10
20-13
25-16
30-20
35-23
40-28
Met ook tussen liggende waardes (traploos dus).

Shiptronic, wil je vertellen hoe ik die Vref zou moeten afstellen dan.(hoe stel je dat in)
Is voor mij de eerste keer dat ik met dit soort dingen bezig ben.
Waar is eventueel een voorbeeld met de gebruikte codes?

Als de brander volaan werkt heb ik iets van 30 mV
onder de 22 (exacte waarde ondervind ik pas tijdens inregelen en testen) is eigenlijk kritisch.
Ook een beetje afhankelijk van hoever ik die kop in de vlam heb (bij een rode kop geeft hij 40 mV, maar dat lijkt me niet best voor de levensduur)

Arco

Special Member

Je zou het signaal eigenlijk 100x moeten versterken, dan krijg je 3 volt. (Da's een wat betere waarde voor een AD converter...). 30mV is gewoon te weinig om een betrouwbaar/nauwkeurig AD resultaat te krijgen...

De ingang is niet te grof, maar het signaal veel te klein... ;)
(Er staat meestal al meer als 30mV ruis op de Vdd van de processor)

[Bericht gewijzigd door Arco op maandag 30 juli 2012 20:10:35 (24%)

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

Het is maar net hoe nauwkeurig je wilt/moet meten.
Als je perse een extra ic wilt vermijden kun je bij een moderne PIC (bijvoorbeeld de 16F1825) de interne Vref instellen op 1.024V.
Dan krijg je dus 1 stap per mV.

Bedankt voor de reacties.
Ik heb ondertussen zelf ontdekt dat als ik in de
ADCON1 = %10110000 aangeef dat 4 en 5 ééntjes zijn dat het wel werkt.
Verder leg ik de Vref- ingang aan de gnd
en zet ik met een instelpot circa 250mV op de Vref+ ingang.
Dat geeft dan bij een thermokoppel waarde van 5mV een waarde van 6; 8=19; 15=50; 25=92.
Dat zijn waardes waarmee ik vast wel verder kan.
Bij een nog lagere Vref+ waarde krijg ik grotere getallen uit het thermokoppel.

Arco

Special Member

Eerst het signaal versterken is een stuk beter. Als je zo'n lage VRef gebruikt, wordt de zaak al gauw onstabiel, of je moet een heel erg stabiele VRef hebben. Bij 250mV is 1 A/D stapje maar 244µV...

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

Moderator

Idd, maak met een TL431 een mooie 2.5V referentie.

73's de PA2HS - ik ben een radiohead, De 2019 CO labvoeding.
Shiptronic

Overleden

Op 30 juli 2012 21:47:15 schreef stortbak:
[...]

hiermee?

Zo zou het moeten, en als ref, deze : http://www.voti.nl/winkel/p/IC-MCP1541.html

ook word vaak in de DS vermeld om de uP in sleep modus te zetenom storing van uP zelf te voorkomen.

The A/D converter has a unique feature of being able
to operate while the device is in Sleep mode. To operate
in Sleep, the A/D conversion clock must be derived
from the A/D’s internal RC oscillator.

[Bericht gewijzigd door Shiptronic op dinsdag 31 juli 2012 23:02:14 (24%)

Wie de vraag stelt, zal met het antwoord moeten leren leven.

Op 31 juli 2012 22:57:03 schreef Shiptronic:
http://www.voti.nl/winkel/p/IC-MCP1541.html

Het lijkt me zinvol om die nog te plaatsen, er zit nu een 25 slagen pot als spanningsdeler.
Heb nu als voeding een 7805 die gevoed wordt uit een 12V accu.

Resultaat van de schakeling:

http://www.youtube.com/watch?v=jTBAtrLtzjI

Shiptronic

Overleden

leuk dat het nu werkt, wat is de uiteindelijke schakeling geworden ? geworden

Wie de vraag stelt, zal met het antwoord moeten leren leven.

Aanvulling laatste bericht en nieuwe vraag:

De nu werkende pic heeft het volgende
ANSEL = %00001101 ;Analoog input alleen PORTA.0 , 2 en 3 voor Vref (de REST DIGITAL INPUT)
ADCON0 = %10000000 ;Analog Channel=AN0---
ADCON1 = %10110000 ;Vref+ en Vref- (5 en 4)
ADIN_RES = 10 ;10-bit result required
ADIN_TAD = FRC
ADIN_STIME 50

Met Vref- aan de gnd (ik had natuurlijk ook de adcon1 kunnen veranderen)
Met de Vref+ aan een 250mV

===========================================================================
Meerdere spanningen meten met 1ADC

Ik ben druk met een volgend project en daar loop ik tegen het "probleem" aan dat ik bij 3 analoge ingangen een Vref+ nodig heb van 250 mV.
Een andere Analoge ingang heeft een Vref+ nodig van minimaal 3.5 V (daar gebruik ik de +5V voor.

Verder heb ik (tot nu dan) 4 analoge ingangen en naar wat ik begrepen heb maar één ADC per PIC (16F88 en 16F883).
Databladen zijn voor mij net geen russisch, maar echt makkelijk informatie daaruit halen lukt me niet.
Volgens mij is adcon0 om de juiste ingang te benoemen die de ADC moet gebruiken, maar hoe kan je die laten schakelen tussen de ingangen en hoe weet je dan welk uitgangssignaal bij welke ingang hoort.

Wie helpt me op weg met codes (liefst in Basic als dat nodig is) van hoe ik schakelen kan tussen de analoge ingangen en of ik met een comperator mogelijk toch nog het mV signaal kan gebruiken. met een Vref+ van 5V.

Ziet er allemaal heel erg leuk uit, maar ik ben heel benieuwd naar het schema van je schakeling. Heb je nu een versterker gebruikt? Doe je ook iets aan koude las compensatie en hoe doe je dat dan? Gebruik je een opzoek tabel en meet je de temperatuur van de koude las? of houd je temperatuur van de koude las constant? Hoe zorg je voor stabiliteit?

PIC16F88
thermokoppel aangesloten op pin 17 (min van het t.koppel aan de gnd)
Vref- pin 1 aan de gnd
Vref+ pin 2 aan de +250mV (potmeter als spanningsdeler)

Niets met compensatie dus.
Wel of geen vlam let niet zo nauw.

http://www.modelbouwforum.nl/forums/members/baggeraar-albums-stoomsleper-schaal-1-op-12-picture118270-herschaalde-kopie-van-schema-26-aug-2012.jpg

Het huidige "probleem":
Ik heb ondertussen gewoon 2 spanningen op de pic gezet als analoog ingang, de pic schakelt zelf.

Hoef er dus niets aan te programmeren.
Blijft nog wel de vraag staan over de (hoge) Vref+ en het erg lage analoge signaal.

Je Vref aanpassen aan je erg kleine signaal is een slecht idee. Bedenk dat je al veel ruis op je signaal hebt staan, en nu ook op je Vref. Je komt nu ook in de problemen omdat je 2 signalen hebt die niet dezelfde orde-grootte hebben. Ik vraag je zelfs af of 250mV als Vref wel binnen de specs valt.

Beter: gebruik een "normale" Vref spanning, bv de 5V voeding, of de interne bandgap in de controller. Dat is meestal 1.024, of 4.096 of zo (he, mooie getallen he?!). Daarbij breng je je meetsignalen in deze ADC range mbv een opamp of zo. De nauwkeurigheid van je meting wordt zo ENORM veel groter.

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

Een thermocouple direct op je cpu ingang is geen goed idee inderdaad. Ik zou toch voor een versterker gaan hoor. En dat hoeft echt niet lastig te zijn. De spanning die een thermocouple afgeeft is zo extreem klein dat de altijd aanwezige ruis snel alles overstemt. Heb je andere dingen zoals electromotoren in de buurt draaien of zenders en andere cpu's? dan zit je al snel in de problemen.

Een opamp zal al deze problemen kunnen oplossen. Het is ook leuk om de vlamtemperatuur op een display te kunnen aflezen. Als het alleen maar is om de boel uit te zetten bij geen vlam zou je misschien beter een constructie zoals die in een badgeiser zit kunnen gebruiken. Dan is er geheel geen electronica nodig. En wordt het erg simpel en degelijk.

Wel of niet voldoen aan de specs?????????????
Het werkt al een paar jaar zonder storing.

Als je die thermokoppelspanning in een opamp versterkt, wordt toch ook je "ruis" versterkt?

Is nog al afhankelijk van waar de ruis op de lijn komt. Als dat in de CPU via overspraak gebeurt dan heeft wel degelijk nut.

Als de ruis van de CPU de kans krijgt om op de voedingslijn te komen en je voedingslijn is onvoldoende ontkoppeld dan kan het zijn dat er al problemen optreden voor het versterken van het signaal. De ruis wordt in dat geval dus ook mee versterkt.

LED addicted... Fijnmalen en snuiven maar!! :P