RPi Pico Pullup/Pulldown  

Elektronik-Labor  Projekte  Mikrocontroller  Raspberry     





Inzwischen konnte ich das Platzproblem mit einem etwas anderen Steckboard lösen. Nun bleiben zehn Spalten frei für zusätzliche Elektronik. Aber für die aktuellen Versuche brauche ich nicht einmal viel Platz. Es geht um die Eigenschaften und Möglichkeiten der Ports und weiterer Peripherie.

Der Pico kann an seine Eingänge nicht nur interne Pullup-Widerstände  legen, sondern auch Pulldown-Widerstände. Da kam mir die Idee, dass es dann möglich sein sollte, mit nur einem Pin und einem einzelnen Kondensator einen RC-Generator aufzubauen. Der Kondensator wird abwechselnd über den Pullup geladen und über den Pulldown entladen. Der AD-Wandler überwacht die Schaltschwellen.



Die Arduino-kompatible Programmierung kennt den Pulldown nicht. Deshalb muss man die Funktionen aus dem Raspberry Pi Pico SDK verwenden, die mit   #include "pico/stdlib.h" zugänglich gemacht werden. Dazu gehört auch gpio_set_pulls(28,1,0), um den Pullup und/oder den Pulldown einzuschalten. Hier werden beide abwechselnd aktiviert. Mit   #include "hardware/adc.h" kann man auch die Funktionen zum ADC verwenden. Mit adc_read() erhält man die gewohnten 12 Bit Auflösung.




Das Programm erzeugt sein eigenes Oszillogramm. Die Auflösung wurde auf realistische 8 Bit reduziert, damit die Kurven glatter aussehen. Hier sieht man die Lade- und Entladephasen des Elkos von 100 µF am Port 28 (ADC2). 

  #include "pico/stdlib.h"
  #include "hardware/adc.h"

void setup() {
  Serial.begin(115200);
  adc_init();
  adc_gpio_init(28); 
  adc_select_input(2);
  while (true) {
    uint16_t u = adc_read();
    if (u<1000) gpio_set_pulls(28,1,0);
    if (u>3000) gpio_set_pulls(28,0,1);
    Serial.println(u/16);
    sleep_ms(50);
  }
}

void loop() {}


Bei der Verwendung der Arduino IDE hat diese Dokumentation sehr geholfen: https://arduino-pico.readthedocs.io/_/downloads/en/latest/pdf/. Allerdings habe ich lange nach einer vollständigen Auflistung aller Befehle und Funktionen gesucht. Irgendwann habe ich verstanden, dass hier nur das Ziel war, einen ganz normalen Arduino nachzubilden. Dafür reicht die Arduino-Befehlsübersicht im Netz. Wenn man tiefer in die besonderen Eigenschaften des Pico gehen will, muss man die SDK-Funktionen einsetzen. Aber auch da war es schwierig, einen vollständigen Überblick zu bekommen. Ich habe dann versucht, die Datei stdlib.h zu finden, die ja offensichtlich erfolgreich eingebunden wurde. Aber es ist mir nicht gelungen herauszufinden, wo diese Datei eigentlich steht. Als letzten Ausweg habe ich mir das SDK von https://github.com/raspberrypi/pico-sdk geladen und entpackt. Unter pico-sdk-master\src\rp2_common finde ich dann alle .h-Dateien und auch die zugehörigen c-Quelltexte. Damit kann endlich der richtige Überblick erreicht werden. Man findet alle vorhandenen Funktionen und auch weitere Zusammenhänge. Da ist mir erst klar geworden, dass adc_select_input(2) den zugehörigen Port hochohmig schaltet und alle Pull-Widerstände abschaltet. Das ist auch wichtig, denn (man beachte!): Nach einem Reset ist an allen Ports ein Pulldown eingeschaltet!!!

Man kann das mit dem Ohmmeter überprüfen und findet überall 20 k gegen GND. Im Datenblatt steht allerdings, dass es 50 k bis 80 k sein sollten. Misst man den Strom gegen +3,3 V, findet man tatsächlich rund 58 µA, was auf einen Pulldown von 57 k hinweist. Der Pulldown ist also nicht konstant, sondern er steigt mit der Spannung. Die Kennlinie scheint eher einem FET zu entsprechen, der sich mit höherer Spannung immer mehr einer Konstantstromquelle annähert. Vermutlich liegt ein Widerstand in Reihe zu einem schwachen FET. Das erklärt auch, warum die Flanken des oben gemessenen Dreiecksignals so verdächtig gerade verlaufen.




Die Software erlaubt es, einen Pullup und einen Pulldown zusammen einzuschalten. Das hat allerdings am Port 28 nicht funktioniert. Deshalb wird es am Port 1 gemacht, der parallel zum Analogeingang gelegt wurde. In diesem Zustand erkennt man eine deutliche Hysterese. Für den Versuch wurde ein externer Sinusgenerator über 10 k und 100 µF angelegt. Der Port strebt dann immer entweder nach GND oder nach VDD. Das Messergebnis legt nahe, dass tatsächlich nicht zwei Widerstände verwendet werden, sondern nur einer, der mal nach GND und mal nach VDD geschaltet wird.

  #include "pico/stdlib.h"
  #include "hardware/adc.h"
void setup() {
  Serial.begin(115200);
  adc_init();
  adc_gpio_init(28); 
  adc_select_input(2);
  gpio_set_pulls(1,1,1);
  while (true) {
    uint16_t u = adc_read();
    Serial.println(u/16);
    sleep_ms(0.1);
  }
}
void loop() {}










Tipps von Jürgen G. Schimmer:

Die Pullup + Pulldown Funktion, die den Pin immer an die Betriebsspannung zieht die näher liegt (wie z.B.  Bus-Hold bei einigen Logikbausteinen oder für interne Busse in FPGAs ) kann auf verschiedene Weise ausgenutzt werden:

Schnelle Schalterentprellung ohne Ruhestrom in beide Lagen:
Einfach den Schaltkontakt eine Umschalters an den Eingang legen, Ruhekontakt an GND, Arbeitskontakt (über einen Angstwiderstand von einigen 100 Ohm ) an VCC.
Bei den wenigsten Schaltern prellt der Kontakt bis an den gegenüberliegenden Kontakt. Sobald der Schaltkontakt das erste Mal GND oder VCC berührt, springt der Eingang um und wird durch den Pull-Widerstand dort gehalten.

Eingang mit Hysterese:
Einfach einen Widerstand in Reihe mit den Eingang schalten. Die Pull-Widerstände ziehen den Eingang immer in die Richtung zu dem jeweiligen festgestellten Logikpegel. Ein höherer Widerstand verursacht eine größere Hysterese.




Elektronik-Labor  Projekte  Mikrocontroller  Raspberry