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

http://ganzz.powerflux.be/Circuitonline/DSC00906.JPG

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?

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

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.

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

Ik maak het even af met commentaar en dan zal ik het hier posten want er zijn veel meer gebruikers die dit willen weten

oke alvast bedankt!

grtz Bas

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

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

Kan iemand dit bovenstaande bevestigen?

Tsja het is mij ook wel eens opgevallen dat de ADC begint te flippen als ik er een PLED bij houdt. Voeding goed ontkoppelen?

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 ]

Kickje

Iemand enig idee een muziek signaal uit te lezen met een pic voor level indicatie?

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.

Op 2 augustus 2006 10:57:09 schreef Videomodulator:
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.

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.

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.

Vergeet btw ook niet om je signaal een heeeeel klein beetje af te vlaken met een condensatortje oid.

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.

Ik ga vanavond eens wat meten.

Die C om of te vlakken in welke orde grote moet ik dan gaan denken, 1nF, 1uF?

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.

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 ;-)

Ik ben weer verder gegaan

http://ganzz.powerflux.be/Circuitonline/Dwarff.JPG

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

Op 2 augustus 2006 18:30:24 schreef Ganzz:
[...]
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
...
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: http://www.on4cp.org/cursus/images/filtrc1.gif.

[Bericht gewijzigd door Videomodulator op ]