Hallo zusammen,
ich versuche gerade, ein einfaches DAC Modell zu bauen, um es in Monte Carlo Analysen zu verwenden. Es sollen folgende Eigenschaften unterstützt werden
- Resolution
- Vref
- Offset error
- gain error
Ich habe insbesondere mit dem Gain Error Probleme. Ich schreibe mal ein paar Definitionen. Die meisten Infos stammen aus https://e2e.ti.com/blogs_/b/analogwire/posts/dac-essentials-the-pursuit-of-perfection und https://www.infineon.com/dgdl/ap3212111-ADC-Measurement-v11.pdf?fileId=db3a304318f3fe2901191955cd3c2de3
Annahmen, Auflösung = 8 bit, kein Rauschen, kein INL, keine Temperaturabhängigkeit. Vref = V+ = 3V3, V- = GND = 0V
- N = Auflösung = 8 Bit
- LSB = gain = Steigung der Kennlinie = eine "Kodierstufe": FSR/2^N = 12.89 mV/code
- FSR = Full scale range: Vref = 3.3 V
- FS = Full scale = maximal ausgebbare Spannung bei DAC_MAX: FSR-LSB = 3.287 V
- DAC_MAX = maximaler dac code: 2^N-1 = 255
Ich denke soweit sollte es passen.
Jetzt steht z.B. im DB von Analog Devices https://www.analog.com/media/en/technical-documentation/data-sheets/ad5673r-5677r.pdf
- offsetErr = Offset Error max = +/- 2 mV
- gainErr = Gain Error max = +/- 0.12 %FSR
Ich würde sagen, die Ausgangskennlinie des DAC kann dann so beschrieben werden:
vOut = dacIn*(gain + gainErr/100*FSR) + offsetErr
vOut ist dann die ausgegebene Spannung am DAC Pin, dacIn ist quasi der code = der DAC Register Wert.
Aber: Irgendwas passt nicht. Angenommen ich möchte den code 16=2^4 ausgeben, der in einer idealen Spannung von 206.25 mV (16*LSB) resultieren würde, dann wäre mit offset Fehler vOut=206.25 mV +/- 2 mV.
Aber der gainErr wäre +/-0.12/100*3.3 = +/-3.96 mV und damit ja schon im 1/10 Wertebereich wie der gain von 12.89 mV/code.
Der Fehler wäre dann also entweder 16*(gain + 3.96) +/-2 mV = 269 +/- 2 mV oder 16*(gain - 3.96) +/- 2 mV = 143 +/-2 2mV.
Das sind ja gigantische Fehler, das kann ich mir nicht vorstellen.
Habe ich bei der Umrechnung des gain errors in %FSR einen Fehler gemacht? Muss das nochmal durch 2^N oder so geteilt werden?
Vielen Dank!
Edit: Könnte es sein, dass es
vOut = dacIn*(gain*(1 + gainErr/100*FSR)) + offsetErr
sein muss, also der gainErr noch mit dem gain multipliziert werden muss?