Forum: Mikrocontroller und Digitale Elektronik R2-R Ladder


von Christian (Gast)


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

von Dingens (Gast)


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);

von Christian (Gast)


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

von Dingens (Gast)


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.

von Christian (Gast)


Lesenswert?

hi,

danke ... habe das mit dem bitweise UND auch gecheckt ... find ich
super ..

thx
CHRIS

von Peter D. (peda)


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

von Jörg Wunsch (Gast)


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. :)

von Peter D. (peda)


Lesenswert?

Ja mit 0,1% gehen 10 Bit gerade so (1/1000 statt 1/1024).

Aber auch die Analogschalter berücksichtigen !

Bei 10k/20k fürs R/2R dürfen die höchstens 10 Ohm On-Widerstand haben.


Peter

von Christian (Gast)


Lesenswert?

@Peter: welche Analogschalter??

hat jemand einen Schaltplan für DAC und AVR und evtl. C-Source?
würde mir das gerne anschauen ...

Chris

von Peter D. (peda)


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

von Manfred Glahe (Gast)


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

von Henning (Gast)


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.

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.