RPi-Pico Kapazitätsmessung                   

              

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.

 


Kapazitätsmessung mit OLED-Display von Reinhard Zickwolff


Ich habe mit Interesse Ihr Buch 'RPi Pico Schaltungen und Projekte' gelesen und einige der Experimente nachvollzogen. Das Buch hat mir sehr geholfen, mich in den Raspberry Pi Pico einzuarbeiten. Die Schaltung zur Kapazitätsmessung habe ich mal auf einer Streifen Lochrasterplatine mit einem OLED Display aufgebaut, da mein Bauteilprüfer kleine Kapazitäten im pF Bereich messen kann. Der Aufbau mit dem Raspberry Pico ist hier erstaunlich genau!

Als Prozessor Board habe ich ein Waveshare RP2040-zero (Klon) eingesetzt. Damit kann man einigen Platz sparen und das Board hat auch eine Reset Taste. https://www.waveshare.com/wiki/RP2040-Zero

 /********************************************************************
 * 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() {
 
}




Elektronik-Labor  Projekte  Mikrocontroller  Raspberry