Forum: Mikrocontroller und Digitale Elektronik DAC werte berechnen


von Der G. (jonnyk)


Lesenswert?

Hallo Leute,

Habe eine Große herausvorderung vor mir.
bin jetzt seit fast einem haben tag dran und komme einfach nicht weiter.

Folgendes problem:

Ich habe einen ADC dem ich am Mega 256 mit I2C betreibe.

Jetzt habe ich ein Programm geschrieben wo ich strom und spannung 
eingeben kann und die Maximal werte dafür festlegen kann.

Funktioniert soweit eigentlich.

Aber die Maximal werte sind Variabel d.h. man kann sie während des 
ablaufs ändern.

Wenn ich also einen wert z.b. 27 angebe soll 27 auch ausgegeben werden 
unabhängig vom Max wert.
wenn der Maximal wert aber kleiner ist als der angegebene dann den 
Maxwert ausgeben.

wenn ich also den Max wert 100 eingebe dann den sollwert 50
funktioniert es einwand frei.
wenn ich jetzt den Max wert auf 200 erhöhe dann gibt der DAC mir 45 aus 
obwohl immer noch 50 eingestellt sind.
Und je höher der Maxwert ist desto mehr weicht es von dem Sollwert ab.

hier noch die routine
1
//Strom Berechnen und ausgeben
2
/************************************************/
3
/**/    Teiler = Soll_Strom*65535;  //65535 die Auflösung des DAC´s
4
/**/    Teiler = Teiler / Max_Soll_Strom;
5
/**/    I2C(I2C_SollStrom_CMD,Teiler);
6
/************************************************/

Weiß jemand ne lösung?
Mathematiker unter eucht?

von crazy horse (Gast)


Lesenswert?

Verstehe nicht, was dein Teiler da soll.

if (sollwert > max_wert) sollwert=max_wert;
ausgabe (sollwert);

von Marcus W. (Gast)


Lesenswert?

if (soll_strom > max_soll_strom) ->
   I2C(I2C_SollStrom_CMD,max_soll_strom);
else ->
   I2C(I2C_SollStrom_CMD,soll_strom);


Hier mal funktional beschrieben was du vorhast.
Es fehlt nur noch die Umrechnung in den DAC-Wert, aber das bekommst du 
ja hin oder?

Gruß

von Der G. (jonnyk)


Lesenswert?

Nein das ist genau das Problem.

Die UMRECHNUNG ist das problem nicht das auswerten ob es grösser oder 
kleiner ist

Zitat:

wenn ich also den Max wert 100 eingebe dann den sollwert 50
funktioniert es einwand frei.
wenn ich jetzt den Max wert auf 200 erhöhe dann gibt der DAC mir 45 aus
obwohl immer noch 50 eingestellt sind.
Und je höher der Maxwert ist desto mehr weicht es von dem Sollwert ab.

hier noch die routine
//Strom Berechnen und ausgeben
/************************************************/
/**/    Teiler = Soll_Strom*65535;  //65535 die Auflösung des DAC´s
/**/    Teiler = Teiler / Max_Soll_Strom;
/**/    I2C(I2C_SollStrom_CMD,Teiler);
/************************************************/

Ende Zitat.

von Marcus W. (Gast)


Lesenswert?

65535/maximalspannung_die_der_adc_ausgibt_wenn_du_65535_hinschickst*soll 
spannung

Das ganze am besten als Integer, könnte also z.B. so aussehen:
65535/1000*250

also 1000 sind 10 volt und 250 z.B. 2,5V

von Matthias L. (Gast)


Lesenswert?

>dann gibt der DAC mir 45 aus

Wie stellst du das denn fest?

Welche Referenzspannung hat der 16bit DAC?

von Der G. (jonnyk)


Lesenswert?

Also der DAC hat eine referenz spannung von 5 Volt und die werte gebe 
ich auf´m display aus.

Jetzt mal anders ausgedrückt:

Ich habe einen ADC bei dem ich folgendes berechne :
1
      Ist_Strom = ReadChannel(STROM);
2
      Ist_Strom = Ist_Strom*Max_Soll_Strom;   // Multiplizieren mit Max sollstrom(1024 entspricht Max_Soll_Strom).
3
      Ist_Strom = (Ist_Strom)/1024;// auf richtigen Wert bringen teilen durch 1024  (Auflösung des ADC)

und jetzt muss ich diese rechnung umgekehrt machen.
und das kriege ich nicht hin.

Ich habe jetzt also den "fertigen" Ist_Strom und muss ihn zu einem 
zwieschen  0-65535 wert umwandeln der aber vom der Max Spannung abhängt.

hoffe es ist jetzt verständlicher.

von Der G. (jonnyk)


Lesenswert?

Weiß den echt niemand wie ich es machen kann???

von Alexander L. (lippi2000)


Lesenswert?

Entweder du kannst deine Frage bzw. Aufgabe/Problem nicht richtig 
formulieren od. nicht rechnen!?

Dein 3-Zeilenprogramm macht nix anderes als:

Also was willst du genau machen, wie seiht dein Vergleich aus und was 
willst du berechnen???

von Der G. (jonnyk)


Lesenswert?

Hi.

Ich kann tatsächlich mein Problem nicht beschreiben.

Der Wert den ich am (12 Bit)ADC einlese wird an einem 16 bit DAC 
ausgegeben.

Ich kann ihn mit 'nem poti einstellen.

eingelesen wird er durch :
1
      Ist_Strom = ReadChannel(STROM);
2
      Ist_Strom = Ist_Strom*Max_Soll_Strom;   // Multiplizieren mit Max sollstrom(1024 entspricht Max_Soll_Strom).
3
      Ist_Strom = (Ist_Strom)/1024;// auf richtigen Wert bringen teilen durch 1024  (Auflösung des ADC)

Ich weiß jetzt aber nicht wie ich einen wert ausgeben kann so das ich es 
mit der oben genanten gleichung einlesen kann.
(nicht verständlich oder?)

von Alexander L. (lippi2000)


Lesenswert?

Na das bedeutet, du musst dein Messwert um 4-Bit erweitern. Also 
Messwert*2^4 = Messwert*16!

Jetzt kannst du beide vergleichen, da sie einen Wertebereich von 0-65536 
haben.



Warum willst du einen Messwert mit einem Maximal-Sollwert 
multiplizieren???

von eProfi (Gast)


Lesenswert?

Bedenke, dass die Berechnungen beim Erweitern mit 32 Bit erfolgen 
müssen.


So wie ich das verstehe, willst Du folgendes:

Uint32 Max_Soll_Strom;//damit die folgende Berechnung mit 32 bit gemacht 
wird
16bit  =  12bit + 10bit            - 6bit
DAC    = (ADC   * Max_Soll_Strom) >> 6;

Stimmt meine Vermutung?
Wenn nein, musst Du nochmal genauer erklären, was Du willst.
Bring doch mal ein Beispiel.
Das mit den Max-Werten (erstes Beispiel) habe ich nicht verstanden, und 
da bin ich sicher nicht allein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.