Das Messverfahren für kapazitive Berührungssensoren eignet
sich auch zur Messung kleiner Kapazitäten. Der Vergleichskondensator sollte mit
330 nF relativ groß gewählt werden, um eine gute Auflösung zu bekommen. Damit
können Kapazitäten von 1 pF bis 1 nF gemessen werden, mit geringerer Auflösung
und Genauigkeit auch bis 20 nF. Das Messgerät erreicht zwar nur eine begrenzte Genauigkeit
von etwa 10%, ist aber für viele Zwecke ausreichend. So können z.B.
unbeschriftete SMD-Kondensatoren eindeutig bestimmt werden.
'ATmega32, Kapazitätsmessgerät
$regfile = "m32def.dat"
$crystal = 11059200
$hwstack = 16
$swstack = 32
$framesize = 32
Baud = 9600
Dim D As Integer
Dim T1 As Integer
Dim T2 As Integer
Dim C As Long
Dim Cnull As Word
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
Config Lcd = 16 * 2
Initlcd
Cls
Declare Sub Touch1
Ddrc = 255
Portc = 0
Touch1
Locate 1 , 1
Lcd "C = "
C = 330000
C = C / T1
Cnull = C
Do
Touch1
C = 330000
C = C / T1
C = C - Cnull
Locate 1 , 5
If C > 20000 Then
Lcd " xxxx"
Else
Lcd C
Lcd " pF "
End If
Waitms 500
Loop
Sub Touch1
For T1 = 1 To 30000
Ddrc.0 = 0 'C0 hochohmig
Portc.1 = 1 'C1 high
Ddrc.1 = 1 'C1 niederohmig
If Pinc.0 = 0 Then Exit For 'C0 low?
Ddrc.1 = 0 'C1 hochohmig
Portc.1 = 0 'ohne Pullup
Ddrc.0 = 1
Next T1
Portc.0 = 0
Portc.1 = 0
Ddrc.0 = 1
Ddrc.1 = 1
End Sub
End
Ich habe ich den Code mal kurz auf den ATiny25 adaptiert und
siehe da, bei mir kommen in der Routine Touch1 nur drei Durchläufe für T1
hin, die sich nicht ändern. Grund hierfür ist, dass der Code dem Cx keine Zeit
lässt, sich ordentlich zu entladen bzw. dass da wohl an PortC.0 Schwingungen
auftreten, die man ausklingen lassen sollte. Fügt man ne Pause von 1 µs ein,
klappt es immer und reproduzierbar.
Sub Touch1 For T1 = 1 To 30000Siehe auch: Kapazitiver Näherungsschalter, Verschleißfreier Taster, Elektor 1/2-2013
Ddrc.0 = 0 'C0 hochohmig
Portc.1 = 1 'C1 high Ddrc.1 = 1 'C1 niederohmig waitus 1 'Pause zur Stabilisierung der Spannung If Pinc.0 = 0 Then Exit For 'C0 low? Ddrc.1 = 0 'C1 hochohmig Portc.1 = 0 'ohne Pullup Ddrc.0 = 1 Next T1 Portc.0 = 0 Portc.1 = 0 Ddrc.0 = 1 Ddrc.1 = 1End Sub
Sub Touch1
For T1 = 1 To 30000
Ddrc.0 = 0 'C0 hochohmig
Portc.1 = 1 'C1 high
Ddrc.1 = 1 'C1 niederohmig
waitus 1 'Pause zur Stabilisierung der Spannung
If Pinc.0 = 0 Then Exit For 'C0 low?
Ddrc.1 = 0 'C1 hochohmig
Portc.1 = 0 'ohne Pullup
Ddrc.0 = 1
Next T1
Portc.0 = 0
Portc.1 = 0
Ddrc.0 = 1
Ddrc.1 = 1
End Sub