Elektronik-Labor
Projekte
Mikrocontroller
Raspberry
Aus RPi Pico Schaltungen und Projekte Kap. 21
Dieses Messgerät basiert auf einem RC-Generator mit internen Pull-Widerständen und einem externen Referenz-Kondensator von 1000 pF. Gleichzeitig läuft eine Frequenzmessung. Wenn ein externes Messobjekt zusätzlich angeschlossen wird, steigt die Kapazität, sodass die Frequenz sinkt. Bei 1000 pF wird eine Frequenz von ca. 60 kHz gemessen. Die genaue Frequenz ohne Messobjekt wird beim Start der Variablen f0 zugewiesen. Aus der Änderung der Frequenz wird dann laufend die Kapazität des Messobjekts berechnet. Bei Bedarf reicht ein Druck auf den Taster an P8, um den Nullpunkt neu zu justieren.
Das Messgerät kann mit guter Genauigkeit zwischen 1 pF und ca. 100 nF eingesetzt werden. Elkos bis 100 µF können ebenfalls untersucht werden, wobei jedoch die Genauigkeit stak abnimmt. Außer Kondensatoren können auch Dioden in Sperrrichtung gemessen werden. An einer gelben LED wurde eine Sperrschichtkapazität von 7 pF gemessen.
//Pico_RC4
C-Messung
#include
"pico/stdlib.h"
void
setup() {
Serial.begin(115200);
}
void
loop() {}
void
setup1() {
int n=0;
gpio_pull_up(8);
uint32_t f0;
while (true) {
uint32_t f = 0;
uint32_t t = time_us_32() + 1000000;
while (t>time_us_32()){
while (1==gpio_get(0));
gpio_pull_up(0);
f++;
while (0==gpio_get(0));
gpio_pull_down(0);
}
n++;
if (n==2) f0=f;
if (0==gpio_get(8)) n=0;
if (n>2){
n=3;
uint32_t c= f0*1000/f-1000;
if (c>1000000000) c=0;
Serial.print(c);
Serial.println(" pF ");
}
}
}
void
loop1() {}
Eine weitere mögliche Anwendung sind kapazitive Berührungssensoren. Bei der Berührung eines isolierten Drahtes steigt die Kapazität um 1 pF bis ca. 5 pF. Eine direkte Berührung des Eingangs durch eine isoliert stehende Person ergibt ca. 100 pF.
* Pico_RC4 C-Messung nach B.Kainka
*
* RP2040-zero
* OLED SSD1306
*
* 29.10.23
********************************************************************/
#include "pico/stdlib.h"
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define SCREEN_ADDRESS 0x3C //
Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define NULL_PIN 8 // Taster gegen Masse an GP8
#define KO_PIN 14 // Kondensator gegen Masse an diesem GP
int n=0;
uint32_t f0; // Vergleichsfrequenz ohne Mess Ko
uint32_t f; // Periodenzaehler fuer Grundschwingung mit 1000pF
uint32_t t; // fuer Bestimmung der Messdauer fuer Grundfrequenz
uint32_t c; // Kapazitaet in pF
//-------------------------------------------------------------------
void printTxt2(int spalte,int zeile, const char *text){
oled.setCursor(spalte*10,zeile*16);
oled.print(text);
oled.display();
}
//-------------------------------------------------------------------
// Textzeile loeschen fuer Textsize 2 (Zeile 0..3)
void clearText2Line(int line){
int y= line * 16;
oled.setTextColor(SSD1306_BLACK);
oled.setCursor(0,y);
for (int i=0; i<10; i++) {
oled.write(0xDA); // Block
}
oled.display();
oled.setTextColor(SSD1306_WHITE);
}
//-------------------------------------------------------------------
void setup() {
Wire.begin();
}
//-------------------------------------------------------------------
void loop(){}
//===================================================================
void setup1() {
oled.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
oled.clearDisplay();
oled.setTextColor(SSD1306_WHITE); // Draw white text
oled.setTextSize(2);
// 10 Zeichen/Zeile, 4 Zeilen y = 0, 16, 32, 48
printTxt2(0,0," pf Mess");
printTxt2(0,1," -------");
gpio_init(NULL_PIN);
gpio_set_dir(NULL_PIN,0); // Input
gpio_pull_up(NULL_PIN);
gpio_init(KO_PIN);
gpio_set_dir(KO_PIN,0); // Input
gpio_pull_down(KO_PIN); // Entladung starten
while (true){
if (n<2){
printTxt2(0,2,"Init...");
}
f = 0;
t = time_us_32() + 1000000; // 1s Messzeit fuer Grundfrequenz
while (t > time_us_32()){
while (1==gpio_get(KO_PIN)); // warten bis Kondensator 1000pF entladen ist
gpio_pull_up(KO_PIN); //
PullUp einschalten zum Aufladen
f++;
// Periodenzaehler + 1
while (0==gpio_get(KO_PIN)); // warten bis Kondensator aufgeladen ist
gpio_pull_down(KO_PIN); // Entladung starten
}
n++;
if (n==2) {
clearText2Line(2);
clearText2Line(3);
printTxt2(0,2,"Ready");
f0=f;
}
// Reset Schleifenzaehler, wenn Taster gedrueckt
// Das loest eine neue f0 Messung aus
if (0==gpio_get(NULL_PIN)) {
n=0;
clearText2Line(2);
}
// fuer n>2 ist f0 eingefroren, f wird durch zu messenden Ko bestimmt
if (n>2){
n=3;
// n begrenzen
c= f0*1000/f-1000;
if (c>1000000000) c=0;
clearText2Line(3);
oled.setCursor(0,3*16); oled.print(c); oled.print(" pF"); oled.display();
}
}
}
//===================================================================
void loop1() {
}