R2-R Ladder

Gast #63871
Lesenswert?

Hallo,

ich habe mir ein 10bit R2R Ladder gebastelt. Nun habe ich
folgendes Problem: gibt es eine einfache Lösung in C diesen
anzusteuern ..? Bin leider noch Anfänger.

Hätte mir folgendes vorgestellt:
zB.: gewünschte Ausgabespannung: 4.62

V Port: 4,92

4,92/1024 = 0,0048046875

4.62/0,0048046875 = 961,5609756097560975609756097561

961 mod 2 = 1
480 mod 2 = 0
240 mod 2 = 0
120 mod 2 = 0
 60 mod 2 = 0
 30 mod 2 = 0
 15 mod 2 = 1
  7 mod 2 = 1
  3 mod 2 = 1
  1 mod 2 = 1

wäre dann binär: 11 1100 0001

Wenn ich jeden Rivisionsrest einer Veriable zuweise und die Portpins
dann einzeln setze funktiert das ja, nur die Lösung ist sicher nicht
das gelbe vom Ei.

.... gibts dafür ne einfache Lösung ... ?

Danke vorerst mal ..

Chris
Gast #63872
Lesenswert?

wo genau liegt denn da das problem? wozu fummelst du deinen ausgabewert
961 nochmal manuell in binär um?
man könnte es doch z.B. so auf zwei ports aufteilen:

v_pin=4.92;
v_out=4.62;
dac_wert=1024*v_out/v_pin;
port_low=dac_wert & 0xff;
port_high=(port_high & 0xfc) + (dac_wert >> 8);
Gast #63873
Lesenswert?

hi,

danke mal ... sorry, ein paar sachen sind mir dabei nicht klar ...

v_pin=4.92;                                       OK
v_out=4.62;                                       OK
dac_wert=1024*v_out/v_pin;                        OK
port_low=dac_wert & 0xff;
     port_low=0x3C1 & 0xFF
     port_low=0xC1 (1100 0001)                    OK

port_high=(port_high & 0xfc) + (dac_wert >> 8);
     port_high=?????????????????  + (11 1100 0001 >> 8)
     port_high=?????????????????  + (11)

was macht: (port_high & 0xfc)

wird dadurch der status der anderen 6 portpins (PA0 - PA5) in dem fall
am port_high beeinflußt? die sind nämlich bereits belegt ..

zB.:

void OutputRR(void)
{
    float v_pin;
    float v_out;
    float dac_wert;
    int port_low;
    int port_high;

    v_pin=4.92;
    v_out=4.62;
    dac_wert=1024*v_out/v_pin;
    port_low=dac_wert & 0xff;
    port_high=(port_high & 0xfc) + (dac_wert >> 8);

    DDRB = 0xFF; //DDR für Port B auf Ausgabe
    DDRA = 0xFF; //DDR für Port A auf Ausgabe
    PORTA = port_high;
    PORTB = port_low;

    PORTA.0 = 1; // PORTA.0 bis A.5 in Verwendung
    PORTA.1 = 1;
    PORTA.2 = 0;
    PORTA.3 = 1;
    PORTA.4 = 0;
    PORTA.5 = 1;

}

würde das so funktionieren .... ?

thx
Chris
Gast #63874
Lesenswert?

das "port_high & 0xfc" setzt die beiden untersten bits auf 0.
anschliessend wird der wert dieser beiden bits aufaddiert. sinn der
sache ist jene beiden bits zu setzen ohne den rest des ports zu
verändern.
#63876
Lesenswert?

"ein 10bit R2R Ladder gebastelt"

Bist Du sicher, daß das auch funktioniert ?

Mit normalen 1% Widerständen (1/100 genau) kommst Du ja nicht mal auf 7
Bit (1/128 genau).

Deshalb macht sowas heutzutage keiner mehr zu Fuß, sondern nimmt
fertige DACs, wo der Hersteller dafür sorgt, daß die internen
Widerstände genau genug sind.


Peter
Gast #63877
Lesenswert?

0,1 % Widerstände gibt's ja auch. ;-)  Habe mich letztens erst
gewundert,
was der violette Toleranzring auf ein paar Widerständen ist...  da
habe
ich erstmal nachgucken müssen dafür. :)
#63880
Lesenswert?

"welche Analogschalter??"

Wenn Du Dir mal die Innenschaltung eines R/2R-DAC ansiehst, ist da für
jedes Bit ein Analogschalter drin, der zwischen Analog-GND und Analog-
Referenz umschaltet.

Anders gesagt, wen Du die R/2R direkt auf den MC legst, sind auch mit
0,1% Widerständen keine 10 Bit drin.
Deine Ausgangsspannung würde ordentlich zappeln, je nachdem, welche
Last die anderen Pins Deines MC gerade ansteuern.


Peter
Gast #63881
Lesenswert?

Zusätzlich ist noch die Versorgungsspannung zu berücksichtigen, jede
Schwankung schlägt voll zu. Deshalb schaltet man üblicherweise mit
Kontstantstrom, da spielen Versorgungsschwankungen keine Rolle
mehr.Solche Anordnung habe ich selbst vor 20 Jahren nur bis 4 Bit
eingesetzt.

MfG  Manfred Glahe
Gast #63882
Lesenswert?

und das erzählt mir mir jetz, wo ich die schaltung fertig habe?! :)
naja, hab den filter noch nich aufgebaut, aber bis jetz ist es
eigentlich das, was ich erwartet habe (von der genauigkeit her)

Hab Silizium Widerstandsreihen verwendet für meine 8 Bit. aber den
Spannungsteilerstrang dann doch mit 10% (!) Kohleschicht-R´s machen
müssen.

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