Browse Month: Dezember 2021

Einheiten und wie man sie in Größen umrechnen kann.

Es gibt immer wieder Situationen, wo man Einheiten umrechnen muss. Dabei sind die gängigsten Einheiten wie Meter in Zentimeter umzurechnen ja noch überschaubar, aber wie rechnet man beispielsweise die Einheit Liter pro Quadrat Sekunde in Kubikmeter pro Stunde um?.

Als erstes sollte man sich die grundlegenden physikalischen Einheiten und ihre Größen in Erinnerung rufen. Alle physikalischen Größen werden immer als Potenzprodukte der 7 Basisgrößen (Länge, Masse, Zeit, elektrische Stromstärke, Temperatur, Stoffmenge und Lichtstärke) dargestellt. Dieses Potenzprodukt bezeichnet man als Dimension der jeweiligen Größe. Sie darf nicht mit der Einheit der Größe verwechselt werden und ist unabhängig vom Maßsystem.

EinheitZeichenGrößeEinheitZeichenGröße
Dezid10^{-1}Dekada10^{1}
Zentic10^{-2}Hektoh10^{2}
Millim10^{-3}Kilok10^{3}
Microµ10^{-6}MegaM10^{6}
Nanon10^{-9}GigaG10^{9}
Pikop10^{-12}TeraT10^{12}
Femtof10^{-15}PetaP10^{15}
Attoa10^{-18}ExaE10^{18}
Zeptoz10^{-21}ZettaZ10^{21}
Yoktoy10^{-24}YotaY10^{24}

Um Größen entsprechend umrechnen oder konvertieren zu können, ist neben dem Maßsystem auch gut, wenn man bestimmte weitere Zusammenhänge kennt, die sich nicht zwingend als Potenz-Produkte ableiten lassen. Einige dieser Zusammenhänge sind in der folgenden Tabelle aufgeführt (ohne Anspruch auf Vollständigkeit:

Zeit [t]Basiseinheit ist die Sekunde [s]
60 s = 1 min (Minute)
60 min = 1 h (Stunde) = 3600 s
24 h = 1 Tag = 1440 min = 86400 s
Liter [l]Basiseinheit ist der Liter [l]
1 Liter = 1 dm^3 =10^{-3}m^3
1m^3 = 1000 l
Fläche [A]Basiseinheit ist der Quadratmeter m^2
1 Ar = 100 m^2
1 HAr = 100 Ar = 10^2 \cdot 100 m^2 = 10^4 m^2
Arbeit [W]Basiseinheit ist das Joule [J]
1 J = 1 Nm = 1 kg \cdot m^2\cdot s^{-2}
Leistung [P]Basiseinheit ist das Watt [W]
1 W = 1 kg \cdot m^2\cdot s^{-3}
Masse [m]Basiseinheit ist das Kilogramm [kg]
1 Tonne [t] = 1 000 kg

Umrechnungsbeispiele

Beispiel 1

Es sollen

(1)   \begin{equation*} 4,4 \cdot 10^{-6} \frac {l}{s^2} \quad =  \quad ?\quad \lbrack \frac{m^3}{h} \rbrack\end{equation*}

umgerechnet werden.

Schritt1: Konvertierung der Einheiten mit Basiswissen:

1 m^3 = 1000 Liter daraus folgt 1 l = \frac{1}{1000} m^3

1 h = 3600 s daraus folgt 1s = \frac{1}{3600} h

Eingesetzt ergibt sich dann:

(2)   \begin{equation*} 4,4 \cdot 10^{-6} \dfrac {\dfrac{1}{1000} m^3}{(\dfrac{1}{3600})^2 h}  \quad = \quad 4,4 \cdot 10^{-6} \dfrac {(3600)^2}{1000}}  \quad \lbrack \dfrac{m^3}{h} \rbrack\end{equation*}

Rechnet man dann weiter ergibt sich :

(3)   \begin{equation*} 4,4 \cdot 10^{-6} \dfrac {(12,96)\cdot 10^6}{10^3}}  \quad =  57,024 \cdot 10^{-3} \quad \lbrack \dfrac{m^3}{h} \rbrack \quad =0,057024 \quad \lbrack \dfrac{m^3}{h} \rbrack\end{equation*}

Beispiel 2

Wieviel sind 122 cm/min umgerechnet km/h ?

Auch hier geht man wieder so vor, dass man die gegebenen Einheiten in Bezug zu den gesuchten Einheiten setzt. Also 1km = 1000 m, 1m = 100 cm damit entspricht 1 km = 1000 * 100 cm = 10^5 cm oder 1 cm = \frac{1}{10^5} km.

Analog dazu verfährt man mit der zweiten Größe: 1h = 60 min damit entspricht 1 min = \frac{1}{60} h. Diese Werte werden nun wieder in die EInheitengleichung eingesetzt:

(4)   \begin{equation*} 122  \quad \lbrack \dfrac{cm}{min} \rbrack \quad = 122  \cdot \dfrac{\frac{1}{10^5}}{\frac{1}{60}} \quad \lbrack \dfrac{km}{h} \rbrack  \quad = 122 \cdot \dfrac{60}{10^5}  = \dfrac{7320}{100000} = 0,00732 \quad \lbrack \dfrac{km}{h} \rbrack\end{equation*}

Port-Manipulations Mechanismen

Es kann bei manchen Anwendungen vorkommen, dass die Arduino-Input/Output-Funktionen, wie analogRead() oder digitalWrite() zu langsam sind, und den Programmfluss stören. In solchen Fällen kann man auf die Hardware-Ports des ATmega 328 direkt zugreifen.

Da diese Form der Programmierung die Manipulation einzelner Bits erfordert, ist dazu die Kenntnis der wichtigsten Bit-Manipulationsoperationen in der Sprache C notwendig. Der Vorteil dieser Mühe liegt aber in sehr kompakten Programmen und vor allem erfolgt der Ablauf etwa 50mal schneller als mit den Standard Arduino-Input/Output-Funktionen.

Beim Arduino Uno mit dem ATmega 328 werden sämtliche Ein- und Ausgänge zu Ports zusammengefasst. Die komplette Pin-Belegung des ATMega328 ist in der Abbildung zu sehen. Hier erkennt man, dass die Pins nicht einzel angesteuert werden, sondern in mehrere Ports zusammengefasst sind.

Port B (digital pin 8 to 13)

Port C (analog input pins)

Port D (digital pins 0 to 7)

Es stehen bei diesem Prozessor drei Ports zur Verfügung, die mit den Buchstaben B, C und D bezeichnet werden. Port D beinhaltet am Arduino die digitalen Pins 0 bis 7, Port B die digitalen 8 bis 13 und Port C die analogen Pins 0 bis 5.

Wenn über Standardfunktionen wie z.B. digitalRead() sieht es für den Benutzer so aus, als würde er nur auf den von ihm gefragten Pin zugreifen und den Zustand entweder abfragen oder ändern. Im Hintergrund werden aber bei jeder dieser Operationen die Pins eines gesamten Ports angesprochen und dann die entsprechenden Ports so manipuliert, dass es so aussieht, als könnte man einen eInzelnen Pin adressieren. Daher benötigt ein DigitalWrite() Aufruf um einen einzelnen Pin auf HIGH oder LOW zu setzen bis zu 50 mal länger, als die direkte Port-Manipulation.

Die Ports werden von jeweils 3 Registern gesteuert, die mit DDRx, PORTx und PINx bezeichnet werden. Wobei das x für die Ports B, C und D stehen. Diese drei Register existieren für jeden Port, also zum Beispiel existiert für Port B ein DDRB-, ein PORTB- und ein PINB-Register. Analog gilt das auch für Port C und Port D. Das jeweilige DDRx-Register (DDR = Data Direction Register) legt fest, ob die PINs im entsprechenden Port als Input oder Output konfiguriert sein sollen. Das PORTx-Register legt bei der Ausgabe von Daten fest, ob die PINs HIGH oder LOW sind.

Für die Ausgabe von Daten wird das entsprechende Bit im DDRx-Register auf 1 (= Ausgabe) gesetzt. Somit kann nun die Ausgabe dadurch erfolgen, dass das korrespondierende Bit im zugeordneten PORTx- Register auf den gewünschten Wert gesetzt wird. Für die Daten-Eingabe wird im DDRx-Register das jeweilige Bit auf 0 (= Eingabe) gesetzt. Die an den Eingangs-Pins anliegenden Daten werden an die korrespondierenden Bits im PIN-Register übertragen und können dort abgerufen werden.

Beim AT Mega kommen dem selben Prinzip folgend noch zusätzliche Ports hinzu. Hier die Belegungen die ich bisher am meisten verwendet habe habe:

    //   ----    Arduino MEGA Portbelegung    ----

    //        Bit7| Bit6| Bit5| Bit4| Bit3| Bit2| Bit1| Bit0 
    // PortA:  P29 | P28 | P27 | P26 | P25 | P24 | P23 | P22 
    // PortL:  P42 | P43 | P44 | P45 | P46 | P47 | P48 | P49
    // PortF:  A7  | A6  | A5  | A4  | A3  | A2  | A1  | A0 
    // PortK:  A15 | A14 | A13 | A12 | A11 | A10 | A9  | A8
    

Aber es gibt noch weitere Ports bei AT Mega, die ich hier mal versucht habe in einer Übersicht darzustellen:

Port-Belegungen des Arduino AT Mega

Praktische Anwendung am Beispiel des Arduino Uno

Die einzelnen Register sind in der Arduino-Entwicklungsumgebung bereits als Namen vor definiert, man kann diese somit mit den entsprechenden Bezeichnungen wie beispielsweise PORTB, PINC usw. ansprechen. Beispielsweise setzt der Befehl 

DDRD = B00111010 die PINs D0, D2, D6 und D7 als Eingänge

sowie die PINs D1, D3, D4 und D5 als Ausgänge.

Wie schon erwähnt, wird über das PORTx Register fest gelegt, ob die Ausgangs-PINs auf LOW oder HIGH geschaltet werden sollen. Dabei steht das x immer symbolisch für einen der drei Ports. Um beispielsweise die PINs 8, 10 und 12 auf HIGH und PIN 9, 11 und 13 im Port B auf LOW setzen wollen, schreiben wir:

void setup(){
  DDRB = B11111111; // alle Bits als Ausgang
}
void loop (){
  PORTB = B10101010; // Wechselblinker mit allen Ausgaengen
  delay(300);
  PORTB = B01010101;
  delay(300);
}
//Weitere Beispiele:
DDRD = 0B11111111; // Alle PINs im Port D sind Output
PORTD = 0B11111111; // Alle PINs sind HIGH