$regfile = "M32def.dat"
$crystal = 8000000
Config Pinc.3 = Input
Dim Don As Byte
Dim Doff As Byte
Dim Dc As Single
Dim Zarib1 As Single : Zarib1 = 0.320
Dim Zarib2 As Single : Zarib2 = 0.0047
Dim Temp As Single
Dim M As Single
Dim Dt As Word
Loops:
Pulsein Don , Pinc , 3 , 1
Pulsein Doff , Pinc , 3 , 0
Dt = Don + Doff
Dc = Don / Dt
M = Dc - Zarib1
Temp = M / Zarib2
Cls : Home
Lcd "Temp: " : Lcd Temp
Wait 1
Goto Loops
End
روش که استفاده کردم اینجوریه که
میام سطح پایین و بالای پالس رو با pulsein اندازه میگیرم ،بعد duty cycle رو دست میارم و بااستفاده از فرمول زیر که با استفاده از کاتالوگ خود سنسور نوشتم دما رو بدست
میارم که فقط یک سری عدد بی ربط میده !
T=(dc-0.32)/0.0047
ممنون میشم که راهنمایی کنید ،و اگر امکان داره روش کارو رو دقیق تر توضیح بدین یا اینکه کدی رو که نوشتید بگذارید
سلام
من این برنامه رو با یک Mega32 و یک SMT160 نوع TO-18 نوشتم و جواب گرفتم
$regfile = "m32def.dat"
$crystal = 8000000
Dim W0 As Byte , W1 As Byte , T As Word , Temp As Single
Dim A1 As Single , A2 As Single , Dc As Single
Dim Real As String * 6
A1 = 0.32
A2 = 0.0047
Config Pind.0 = Input
Wait 1
'*************************Get Duty Cycle*************
Starts:
W0 = 0
W1 = 0
Bitwait Pind.0 , Reset
Bitwait Pind.0 , Set
T1:
W1 = W1 + 1
If Pind.0 = 1 Then Goto T1
Bitwait Pind.0 , Set
Bitwait Pind.0 , Reset
T2:
W0 = W0 + 1
If Pind.0 = 0 Then Goto T2
'**************************Calculate********* *******
T = W0 + W1
Dc = W1 / T
Temp = Dc - A1
Temp = Temp / A2
Real= Fusing(temp , "#.&&"
'***************************Print to lcd************
Cls : Home
Lcd "Don :"
Lcd W1
Lowerline
Lcd "Doff:"
Lcd W0
Thirdline
Lcd "Temp:"
Lcd Real
Fourthline
Lcd "This Is a Real Temp"
Cursor Off
Waitms 500
Goto Starts
End 'end program
$regfile = "m32def.dat"
$crystal = 8000000
Dim W0 As Byte , W1 As Byte , T As Word , Temp As Single
Dim A1 As Single , A2 As Single , Dc As Single
Dim Real As String * 6
A1 = 0.32
A2 = 0.0047
Config Pind.0 = Input
Wait 1
'*************************Get Duty Cycle*************
Starts:
$asm
lds r0,0
lds r1,0
$end Asm
Bitwait Pind.0 , Reset
Bitwait Pind.0 , Set
T1:
$asm
inc r1
$end Asm
If Pind.0 = 1 Then Goto T1
Bitwait Pind.0 , Set
Bitwait Pind.0 , Reset
T2:
$asm
inc r0
$end Asm
If Pind.0 = 0 Then Goto T2
W0 = Peek(0)
W1 = Peek(1)
'**************************Calculate********* *******
T = W0 + W1
Dc = W1 / T
Temp = Dc - A1
Temp = Temp / A2
Real= Fusing(temp , "#.&&"
'***************************Print to lcd************
Cls : Home
Lcd "Don :"
Lcd W1
Lowerline
Lcd "Doff:"
Lcd W0
Thirdline
Lcd "Temp:"
Lcd Real
Fourthline
Lcd "This Is a Real Temp"
Cursor Off
Waitms 500
Goto Starts
End 'end program
با سلام،
من هر دو برنامه شما رو امتحان کردم و به نظرم برنامه اول دقت بیشتری داشت!
در ضمن، هنوز 0.2% خطا داره. اگه با Capture mode بنویسیم، برنامه دقیق تری بدست نمیاد؟؟
کسی هست که بتونه کمکی در زمینه کار با Capture mode به من بکنه؟؟ oo:
AVR135 سایت اتمل یک مثال کاربردی برای اندازه گیری Duty Cycle با دقت بالا و استفاده از ICP تایمر 1 است.برنامه به C نوشته شده.
اگر کریستال 16 بزارید باید به رزولیشن 0.05 درجه سانتیگراد برسید.
برای رزولیشن های بالاتر هم CPLD کارسازه که فکر نکنم لازم باشه.
دیدگاه