DAC werte berechnen

OP #1018832
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?
Gast #1018840
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ß
OP #1018844
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.
Gast #1018851
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
OP #1019869
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.
OP #1019976
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?)
Gast #1020206
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren