Habe ein Problem mit dem ADU beim ATMega8. Habe einen DMX Transceiver gebaut um mit ihm LED Scheinwerfer anzusteuern. Zum Einstellen der Helligkeit und der Geschwindigkeit des Farbwechsels habe ich zusätzlich 2 Potis genommen. Ich will die beiden Spannungswerte der Potis (~0 - 5V) digitalisieren (mittels ADU) und zur Steuerung der Helligkeit und der Geschwindigkeit des Farbwechsels verwenden. Wenn ich nur einen der beiden ADU Eingänge verwende, passen die Werte. Aber wenn ich beide Eingänge auslese, vermischen sich die Ergebnisse und es kommt ein Blödsinn raus. Hab schon diverse Methoden probiert, aber noch keine Lösung gefunden. - Hab schon probiert den ADU jedes Mal zuerst zu starten und nach der Konvertierung wieder zu beenden - Hab schon probiert, vor der Konvertierung ein Dummie-Readout zu machen und danach den Mittelwert aus 4 Ergebnissen zu bilden Ich mache die Auswertung mittels Polling, weil ich vermeiden will, dass der ADU Interrupt mit dem Interrupt des USART (DMX) konguriert. Der Code im Anhang ist vereinfacht, habe alle DMX betreffenden Teile herausgenommen, da ich hoffe, dass so jemand schneller einen Fehler entdeckt. Wäre sehr sehr dankbar wenn mir bei dem Problem jemand helfen könnte.
Hallo Dominik, Schonmal mit dieser Funktion hier versucht? http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Aktivieren_des_ADC Das benutze ich immer und es hat bisher super geklappt. Ansonste poste mal deinen Schaltplan.
Diese Version hab ich schon probiert. Es ändert sich nichts. Schaltplan: hab zwei 10k Potis am ADC0 und am ADC1 eingang. Poti liegt an 0 und +5V, Schleifer auf µC Des komische ist, beide Potis sind angeschlossen, in dem Modus in dem nur ein Kanal ausgelesen wird, funktionierts ohne Probleme. Erst wenn ich den zweiten Kanal zusätzlich auslesen will kommt nichts gescheites raus.
Lies hier nochmal nach, wie man das ADC-Register ausliest: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29 Auf den ersten Blick sehe ich nur, dass du lediglich den ADCH ausliest. Mal davon abgesehen, dass ADCH dir nur die Auflösung / 8 gibt, musst du beide Register auslesen. Von der Beschaltung sollte es so funktionieren. Wo setzt du deine Referenzspannung?
LordZiu schrieb: > Auf den ersten Blick sehe ich nur, dass du lediglich den ADCH ausliest. > Mal davon abgesehen, dass ADCH dir nur die Auflösung / 8 gibt, musst du > beide Register auslesen. Nein. Muss er nicht. ADCH muss auf jeden Fall gelesen werden. ADCL nur dann, wenn man am Wert interessiert ist (und wenn das der Fall ist, dann muss ADCL vor ADCH ausgelesen werden. ADCL lesen verriegelt den ADC Wert gegen Veränderungen, ADCH lesen hebt die Verriegelung wieder auf). Da er ADLAR gesetzt hat reicht es nur ADCH zu lesen. Ich seh im Code allerdings auch nichts.
Könnte es sein, dass der Interrupt des USARTs die Konvertierung beeinträchtigt? Allerdings wüsste ich dann gern, warum es funktioniert, wenn ich nur einen Kanal auslese. Ein Freund hat gemeint, dass eventuell eine Verknüpfung zwischen den beiden Kanälen sein könnte, weiß jemand was dazu?
Hi Ich sehe keinen Wert für den Prescaler. Möglicherweise ist dein ADC zu schnell. MfG Spess
Was für ein Prescaler wär bei 16 MHz empfehlenswert? Warum funktionierts dann, wenn ich nur einen auslese?
Dominik W. schrieb: > Was für ein Prescaler wär bei 16 MHz empfehlenswert? Datenblatt nachsehen. Da steht drinnen, in welchem Ferquenzbereich der ADC benutzt werden soll. Du hast deine Taktfrequenz, weist in welche Frequenzbereiche du kommen musst und suchst dir davonausgehend den dafür notwendigen Prescaler. > Warum funktionierts dann, wenn ich nur einen auslese? Wahrscheinlich deswegen, weil du dann zwischendurch den Kanal nicht wechselst. Die Sample&Hold Stufe wird sich dann irgendwann auch so auf den richtigen Wert einstellen. Schlimmstenfalls erst nach dem 2.ten oder 3.ten Ausleseversuch.
Der Multiplexer ist das Problem, vor allem bei der Abtastrate. Ich nutze den ATmega ADC generell nur per Interrupt, und wenn ich den ADMUX umschalte, warte ich erstmal 1 - 4 ADC Werte, bis ich sie nutze. Funtioniert wunderbar mit allen Kanälen. ninja'd!
Hi >Der Multiplexer ist das Problem, vor allem bei der Abtastrate. Nein, die Sample&Hold-Stufe. Irgendwann reicht die Zeit nicht mehr, um den Kondensator unzuladen. >Ich nutze den ATmega ADC generell nur per Interrupt, und wenn ich den >ADMUX umschalte, warte ich erstmal 1 - 4 ADC Werte, bis ich sie nutze. Dann kannst du den ADC auch gleich langsamer laufen lassen und es klappt dann auch bei jeder Messung. >Was für ein Prescaler wär bei 16 MHz empfehlenswert? Bei 16MHz: 128 MfG Spess
spess53 schrieb: >>Der Multiplexer ist das Problem, vor allem bei der Abtastrate. > > Nein, die Sample&Hold-Stufe. Irgendwann reicht die Zeit nicht mehr, um > den Kondensator unzuladen. stimmt ja, hätte schreiben sollen "das multiplexen der S/H"... egal, ich nehme lieber höhere Abtastrate und schmeiße die ersten Werte weg, betreibe dafür dann oversampling.
also ich nehme jeden Wert, auch nachdem ich den MUX umgeschaltet habe und es funktioniert, ich habe auch im Datenblatt nichts gefunden dass es nicht funktionieren sollte, man sollte natürlich das Datenblatt beachten beim Umschalten
Hab jetzt den Prescaler auf 64 eingestellt und es FUNKTIONIERT!!! Herzlichen Dank an spess53 Hab alles probiert und an alles gedacht, außer an die Geschwindigkeit!
Du solltest trotzdem lieber Prescaler 128 nehmen, wie Spess schrieb, damit die Frequenz zwischen 50kHz nud 200kHz liegt, siehe Tutorial ADC.
Hi >Hab jetzt den Prescaler auf 64 eingestellt und es FUNKTIONIERT!!! Freut mich. >Hab alles probiert und an alles gedacht, außer an die Geschwindigkeit! Wenigstens wirst du das nicht so schnell wieder vergessen. MfG Spess
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.