Ri eines Digital-Pins (Output, High)

Hi,

manchmal ist es notwendig, den genauen Innenwiderstand (Ri) der Digital-Pins des Arduino zu kennen.
Entweder man schaut in das Datenblatt des Amel unter “Figure 34-24. ATmega328P: I/O Pin Output Voltage vs. Source Current”,
wo man sieht, daß der Innenwiderstand wenigstens nahezu linear ist, dafür aber leicht temperaturabhängig,
oder man bastelt sich einen kleinen Sketch, um den Innenwiderstand eines Pins zu messen.
Mir war das mit den Linien im Diagramm ablesen zu ungenau, also habe ich nach kurzem nachdenken “wie?”
gestern Abend den kurzen Sketch eingetippt.

Den Innenwiderstand errechnen: Ri = delta U / delta I, also bei welchem Strom die Quelle (Pin) um welchen Betrag
Spannung nachgibt, oder gleich eine Verhältnisgleichung mit einem bekannten Widerstand rechnen.
Ri = Rmess * (1023 - rawADC) / rawADC; // Rmess nicht kleiner als 220 Ohm, um im Limit zu bleiben.

Beim ratiometrischen messen hat das keinen Einfluss, da der Vergleichswiderstand an Vcc = Vref angeschlossen ist,
braucht man aber mehrere schaltbare Messwiderstände, ist es notwendig den Ri des Schalters (Pin) zu kennen.
Also jeweils messen, oder vorher ausmessen.
Bleibt noch die Temperaturabhängigkeit. Bei Zimmertemperatur ist die Differenz des Ri selbst sehr klein,
24 Ohm plus/minus 0,5 Grad Celsius - Kalt ~ 23,6 Ohm, Warm ~ 24,5 Ohm.
Ist das immernoch zu ungenau, sollte es aber reichen bei einem Pin den Ri zu messen, bei allen anderen verwendeten
Pins dann Ri zum Rmess dazu addieren. Der Messwert fällt automatisch mit an, wenn man es ganz genau haben will,
und die Spannung über einem der Messwidersände mit misst.

Ausgabe seriell:

Im kalten Zustand (~18 Grad):


Ri= 23.63 Ohm bei 220 Ohm als Last
99.11 Differenz rawADC / 463.79 mV


bei ca. 22,5 Grad nach 15min


Ri= 24.16 Ohm bei 220 Ohm als Last
101.12 Differenz rawADC / 473.20 mV


ohne R220 als Last sieht es dann so aus:


Ri= 0.01 Ohm bei 220 Ohm als Last
0.05 Differenz rawADC / 0.23 mV


// Innenwiderstand (Ri) eines Digital-Pins (Output-High) messen //

byte analogPin = A0;
float Ri;
float rawADC;
float R220 = 220.3;                       // Messwiderstand in der Verhältnisgleichung
float Vref = 4.792;                       // nur für Spannungsdifferenz wichtig 

#define testPin 2                         // <== zu testender Pin

void setup()
{
  Serial.begin(115200);
}

void loop()
{
  pinMode(testPin, OUTPUT);
  digitalWrite(testPin, HIGH);

  rawADC = 0;
  for (int i = 0; i < 1024; i++)          // 1024 Messungen (Oversampling + Mittelwert)
  {
    rawADC += analogRead(analogPin);
    delayMicroseconds(1000);
  }
  rawADC = (rawADC / 1024);

  Ri = R220 * (1023 - rawADC) / rawADC;   // Verhältnisgleichung Ri zu Rmess
  
  Serial.println("_______________________________________");
  Serial.print ("Ri= "); Serial.print (Ri, 2); 
  Serial.println(" Ohm bei 220 Ohm als Last");
  Serial.print(1023 - rawADC); Serial.print(" Differenz rawADC / ");
  Serial.print(Vref / 1.024 * (1023 - rawADC)); Serial.println(" mV");
  Serial.println("_______________________________________");
  
  delay(1000);
}

Vermutlich beschäftige ich mich hier gerade mit Dingen die nicht “en vogue” sind,
aber ich kann es gerade gut gebrauchen, evtl. auch ein Anderer als Denkanstoß.

Gruß André

Ri_messen.ino (1.1 KB)

Ri.png

Ist das immernoch zu ungenau, sollte es aber reichen bei einem Pin den Ri zu messen, bei allen anderen verwendeten
Pins dann Ri zum Rmess dazu addieren. Der Messwert fällt automatisch mit an, wenn man es ganz genau haben will, und die Spannung über einem der Messwidersände mit misst.

Das verstehe ich nicht.
Ri eines Eingangs ist größer als 5MOhm (laut datenblatt: max Leckstrom 1µA). Wieso mußt Du den Widerstand zum Innenwiderstand des Ausgangs dazunehmen?

Meines Erachtens ist der Innenwiderstand eines Ausgangs von Pin zu Pin und von Controller zu Controller leicht verschieden.

Grüße Uwe

Hi Uwe,

mir geht es auch nicht um die Impedanz des ADC-Pins, sondern um die Impedanz des zur Stromversorgung degradierten Digital-Pins bei Output, High. Sowas braucht man z.Bsp. bei einem Widerstandsmessgerät mit umschaltbaren Messwiderständen, dann geht ratiometrisch nicht mehr, oder man braucht einen echten Schalter, oder eben jeweils 2 Analog-Pins pro Messwiderstand als ADC, zumindest bei den niederohmigen.

Gruß André

Eine schöne Beschäftigung für langweilige Wochenenden :wink:

Frage: hast Du die Auflösung und Offset des ADC berücksichtigt? Wer gemessene Werte auf 4 Stellen genau angibt, der muß schon sehr gut begründen können, wie er auf diese Genauigkeit gekommen ist :-]

Mit 1023-rawADC bin ich nicht einverstanden, müßte da nicht 1024 stehen?

Die angegebenen Werte stehen in heftigem Kontrast zu den Angaben im Datenblatt. Lt. Datenblatt liegt der statische Ausgangswiderstand bei 800/20=20 Milliohm, wie soll da ein dynamischer Widerstand von über 20 Ohm zustandekommen? Deine Angaben mit/ohne R220 verstehe ich auch nicht.

Zudem ist die Temperaturverteilung im Chip nicht homogen (hotspots...), und die lokale Temperatur ist höher als die Gehäusetemperatur. Der interne Temperatursensor sollte brauchbarere Werte liefern.

Interessant wäre noch ein Vergleich

  • der Pins eines Controllers
  • von mehreren Controllern
    um mehr über die Exemplarstreuung zu erfahren. Wenn Du einem selbstgebauten Meßgerät die ermittelten Werte zugrundelegst, auf welche Genauigkeit und Streubreite kommst Du dann?

... na klasse, ich drücke auf Preview und fliege aus >:( alles nochmal.

Ja, beim ADC des Arduino dividiert man durch 1024, und der Wertebereich liegt zwischen 0 und 1023.
Rechne ich vom Maximalwert runter, dann sind es die 1023.
Wenn Du Dir im Datenblatt des Atmel im Figure 34-24 das Diagramm anschaust, sieht man, daß bei einer Last von 20mA die Spannung etwa 500mV nachgibt, das sind laut Ri = delta U / delta I bei mir ganz grob 25 Ohm. Und das messe ich ja auch. Der Pin gibt bei 20mA Last eine Spannung aus, die etwa 100 Zähler (ADC) niedriger ist als die Referenzspannung/Vcc.
Mit den Hotspots im Chip gebe ich Dir Recht, aber allein den Ri in eine Rechnung mit einzubeziehen reduziert den Fehler um eben jene 24-25-26 Ohm. Wie groß die Unterschiede sein können, keine Ahnung.

Oversampling: http://ww1.microchip.com/downloads/en/AppNotes/doc8003.pdf
Datenblatt, Seite 416: http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf

Gruß André

SpaghettiCode:
... na klasse, ich drücke auf Preview und fliege aus >:( alles nochmal.

Deshalb drücke ich ^A^C bevor ich irgendwelche Buttons klicke. Das GUI könnte deutlich besser sein :frowning:

Wenn Du Dir im Datenblatt des Atmel im Figure 34-24 das Diagramm anschaust, sieht man, daß bei einer Last von 20mA die Spannung etwa 500mV nachgibt, das sind laut Ri = delta U / delta I bei mir ganz grob 25 Ohm.

Da habe ich nicht nur das falsche Diagramm erwischt, sondern mich auch noch bei der Größenordnung verhauen :frowning:

DrDiettrich:
Da habe ich nicht nur das falsche Diagramm erwischt, sondern mich auch noch bei der Größenordnung verhauen :frowning:

Ja, das war ein Totalversager, wie er Leuten (wie mir) passiert. Aber wenn man es nur mit simpel gestrickter Digitalelektronik zu tun hat, ist das nicht schlimm. Wär' ja blöd (mir gegenüber) :slight_smile:

Zur Strafe schreibst Du jetzt einen Sketch, der 100 mal auf der Seriellen ausgibt: "Eine Eins ist eine Eins. Eine Null nicht."

Gruß

Gregor

ok; ich habe den Ausgangswiderstand mit dem Eingangswiderstand eines digitalen Pins verwechselt. Hab falsch gelesen.

Ich sprach aber nicht von analogen Eingängen. Analoge Eingänge haben einen statischen Widerstand der Ähnlich hoch ist die der Eingengswiderstand der digitalen Eingänge und eine gewisse Stromaufnahme beim Sampling, die bedeutend größer ist, als den statischen Widerstand geschuldet ist. Beim Sampling ist dieser dadurch gegeben, daß der interne Sample& Hold Kondensator über eine gewisse Zeit mit der Meßspannung geladen wird und in dieser Ladezeit er auf Meßspannung geladen werden soll. Dadurch ergibt sich ein Ersatzwiderstand der zu messenden Schaltung die Ca unter 10kOhm sein muß, damit es gut geht.
Der Ausgangswiderstand ist Durch den Ausgangstransistor gegeben aber auch durch die interne Stromführung von den Spannungsversorgungspins zu den Ausgangstransistoren. Da die Pins in Gruppen aufgeteilt sind (siehe max Strombelastung) ist der Ausgangswiderstand auch Dadurch gegeben daß mehrere Ausgänge geschaltet sind.
Grüße Uwe