www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DAC werte berechnen


Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht 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
//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);
/************************************************/

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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verstehe nicht, was dein Teiler da soll.

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

Autor: Marcus W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marcus W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>dann gibt der DAC mir 45 aus

Wie stellst du das denn fest?

Welche Referenzspannung hat der 16bit DAC?

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht 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 :
      Ist_Strom = ReadChannel(STROM);
      Ist_Strom = Ist_Strom*Max_Soll_Strom;   // Multiplizieren mit Max sollstrom(1024 entspricht Max_Soll_Strom).
      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.

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weiß den echt niemand wie ich es machen kann???

Autor: Alexander Liebhold (lippi2000)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Der Grosse (jonnyk)
Datum:

Bewertung
0 lesenswert
nicht 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 :
      Ist_Strom = ReadChannel(STROM);
      Ist_Strom = Ist_Strom*Max_Soll_Strom;   // Multiplizieren mit Max sollstrom(1024 entspricht Max_Soll_Strom).
      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?)

Autor: Alexander Liebhold (lippi2000)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.