hackspider
Wakü-Poseidon

Karma: +4/-0
Offline
Geschlecht: 
Beiträge: 412

|
Hi,
das ist eigentlich eine ausgezeichnete Frage. Einerseits hat man - von der Auflösung abhängige - Rohwerte (bei 8bit 0-255 bei 10bit 0-1023). Diese könnte man ausgeben. man muss halt die Auflösung des ADCs kennen.
Alternativ kann man die Rohwerte in physikalische Größen umrechnen: z.B. Rohwert 0 entspricht 0V, 255 entspricht 12V. Das ist allerdings abhängig vom eingesetzten Spannungsteiler und den Min und Max Werten. Das ist auch noch relativ einfach solange die Umrechnung linear ist. Komplexer wird es wenn man den ADC dazu verwenden will Temperaturen mit NTCs zu messen die dann eine Kennline (Polynom) benötigen.
Prinzipiell kann man die Berechnung im ADC-Modul oder auf dem zentralen µC machen.
Um hier weiter zu kommen können wir mal physikalische Größen sammeln die Sinn machen zu messen:
- Spannung 0-5V
- Spannung 0-12V
- Spannung 0-3.3V
- Spannung 0-7V
- Temperatur 0-100GradC
Noch mehr?
Implementierung könnte irgendwie so aussehen (Wenn die Umrechnung auf dem ADC-Modul erfolgen soll):
/* Commands */ enum I2C_Commands { Â Â SET_CONFIG = 0, Â Â READ_CONFIG, Â Â READ_VALUE, Â Â NUMBER_OF_COMMANDS }
/* Supported Configurations */ enum I2C_Configurations { Â Â CONFIG_5V = 0, Â Â CONFIG_12V, Â Â CONFIG_3V3, Â Â CONFIG_7V, Â Â CONFIG_NTC_5K, Â Â CONFIG_RAW, Â Â ...., Â Â NUMBER_OF_CONFIGURATIONS }
[...]
i2c_read_buffer(&buffer[0]);
switch (buffer[0]) { case SET_CONFIG: Â Â { Â Â Â Â uint8_t channel = buffer[1]; Â Â Â Â I2C_Configurations config = buffer[2]; Â Â Â Â set_channel_configuration(channel, config); Â Â } [...] case READ_VALUE: Â Â { Â Â Â Â uint8_t channel = buffer[1]; Â Â Â Â I2C_Configurations config = getConfig(channel); Â Â Â Â uint8_t adcValue = getADCValue(channel);
    uint8_t physValue = getPhysValue(config, adcValue);         buffer[0] = config;     buffer[1] = physValue;
    i2c_write_buffer(&buffer[0]);   } [...] }
Alles nur Pseudocode, da fehlt noch einiges (allen voran Größenbehandlung der Puffer). Da liegt auch kein Design dahinter, soll also nur zum Verständnis der Abläufe/Berechnungen dienen also bitte nicht auf die Goldwage legen (ist auch schon spät).
Also Protokoll wäre dann folgendes
SetConfig (Main µC -> ADC Modul): Command | Channel | Config (je 1 Byte)
ReadValueRequest (Main µC -> ADC Modul): Command | Channel (je 1 Byte)
ReadValueResponse (ADC Modul -> Main µC): Config | Value (je 1 Byte -> sollte eher mehr sein beim Value)
Für die anderen Befehle muss man sich das noch überlegen (und die 3 ggf. noch anpassen).
--> Langsam können wir auch über ein gemeinsames Repository bei GitHub, Gitorious, Sourceforge oder google code gedanken machen.
Viele Grüße   hackspider
PS: Beim drüberlesen merke ich grade, dass das nicht mein bester Beitrag ist. Ich hoffe es ist dennoch soweit verständlich.
|