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)