Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

pic16f628 en DS1820 onnauwkeurig

Pagina: 1
Acties:

  • RvL
  • Registratie: Maart 2002
  • Laatst online: 22:33
Hallo allemaal,

ik ben bezig met een digitale thermometer op basis van een PIC16f628 en de Dallas DS1820 1-wire thermometer.

Op zich werkt het goed, ware het niet dat het geheel nogal onnauwkeurig is. Afgaande op de digitale thermostaat van de CV-ketel, welke 20 graden aangeeft, geeft de DS1820 zo'n 3,5 graden meer aan, 23,5 dus.

Ook op een andere thermometer, in de schuur, klopt het voor geen meter. Hier gaf hij zelfs 9,5 graden aan terwijl het er maar 1,5 graden was!

Het geheel is geprogrammeerd in PICBasic. Dit is de code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
DEVICE 16F628                ;Gebruik een 16F628 type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF

'Data-pin van de DS1820
Dim command as byte            ' Storage for command
Dim i as byte            ' Storage for loop counter
Dim temp as word            ' Storage for temperature
Dim DQ as  PORTB.0         ' Alias DS1820 data pin
Dim DQDIR as TRISB.0        ' Alias DS1820 data direction pin

    delayms 500
    print "Temp in ", 223, "C "
mainloop:
        Gosub init1820          ' Init the DS1820

        command = $cc           ' Issue Skip ROM command
        Gosub write1820

        command = $44           ' Start temperature conversion
        Gosub write1820

        delayms 2000      ' Wait 2 seconds for conversion to complete

        Gosub init1820          ' Do another init

        command = $cc           ' Issue Skip ROM command
        Gosub write1820

        command = $be           ' Read the temperature
        Gosub write1820
        Gosub read1820
        print at 2, 1, dec (temp * 0.5), 223, "C"
        
        
        goto mainloop

' Initialize DS1820 and check for presence
init1820:
        Low DQ                  ' Set the data pin low to init
        delayus 500             ' Wait > 480us
        DQDIR = 1       ' Release data pin (set to input for high)

        delayus 100             ' Wait > 60us
        If DQ = 1 Then
                print at 2, $fe, 1, "DS1820 not present"
                delayms 500
                Goto mainloop   ' Try again
        Endif
        delayus 400             ' Wait for end of presence pulse
        Return
        
' Read temperature from the DS1820
read1820:
        For i = 1 to 16         ' 16 bits to a word
                temp = temp >> 1        ' Shift down bits
                Gosub readbit   ' Get the bit to the top of temp
        Next i
        Return

' Read a bit from the DS1820
readbit:
        temp.15 = 1             ' Preset read bit to 1
        Low DQ                  ' Start the time slot
@       nop                     ' Delay 1us at 4MHz
        DQDIR = 1        ' Release data pin (set to input for high)
        If DQ = 0 Then
                temp.15 = 0     ' Set bit to 0
        Endif
        delayus 60              ' Wait out rest of time slot
        Return

        ' Write "command" byte to the DS1820
write1820:
        For i = 1 to 8          ' 8 bits to a byte
                If command.0 = 0 Then
                        Gosub write0    ' Write a 0 bit
                Else
                        Gosub write1    ' Write a 1 bit
                Endif
                command = command >> 1  ' Shift to next bit
        Next i
        Return

' Write a 0 bit to the DS1820
write0:
        Low DQ
        delayus 60              ' Low for > 60us for 0
        DQDIR = 1         ' Release data pin (set to input for high)
        Return

' Write a 1 bit to the DS1820
write1:
        Low DQ                  ' Low for < 15us for 1
@       nop                     ' Delay 1us at 4MHz
        DQDIR = 1        ' Release data pin (set to input for high)
        delayus 60             ' Use up rest of time slot
        Return

        End



Eerlijkheidshalve moet ik zeggen dat het niet compleet mijn code is. Het komt van deze site. Ik heb hier de pins van de lcd en de DS1820 in aangepast, alsmede wat output naar het scherm. Ook is het een en ander aangepast aan Proton PicBasic.

De DS1820 is wel op dezelfde manier aangesloten als op de site hierboven, maar dan op B.0 i.p.v. C.0

Maar ergens komt dus een onnauwkeurigheid vandaan. Ik heb de datasheet van de DS1820 eens goed nagelezen, maar volgens mij haal ik de temperatuur er op de juiste manier uit.

Ziet iemand wat ik fout doe?

Liefde maakt een smal bed breed!
Nu de dekens nog...


  • real-doc
  • Registratie: Mei 2003
  • Niet online
Heb je wel even gewacht zodat de sensor op temperatuur kan komen? Als je vanaf een warme woonkamer van 20 graden de schuur van 1.5 graad inrent, is het nooit binnen de seconde nauwkeurig.

  • RvL
  • Registratie: Maart 2002
  • Laatst online: 22:33
Nee dat snap ik, maar als naar 5 minuten de sensor nog steeds wisselt tussen 9,5 en 12 graden, dan is er toch iets fout ;)

Maar ik ben nu bezig met een stuk code wat ik gekregen heb van oilburner. Hopelijk brengt dit verbetering.

Liefde maakt een smal bed breed!
Nu de dekens nog...


  • JuuL20
  • Registratie: Augustus 2005
  • Laatst online: 18-11-2021
Ik ga niet al je code doorspitten maar:
- Leest de ADC de waardes goed in? Test eeens met een labvoeding als bron ipv een temperatuursensor en kijk of het klopt.
- Heb je nette voeding? Netjes ontkoppelt?

  • RvL
  • Registratie: Maart 2002
  • Laatst online: 22:33
Het mooie van de DS1820 is dat hij een digitaal signaal aan de PIC geeft, een ADC is dus niet nodig. Sterker nog, voor zover ik weet heeft de 16f628 geen ADC.

De voeding is op zich wel netjes. Het is deze voeding, afgeregeld op iets onder de 5V.

Wat ik nog wil proberen is gebruik maken van een extern kristal. De interne oscillator staat nou niet echt bekend om zijn nauwkeurigheid.

Liefde maakt een smal bed breed!
Nu de dekens nog...


  • TheGhostInc
  • Registratie: November 2000
  • Niet online
Draai het eens om:

Wat denkt de PIC dat hij binnenkrijgt in de situaties dat hij een waarde weergeeft.
Zet die waarden eens binair onder elkaar, misschien mis je bv om de bit een bit...

Daarnaast kan het zijn dat die DS1820 verschillende modi heeft. Ga jij er vanuit dat je hem goed in de ene hebt gezet, staat hij braaf in een andere.

Probeer anders ook eens te kijken of de rest van je schakeling goed werkt, de waarden komen goed aan op het beeld, maar kloppen die ook met wat er als input is gegeven. Zet anders de waarde eens hard-coded in de PIC, misschien komt de waarde uit het verkeerde register, je bent namelijk bezig met 16bit's data te verwerken, pak je misschien per ongeluk de LSB ipv de MSB.

(Bedenk dat het "flipperen" tussen 9,5 en 12 voor zo'n chip uiterst onlogisch is, die dingen hebben een dusdanige resolutie dat die dingen geleidelijk naar een waarde moeten lopen)
Pagina: 1