Guten Tag! Bitte entschuldigt diese Frage, ist warscheinlich ein ganz dummer Fehler, aber ich komme leider nicht dahinter. :( Aufgabenstellung ist, ein PWM - Signal im Phase Correct Mode des Timer0 auszugeben. Das Tastverhältnis soll mit einer Spannung von 0-5V am ADC0 (PA0) des µC verändert werden können, und genau das ist der Teil, der nicht funktioniert. Setze ich in dem angehängten Programm das OCR0 Register auf einen bestimmten Wert (z.B 0x80), dann funktioniert die PWM so wie sie soll. Wird hingegen der Wert vom ADC bereitgestellt, dann funktioniert die PWM immer noch, hat einen bestimmten Wert, und lässt sich nicht mehr verändern. Ich habe die Ausrichtung ADLAR = 1 gewählt, da hier die Bits 2 - 9 im ADCH stehen. Der Wert, den der ADC bei Uin = Uref ausgibt ist ja 0x1FF oder? Somit würde in diesem Fall ein Dezimalwert von 7 im ADCH stehen. Deshalb habe ich das Ergebnis mit 36 multipliziert, da somit der Wert 0xFF im ADCH steht und ich das 8 bit Register OCR0 laden kann. Als Referenz habe ich AVCC ausgewählt (REFS0 = 1) somit ist keine Beschaltung des AREF Pins nötig oder? AVCC wurde nach Datenblatt beschaltet. Ich bitte euch, mein Programm im Anhang anzuschauen, Auf die Schaltung habe ich verzichtet, da nur Versorgung des ADC (welche ich aus dem Datenblatt des ATMEGA32 auf S.210 entnahm), Versorgung des µC relevant wären. Wäre wirklich froh. wenn mir jemand auf die Sprünge helfen könnte! Vielen Dank schon im Vorhinein. Lg Stefan
Hi >ADCSRA &= ~(1<<ADEN); //ADC ausschalten >_delay_us(20); Wozu soll das gut sein? >SOLL=ADCH*36 ; //Ergebnis anpassen Multiplikation eines 8-Bit-Wertes mit 36 >OCR0 = SOLL ; //OCR mit Sollwert für Drehzahl laden Und dann in ein 8-Bit-Register laden? >unsigned char SOLL=0; Sind das nicht 8 Bit? MfG Spess
Zuerst mal Vielen Dank, für die schnelle Antwort! Der erste Teil war gedacht, damit ich den ADC für eine andere Anwendung im Programm umkonfigurieren kann. Um ADMUX zu verändern muss man den ADC ausschalten oder? Ups, da hab ich mich Verrechnet, der richtige Wert wäre 2 wenn ich nicht mich nicht irre. 0111 1111bin * 2d ergeben dann 1111 1110... ist also auch ein 8 bit Wert. Ja...der Wert SOLL hat 8 bit ;) Jedoch funktioniert das Programm mit diesen Änderungen noch immer nicht...jetzt ist der OC0 Ausgang dauernd auf "1", oder hat eine sehr kleines Tastverhältnis. Ich vermute mal, dass es an der Multiplikation von ADCH * 2 liegt....der maximal mögliche Wert des ADC sind ja 0x1FF, was ein Bitmuster von 0001 1111 1111 ergibt.....da ADLAR = 1 steht im ADCH 0111 1111 oder? und dieser Wert * 2d ergibt dann 1111 1110, und das wäre der maximale Wert, mit dem das OCR0 Register geladen wird... Ich steh leider gerade auf der Leitung... Lg
Hi
>der maximal mögliche Wert des ADC sind ja 0x1FF,
Nein. 0x3FF (2^10-1). Damit kann mit, gesetztem ADLAR, ADCH maximal 0xFF
werden. Die Multiplikation ist damit unnötig.
Was mir gerade augefallen ist: Dein ADC läuft mit vollen Controllertakt.
Du solltest den ADC-Takt mit den ADPSn-Bits auf einen Wert zwischen 50
und 200kHz einstellen. Außerdem ist es besser, statt dem _delay_us(20)
darauf zu warten bis ADSC wieder 0 ist.
MfG Spess
Super...danke! :) Ohh...da hat mich wohl das Diagramm im Datenblatt verwirrt...habe leider noch keine Erfahrung mit AVR's...ich hoffe, dass das in Zukunft besser wird! ;) Die Veränderung des Takts hat dann letztendlich das Problem gelöst! Im Anhang das funktionierende Programm! Vielen herzlichen Dank Spess!!! :) Lg
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.