Forum: Mikrocontroller und Digitale Elektronik PWM in Verbindung mit ADC - ATMEGA32


von Stefan H. (hoebi)


Angehängte Dateien:

Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Stefan H. (hoebi)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Stefan H. (hoebi)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.