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
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);
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
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.
hi, danke ... habe das mit dem bitweise UND auch gecheckt ... find ich super .. thx CHRIS
"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
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. :)
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
@Peter: welche Analogschalter?? hat jemand einen Schaltplan für DAC und AVR und evtl. C-Source? würde mir das gerne anschauen ... Chris
"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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.