Ganzz
-
Het zoveelste topic over Temperatuur sensoren, het zal wel door het weer komen.
Ik heb een poosje geleden een aantal DWARF experimenteer borden van [url=www.voti.n]Voti[/url] gekocht.
Het mainbord, leds, knoppen en de analoge ingangen bord.
Ik programeer in picbasic.
Ik heb reeds de ADC al werkend met een potmeter van 10k die tussen de 0 en de 5v zit aangesloten en de loper op de microcontroller.
Dit werkt prima, ik kan op het lcd de (ruwe) waardes weergeven. Het is een 10BIT ADC dat 2^10 = 1024 "meetpunten"
Nu wil ik die temperatuur sensor aansluiten. De LM35
zit daarop, maar aangesloten met een 2tal diodes om een negative spanning aan te bieden. De LM35 geeft 10mV/Graden. Gebruikt de PIC de 5v (voedingspanning) als zijn referentie spanning?
Maar hoe werkt dat nu? Wat ga ik uitlezen en hoe bewerk ik het ruwe signaal in de PIC tot graden?
Hier vind je informatie over dat analoge ingangen bordje met daarbij het schema
WIe kan mij even een schop de juiste richting op geven
Je moet het spanningsverschil meten tussen D2 en D3, als (D3-D2) positief is is de temperatuur ook positief.
Dit doet men zo omdat de spanningsval over de diodes een beetje afhankelijk is van de stroom en temperatuur, dat wil je niet meenemen in de meting.
Geen idee hoe het met een LM35 gaat maar ik heb wel een stuk code gemaakt voor gebruik van een 100K NTC aan de ADC van een PIC. Hij berekend de temperatuur als functie van de spanning over de NTC (naast een serieweerstand van 100k). Je moet alleen wel een 18F gebruiken in PICBASIC ivm logaritmische functies...
Geen idee of je hier misschien wat aan hebt?
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
Op 28 juli 2006 21:29:15 schreef Aart:
Je moet het spanningsverschil meten tussen D2 en D3, als (D3-D2) positief is is de temperatuur ook positief.
helemaal correct. en ja, de PIC gebruikt zijn +5V als referentie (tenminste, ik neem aan dat je de A/D daarop instelt!).
Ganzz
-
Oke, dus dan krijgen we nu wat formules
PIC 16F877
WaardeADC1 = ADIN 2
WaardeADC2 = ADIN 3
Verschil = WaardeADC3 - WaardeADC2
; Ik gebruik een 10 bit ADC dat is 2^10 = 1024
; Refentie spanning is 5v, dus 5/1024 = 0,00488
; dus elke stap is 0,00488v
;LM35 is 10mV per Graden Celsius.
;dus volts zijn
VAR1 = Verschil * 0,00488
Temp = VAR1 * 100
Print at 1,1, DEC1 Temp, " .C"
dit is een gedeelte code.
Mijn Kwik meter meet 29Graden, de LM35 meet 29,2/29,7
Dat is toch best netjes volgens mij?
Zeker met de 5v referentie spanning van de LM7805 wel netjes.
basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
heeeeey dit ga ik ook over een tijdje gebruiken:D heb je ook de hele basic code? mag je me ook mailen als je wilt
basmolkenboer(apie)hotmail.com
alvast bedankt!
grtz Bas
Ganzz
-
Ik maak het even af met commentaar en dan zal ik het hier posten want er zijn veel meer gebruikers die dit willen weten
Ganzz
-
Arg...
Problemen hier, Ik test alles met een mini LCD van 8*2 karacteres.
Ik heb nu een Pled eraan hangen van 2*20. Alleen waneer de Pled eraan hangt, stuiterd de ADC als een gek dus de temperatuur ligt tussen de 26 - 34 graden als het 30 graden is. Ook is de temperatuur niet meer te lezen door de snelle response tijd van de Pled. Normaal werd het LCD 100* per sec geupdate. Nu is dat 1* per seconde en ik heb het probleem nog steeds.
Wat is hier mis
Kevinoud
Een zak tuinaarde opescheuren
ik weet het niet zeker maar komt het mischien omdat je geen galvanische scheiding in je voeding heb voor display en pic.
ik hoorde dat led displays er last van hadden maar die andere (grafische en karakter) niet
Tsja het is mij ook wel eens opgevallen dat de ADC begint te flippen als ik er een PLED bij houdt. Voeding goed ontkoppelen?
Ganzz
-
Ik heb de PIC ontkoppeld, het LCD nog niet ik zal dat dan even gaan doen (100nF).
Er zit een schakelende voeding op een Pled(dacht ik) zou die die problemen kunnen veroorzaken?
Ik ben nu in ieder geval weer een stap verder en er komen nu weer 2 andere vragen.
Ik heb 5 custom characters gemaakt, en zo heb ik over mijn Pled een "bar" van 20*5 verticale streepjes. Dat moet ik wel werkend krijgen maar ik wil op mijn ADC een muziek signaal inlezen. Wat voor schema hang ik daar aan?
En op hoeveel V ligt over het algemeen het 0DB punt?
Line-niveau is 1V peak-to-peak dacht ik, het handigste is het als je een DC signaal van 0 tot 5V kan inlezen met je ADC. Daarom zet je er een versterkertje voor, als je daarvoor een opamp gebruikt, werkt die meteen ook als buffer (hij zal zo goed als geen stroom trekken uit je geluidskaart, wat je ook bij je ADC doet), wat voorkomt dat je je geluidskaart opblaast.
Het probleem is ook dat je het gemakkelijkst bent als je DC kan inlezen, en geluid is AC. Je kiest zelf wat je doet, maar ik zou via een diode werken (daarvoor moet een buffer (zie opamp basisschakelingen)), anders vervorm je het signaal enorm, en wat je geluidskaart daarmee doet weet ik niet, door een buffer te plaatsen kan je gewoon het geluid dat op je boxen speelt aftakken.
Dit het ik net gevonden, is dit een goede manier op dit te doen?
[Bericht gewijzigd door Ganzz op ]
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Ik dacht al dat ik dat tekstje herkende 
Probeer gewoon te snappen wat ik bedoel daar, geluid is AC en het stuk boven en onder de nullijn is ongeveer hetzelfde, het stuk onder de nullijn mag je dus weggooien (met een diode, ws kan je best een 'ideale diode' maken met een opamp). Dan moet je nog de maximale grootte van het signaal gelijk krijgen met de maximale grootte die de ADC kan zien.
En dan kan je het erg simpel doen, de ADC leest 10-bits uit, dus voor elk bitje dat '1' is kan je een ledje laten oplichten:
program Adc_Test
dim temp_res as word
main:
ADCON1 = $80 ' Configure analog inputs and Vref
TRISA = $FF ' PORTA is input
TRISB = $3F ' Pins RB7 and RB6 are output
TRISD = $0 ' PORTD is output
while TRUE
temp_res = Adc_Read(2)
PORTD = temp_res ' Send lower 8 bits to PORTD
PORTB = word(temp_res >> 2) ' Send 2 most significant bits to PORTB
wend
end.Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Op 2 augustus 2006 10:57:09 schreef Videomodulator:
Ik dacht al dat ik dat tekstje herkendeProbeer gewoon te snappen wat ik bedoel daar, geluid is AC en het stuk boven en onder de nullijn is ongeveer hetzelfde, het stuk onder de nullijn mag je dus weggooien (met een diode, ws kan je best een 'ideale diode' maken met een opamp). Dan moet je nog de maximale grootte van het signaal gelijk krijgen met de maximale grootte die de ADC kan zien.
En dan kan je het erg simpel doen, de ADC leest 10-bits uit, dus voor elk bitje dat '1' is kan je een ledje laten oplichten:program Adc_Test dim temp_res as word main: ADCON1 = $80 ' Configure analog inputs and Vref TRISA = $FF ' PORTA is input TRISB = $3F ' Pins RB7 and RB6 are output TRISD = $0 ' PORTD is output while TRUE temp_res = Adc_Read(2) PORTD = temp_res ' Send lower 8 bits to PORTD PORTB = word(temp_res >> 2) ' Send 2 most significant bits to PORTB wend end.
Dat is natuurlijk nog zever, beter is het als je je maximale waarde (2^10=1024) deelt door het aantal stappen dat je wil, en vergelijkt dan de gemeten waarde met de onderverdelingen, om te bepalen wat het volume is.
Ganzz
-
Dus de audio signaal met een opamp naar 5v top-top regelen en dan een diode, of de diode voor de opamp?
Ik ga vanavond wel even proberen thuis.
elmowww
PA0EJE - www.eje-electronics.nl - e.jongerius[aapje]eje-electronics.nl - EJE Electronics - Elektronica/firmware ontwikkeling
Vergeet btw ook niet om je signaal een heeeeel klein beetje af te vlaken met een condensatortje oid.
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Op 2 augustus 2006 13:00:10 schreef Ganzz:
Dus de audio signaal met een opamp naar 5v top-top regelen en dan een diode, of de diode voor de opamp?Ik ga vanavond wel even proberen thuis.
Als je eerst de diode zet, moet je de opamp die versterkt niet met symmetrische voeding (positieve en negatieve spanning) voeden, maar verlies een ferm stuk van de spanning (tenzij je een 'ideale diode' maakt met een opamp, zie bijvoorbeeld hier), line niveau is 1V, neem aan 0.4V verlies over je schottky-diode, das 40% van je signaal dat je verliest.
Eerst de versterker, dan zit je nog met de spanningsval van de diode die je verliest (weer tenzij je een 'ideale diode' gebruikt), maar is dat mss niet erg (je verliest de stille passages, neem aan een schottky-diode die 0.4V spanningsval heeft, dan verlies je 0.4 van de 5.4V, dus 7,5%).
Gooi het idd maar eens door een scoop, dan zie je vanzelf wat ie doet bij verschillende ingangssignalen.
Ganzz
-
Ik ga vanavond eens wat meten.
Die C om of te vlakken in welke orde grote moet ik dan gaan denken, 1nF, 1uF?
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Op 2 augustus 2006 15:27:04 schreef Ganzz:
Ik ga vanavond eens wat meten.Die C om of te vlakken in welke orde grote moet ik dan gaan denken, 1nF, 1uF?
Q? Ik zou het niet weten. Laat ons het eens beredeneren, waarvoor zet je die condensator daar?
A? Omdat je de signaalveranderingen tussen 2 metingen van de ADC toch niet kan zien, en die dus wil afvlakken.
Q? Tijd bij een condensator?
A? Dan moeten we een Tau (=R*C) hebben, na 5 Tau is een condensator helemaal op/ontladen, een keer Tau gelijkstellen aan de tijd tussen 2 samples ligt het meest voor de hand.
Q? WTF? Er moet dan nog een R bij ook of wat?
A? We sturen aan met een opamp, die heeft wel een uitgangsweerstand maar die is niet zo groot, dus een weerstandje is wel handig. Als je er een potmetertje zet, kan je meteen de Tau nog wat bijregelen als dat nodig zou zijn.
Ganzz
-
Bedankt, ik ga even een schematje maken + Wat dingnetjes uitrekenen
Oke ik ben verder gegaan, in proton heb ik een sample time van 1000us ingesteld, dat komt overeen met 1ms dus 1000x per seconden (0,001 sec)
Dan heb ik een RC netwerkje nodig om af te vlakken
Tau = R*C
Bij 5 Tau-tijden is een condensator zo goed als vol.
een keer Tau gelijkstellen aan de tijd tussen 2 samples ligt het meest voor de hand.
Een Tau tijd duurt dus 0,001 SEC
0,001 = R*C
C een waarde kiezen?
Stel C = 1uF
0,001 = R* 1*10^-6
0,001 / 1*10^-6 = R
R = 1*10^-9
Dat gaat niet werken
Stel C = 1000uF
0,001 = R* 1*10^-3
0,001 / 1*10^-3 = R
R = 1*10^-6
Volgens mij doe ik hier iets fout?
[Bericht gewijzigd door Ganzz op ]
Op 28 juli 2006 21:40:40 schreef ZX6RR:
Geen idee hoe het met een LM35 gaat maar ik heb wel een stuk code gemaakt voor gebruik van een 100K NTC aan de ADC van een PIC. Hij berekend de temperatuur als functie van de spanning over de NTC (naast een serieweerstand van 100k). Je moet alleen wel een 18F gebruiken in PICBASIC ivm logaritmische functies...Geen idee of je hier misschien wat aan hebt?
Hey ZX6RR motormuis,
Zou ik eens een kijkje mogen nemen in die code ?
Ik vind een NTC nooit zo makkelijk merken omdat hij niet linear is.
Ik heb zelf ook al eens wat geprobeerd maar dat leek nergens op 
Ganzz
-
Ik ben weer verder gegaan
De eerste opamp die versterkt 5,4x
Vout = Vin* (R1+R2)/R1
Vout = 5,4v
Vin = 1v
R1 = 10K ohm
5,4 = 1*(10000+R2)/10000
5,4 * 10000 = gelijk aan 10000+R2
5,4*10000 = 54000
54000-10000 = 44000
R2 = 44K
De opamp word gevoed door +15v/-15v. Moet er ook nog een protectie in komen om de ADC te beschermen als er te hard word ingestuurd word?
Nu alleen nog de RC berekenen
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
Op 2 augustus 2006 18:30:24 schreef Ganzz:
[...]
Een Tau tijd duurt dus 0,001 SEC0,001 = R*C
C een waarde kiezen?
Stel C = 1uF0,001 = R* 1*10^-6
0,001 / 1*10^-6 = R
R = 1*10^-9
...
Volgens mij doe ik hier iets fout?
Als je delen schrijft, moet je dat ook doen, je hebt vermenigvuldigd. 0.001/1*10^-6 = 1000 Ohm
Voor het beveiligen tegen overspanningen moet je eens kijken welke weerstand er voor de ADC mag staan, die weerstand in combinatie met een diode naar VCC en massa kan nooit kwaad (BAV99 is handig daarvoor, controleer of ze de stroom aankunnen bij +15V (hoger dan je voeding kan de opamp niet uitsturen)). Er zitten wel zo'n diodes in de PIC, maar die zijn bedoeld voor storingen en je kan er niet op afgaan (niet gemaakt om constant stroom te voeren).
Een RC filter is volgens mij toch dit: .
[Bericht gewijzigd door Videomodulator op ]