Ich benutze zwar schon länger den ATmega16M1 als kleinen niedlichen CAN und/oder LIN Controller, den DAC habe ich bis jetzt aber nicht gebraucht. Jetzt schaue ich mir den DAC gerade im Datenblatt an und finde das schon etwas sehr dünn gehalten. Gerade mal fünf Seiten inklusive der Beschreibung er zwei Register und rein gar nichts in den "Electrical characteristics". Ich konnte leider auch weder eine Application-Note endecken, noch einen anderen Controller mit der gleichen Unit. Die 90PWM sind scheinbar ähnlich, da steht aber noch weniger im Datenblatt und der DAC ist langsamer. "The output impedance of the driver is around 100Ohm. So the driver is able to load a 1nF capacitance in parallel with a resistor higher than 33K with a time constant around 1μs" Okay, 100 Ohm ist schon angenehm wenig - nur leider ist das die einzige Angabe dazu im Datenblatt die ich bisher entdeckt habe. Der DAC wird ja wohl nicht +/- 50mA treiben können bei 5V. Und die 1µs sind die einzige Angabe zum Timing. Das ist wirklich unabhängig vom Takt des Controllers?? Was passiert da von einem Wert auf den anderen? "The first DAC conversion result after switching reference voltage source may be inaccurate, and the user is advised to discard this result." Das sieht ja eher aus wie ein Copy-Paste Fehler. Was kann man dem DAC zumuten? Die Anwendung die ich hätte wäre die Strombegrenzung von zwei Konstantstromquellen RCD-24 einzustellen. Per Pullup auf 5V um die beim Einschalten/Reset des Controllers auf Null zu drehen und dann auf aktuell so gegen 2V einstellen. Wäre z.B. unlustig wenn der DAC bei einer Wertänderung erstmal auf 0V einbricht. Hinderlich wäre jetzt auch, wenn der gar keinen Strom aufnehmen kann. Erfahrungen? Meinungen? Habe ich was übersehen? :-)
Hmm, nichts? Okay, ich spiele gerade ein wenig mit dem DAC rum, ist ja mit zwei Registern einfach genug soweit. :-) Na okay, es wird die Referenz vom ADC benutzt, also einschalten muss man die dann auch noch, im Falle des ATmega16M1 so: ADMUX = (1<<REFS0); // Ref = AVCC ADCSRB = (1<<AREFEN); // Kondensator am ARef Pin Jetzt den DAC aktivieren mit: DACON = (1<<DAOE) | (1<<DAEN); Und einfach mal Werte in das DAC Register schreiben. Das funktioniert auch erstmal. Allerdings gibt es Aussreisser beim 8-Bit Überlauf. Eigentlich dachte ich ja, dass sich der GCC automatisch um die richtige Reihenfolge beim Zugriff auf 16 Bit Register kümmert. Zumindest beim DAC klappt das aber nicht. Es muss zuerst DACL und dann DACH geschrieben werden, mit DAC = wert; wird aber wohl erst DACH und dann DACL gechrieben. Also von Hand richtig herum und sieht gut aus. Und zumindest mit 10k Pullup gegen 5V hat der DAC auf den ersten Blick auch kein Problem.
Hey, Here two ASM snippets on how to setup and read the DAC of the ATmegaxxM1 series AVR micro. ldi temp, (1<<DAOE)|(1<<DAEN) ;enable DAC & output (D2A) sts DACON, temp ;Vref DAC = AVcc (5.00V) Polling the DAC as fast as you like. sts DACL, ZL ;store 10-bit sample on DAC sts DACH, ZH Bye :)
PS. reference voltage DAC is set by the reference voltage ADC. ldi temp, 0b01100111 ;ADC7, AVcc + 100n @ Aref sts ADMUX, temp ; left adjusted result
RES schrieb: > update the DAC as fast as you like. Hmm, no limits mentioned does not always mean there are none. :-) RES schrieb: > PS. reference voltage DAC is set by the reference voltage ADC. As I wrote above. :-) The problem remains though that while the DAC sort of works the amount of information in the datasheet is a bad joke.
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.