Sida 1 av 2
SMT160-30
Postat: 30 mars 2005, 10:45:21
av Mascot
Hej, jag behöver lite hjälp. Jag har kopplat in en SMT160-30 till parallellporten.Och när jag läser av porten så växlar värdet mellan 120 och 248, det ska väl stämma?? Om det är rätt så hur gör jag om värdet till en vettig temperatur? Har läst i databladet men det är rena grekiskan för mej! Har även sök på forumet. Men jag får det inte att funka. Skulle vara snällt om någon ville visa hur man räknar ut det? Min matte är inte speciellt bra, som ni kanske märker! Kanske blev lite otydligt? Men hoppas ni förstår.
Postat: 30 mars 2005, 10:49:42
av ensten
Postat: 30 mars 2005, 11:13:05
av Mascot
Tackar! Men jag har redan kollat på det! Och jag blev inte så mycket klokare av det

Det jag ville veta var bara hur ekvationen ska vara. Någon kanske vill visa lite kod hur man får fram temperaturen? Jag skriver själv i c# och använder inpout32.dll för att kommunicera med porten
http://www.logix4u.net/.
Postat: 30 mars 2005, 13:23:59
av ensten
Kontakta SvenPon här på forumet. Kolla dina Privata meddelanden så får du hans mailadress av mig.
Postat: 31 mars 2005, 09:42:35
av Mascot
Har inte fått något meddelande. Jaja, jag kanske var lite otydlig iaf?
Så jag försöker igen

Så här står det i databladet.
D.C. = 0,32+0,00470*t D.C. = duty cycle
t = Temperature in C
Alltså det jag inte förstår är att när jag läser av porten så får jag ju alltid samma värden 248 och 120. Vad ska jag göra med dessa? Lika ekvationen? Hur använder jag den om jag vill få fram temperaturen? För det står ju att "duty cycle" är lika med 0,320+0,00470*t? Var får jag temperaturen ifrån? Det är ju den jag vill få reda på? Hur ska jag läsa av sensorn? Om jag läser nu så växlar ju värdet mellan 248 och 120, har det inget med saken att göra? Eller ska man läsa hur många pulser den sänder ut och göra något med dessa? Haha.. det är säkert väldigt enkelt, så ni får ursäkta men jag är helt ny på detta

Postat: 31 mars 2005, 10:14:32
av Schnegelwerfer
Det du vill göra är att mäta den Duty-Cycle som givaren ger. Signalen kommer att se ut som en fyrkantvåg, och du vill mäta den tid i varje period som signalen är hög. Du måste alltså i ditt program mäta tid istället för att bara läsa av porten direkt.
Anledningen att du nu får två olika värden är att den ingång du kopplat sensorn till växlar. Det du vill göra är att mäta tiden mellan när parallellporten växlar värde från 248 till 120 och tvärtom.
Det här blev lite rörigt, men jag hoppas du förstod något i alla fall.
Postat: 31 mars 2005, 10:43:36
av Mascot
Jodå förstog det mesta

Tack! Skulle var snällt om
någon hade lite kod att visa också? Helst inte i assembler

Min Delphi kod
Postat: 31 mars 2005, 16:48:31
av SvenPon
Hoppas du förstår, hör av dig om inte. Man kör alltså en loop under 0.5 sek
enl nedan sedan räknar på hur många pulser som var höga.
Pinne skall vara någon av 10 11 12 13 15
Const K1 = 0.32 ;
Const K2 = 0.0047 ;
//************************************************
Function GetTemp(AddrVal :Integer ; Pin :Integer) :
Single;StdCall ;
Var
cntHigh : Integer ;
totNumOfSamp : Integer ;
inSignal : Byte ;
smartSign : Byte ;
Mask : Byte ;
halfSek : Dword ;
Begin
Case Pin of
10: Mask := 64 ;
11: Mask := 128 ;
12: Mask := 32 ;
13: Mask := 16 ;
15: Mask := 8 ;
End ;
halfSek := GetTickCount + 500 ;
cntHigh := 0 ;
For totNumOfSamp := 1 TO 100000000 do begin
inSignal := DlPortReadPortUchar(AddrVal) ;
smartSign := inSignal And Mask ;
If smartSign = Mask Then inc(cntHigh) ;
If GetTickCount > halfSek Then Break ;
End ;
// Pinne 11 på Lpt är inverterad
If Pin = 11 Then
cntHigh := totNumOfSamp - cntHigh ;
GetTemp := (cntHigh/totNumOfSamp - K1)/K2;
End;
End.
Gick det hem eller var det för svårt
Postat: 1 april 2005, 14:56:03
av SvenPon
Undrar SvenPon
Postat: 5 april 2005, 08:20:22
av Mascot
Tackar! Jodå, förstår vad jag ska göra men nu försöker jag komma på något enkelt sätt att göra det i c#. Någon som håller på med .Net? Har kollat på Threading och Timers. Men jag får det inte att fungera? Det jag inte får till är att göra en loop som ska köras i 0,5 sek?
C# och Get Tickcount
Postat: 5 april 2005, 08:40:25
av SvenPon
Jag använder GetTickcount 0.5 sek för att det är optimal samplingstid.
Du kan testa att köra en For Loop 100 000 varv, det borde funka.
Men visst har Ni GetTickcount i C#
Postat: 5 april 2005, 08:49:22
av Mascot
Ok, tack så mycket. Får testa det, såg att det fanns Get Tickcount i c# också, så jag får läsa lite om det. Tack!
Postat: 5 april 2005, 09:24:41
av Mascot
Ok, testade att göra en lopp 100 000gr. Men nu är frågan, jag vet alltså hur många gånger porten var hög och hur många gånger den var låg. Hur blir ekvationen då?
Formel
Postat: 5 april 2005, 09:42:21
av SvenPon
C = (cntHigh/totNumOfSamp - K1)/K2;
Dvs (antal höga / antal samplingar - 0.32 )/0.0047
Om du kör mot pinne 11 som är inverterad måste Vi omvandla
cntHigh först
// Pinne 11 på Lpt är inverterad
If Pin = 11 Then
cntHigh := totNumOfSamp - cntHigh ;
C = (cntHigh/totNumOfSamp - K1)/K2;
K1 och K2 är till för att SMT160-30 egentligen lämnar Fahrenheit
Kalibrering
Postat: 5 april 2005, 10:02:21
av SvenPon
Ytterligare en info.
Av någon underlig anledning så har jag funnit att vid kalibrering
så får man minska C med 1.1 grader för att det skall bli helt korrekt.
Celsius = C - 1.1