Messung der Kapazität


Elektronik-Labor  AVR  Projekte   Touch


 
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.

 

Bei der Messung wird  davon ausgegangen, dass der Zählwert T1 der Sub Touch1 das Verhältnis der beiden Kapazitäten 330 nF / Cx liefert. Das stimmt unter der Voraussetzung, dass der messende Port seine Low/Hig-Schwelle bei 50 % der Betriebsspannung hat.  Die gesuchte Kapazität ist also 330000/T1 pF. Man kann einen manuellen Abgleich durch Ändern der Konstante 330000 vornehmen, der Wert hat sich jedoch bei Vergleichsmessungen als optimal erwiesen.

'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

Download: Quelltext und Hexfile
Siehe auch: Grundlagen des kapazitiven Sensors


C-Messung mit dem Tiny25, von Thomas Scherer

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 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 = 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


Siehe auch: Kapazitiver Näherungsschalter, Verschleißfreier Taster, Elektor 1/2-2013


Elektronik-Labor  AVR  Projekte   Touch