Forum: Mikrocontroller und Digitale Elektronik ATMega128 HArdware-PWM


von ----- -. (hobbyavr)


Lesenswert?

Hallo zusammen,

ich möchte gerne einen Motor mit einem ATMega128 ansteuern.
Dazu nutze ich den Treiber L298.
Um die Geschwindigkeit des Motors zu ändern, muss dabei ein PWM-Signal 
geliefert werden.
Nun meine Frage: Wie lasse ich den ATmega128 ein PWM-Signal generieren?

Das PWM-Signal soll an folgendem Ausgang anliegen:
OC1B-PB6 (PinNr. 16)

Erstmal habe ich einfach eine LED angeschlossen (die müsste ja zumindest 
leuchten)
Hier der bisherige Versuch:

1
DDRB |= (1<<DDB6); // Port OC1B mit angeschlossener LED als Ausgang
2
3
TCCR1A = (1<<WGM10) | (1<<COM1A1); // PWM, phase correct, 8 bit.
4
TCCR1B = (1<<CS11) | (1<<CS10); // Prescaler 64 = Enable counter
5
OCR1A = 128-1; // Duty cycle 50%
6
7
whlie(1);

Mit der LED passiert aaber leider garnichts...
Was ist falsch?

Schonmal Danke für Hilfe

von holger (Gast)


Lesenswert?

>Das PWM-Signal soll an folgendem Ausgang anliegen:
>OC1B-PB6 (PinNr. 16)

Warum stellst du dann OC1A auf PWM?

von ----- -. (hobbyavr)


Lesenswert?

holger schrieb:
> Warum stellst du dann OC1A auf PWM?

Ich habs aus dem Tutorial und vergessen, den Teil zu ändern
Danke :)


Es funktioniert aber leider immer noch nicht; die LED leuchtet weiterhin 
nicht...

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Haste vllt vergessen die Fuse rauszunehmen für den Atmega103 kompatiblen 
Modus?

von Stefan E. (sternst)


Lesenswert?

----- ----- schrieb:
> Es funktioniert aber leider immer noch nicht; die LED leuchtet weiterhin
> nicht...

Und wie der Code jetzt nach den Änderungen aussieht, sollen wir raten?

von ----- -. (hobbyavr)


Lesenswert?

Hier der aktuelle Code (ich habe nur auf OC1B umgestellt):
1
DDRB |= (1<<DDB6); // Port OC1B mit angeschlossener LED als Ausgang
2
3
TCCR1A = (1<<WGM10) | (1<<COM1A1); // PWM, phase correct, 8 bit.
4
TCCR1B = (1<<CS11) | (1<<CS10); // Prescaler 64 = Enable counter
5
OCR1B = 128-1; // Duty cycle 50%
6
7
while(1);



Martin Wende schrieb:
> Haste vllt vergessen die Fuse rauszunehmen für den Atmega103 kompatiblen
> Modus?


In AtmelStudio 6 ist unter Fuses der Hacken bei "M103C"
M103C = [X]

Der Controller läuft also auch als ATMega128 und nicht als ATmega103, 
oder?
(die LED leuchtet aber nicht egal ob der Hacken da ist oder nicht)

von Stefan E. (sternst)


Lesenswert?

----- ----- schrieb:
> ich habe nur auf OC1B umgestellt
1
TCCR1A = (1<<WGM10) | (1<<COM1_A_1);

----- ----- schrieb:
> In AtmelStudio 6 ist unter Fuses der Hacken bei "M103C"
> M103C = [X]
>
> Der Controller läuft also auch als ATMega128 und nicht als ATmega103,
> oder?

Nein.

von ----- -. (hobbyavr)


Lesenswert?

ok das Häckchen ist weg und es sollte alles auf B umgestellt sein, Danke 
:)


Hier das Programm:
1
DDRB |= (1<<DDB6); // Port OC1B mit angeschlossener LED als Ausgang
2
  
3
TCCR1B = (1<<WGM10) | (1<<COM1B1); // PWM, phase correct, 8 bit.
4
TCCR1B = (1<<CS11) | (1<<CS10); // Prescaler 64 = Enable counter
5
OCR1B = 128-1; // Duty cycle 50%
6
7
while(1);

Was ist jetzt noch falsch?

von Stefan E. (sternst)


Lesenswert?

----- ----- schrieb:
> Was ist jetzt noch falsch?

Dass du jetzt einfach jedes A in ein B geändert hast.

von ----- -. (hobbyavr)


Lesenswert?

Jetzt aber
1
DDRB |= (1<<DDB6); // Port OC1B mit angeschlossener LED als Ausgang
2
  
3
TCCR1A = (1<<WGM10) | (1<<COM1B1); // PWM, phase correct, 8 bit.
4
TCCR1B = (1<<CS11) | (1<<CS10); // Prescaler 64 = Enable counter
5
OCR1B = 1; // Duty cycle 50%

So sollte alles richtig sein, oder?
Jedenfalls lässt sich die LED dimmen; mehr kann ich grade nicht 
probieren.

Danke für die Hilfe! :D

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.