Forum: Mikrocontroller und Digitale Elektronik Arduino Pro Micro (ATmega32U4) - freier Timer für 2x PWM?


von Karius (Gast)


Lesenswert?

Ich suche Informationen zu freien Timern mit zwei PWM-Ausgängen am Pro 
Micro (Klon).
analogWrite() macht nicht mal 1 kHz und ich brauche Ultraschall (nicht 
hörbar) für eine Motorsteuerung.

analogWrite() in wiring_analog.c
init() in wiring.c

Irgendwie widersprüchlich:

OC4A an PC7 -> "D13" not used
OC4B an PB6 -> "D10" (PWM mode nicht initialisiert)
OC4D an PD7 -> "D6"

Kennt sich hier jemand damit besser aus?

von Peter D. (peda)


Lesenswert?

Lt. Datenblatt hat der ATmega32U4 14 PWM-Ausgänge.
Welche davon heraus geführt sind, sollte aus dem Schaltplan hervorgehen.

von Karius (Gast)


Lesenswert?

Timer 1 scheint frei zu sein:
OC1A PB5 "D9"
OC1B PB6 "D10"
TCCR1B = (1<<CS10);

von Karius (Gast)


Lesenswert?

Peter D. schrieb:
> Lt. Datenblatt hat der ATmega32U4 14 PWM-Ausgänge.
> Welche davon heraus geführt sind, sollte aus dem Schaltplan hervorgehen.

Ja, das ist schon klar, allerdings nutzt das "Arduino" framework selbst 
Timer und konfiguriert sie teilweise für PWM. Das ist nicht besonders 
gut dokumentiert; es bleibt nur das Durchsuchen der Quelltexte.

von Karius (Gast)


Lesenswert?


von Wolfgang (Gast)


Lesenswert?

Karius schrieb:
> Ja, das ist schon klar, allerdings nutzt das "Arduino" framework selbst
> Timer und konfiguriert sie teilweise für PWM. Das ist nicht besonders
> gut dokumentiert; es bleibt nur das Durchsuchen der Quelltexte.

Ohne zu wissen, welche timerbasierenden Teile des Arduino Frameworks du 
nutzt, ist es schwierig, dir zielgerichtet zu helfen. Den Timer hinter 
millis() sollte man meist in Ruhe lassen.

von c-hater (Gast)


Lesenswert?

Karius schrieb:

> Ja, das ist schon klar, allerdings nutzt das "Arduino" framework selbst
> Timer und konfiguriert sie teilweise für PWM. Das ist nicht besonders
> gut dokumentiert; es bleibt nur das Durchsuchen der Quelltexte.

Nö. Man kann auch ganz einfach komplett auf das ganze Arduino-Gedöhns 
verzichten...

Beitrag #6325906 wurde von einem Moderator gelöscht.
von Marc H. (marchorby)


Lesenswert?

c-hater schrieb:
> Karius schrieb:
>
>> Ja, das ist schon klar, allerdings nutzt das "Arduino" framework selbst
>> Timer und konfiguriert sie teilweise für PWM. Das ist nicht besonders
>> gut dokumentiert; es bleibt nur das Durchsuchen der Quelltexte.
>
> Nö. Man kann auch ganz einfach komplett auf das ganze Arduino-Gedöhns
> verzichten...

Kann man, muss man aber nicht! Ich nutze Gedöns freiwillig

von c-hater (Gast)


Lesenswert?

Marc H. schrieb:

> Kann man, muss man aber nicht! Ich nutze Gedöns freiwillig

Jedem das Seine.

von Veit D. (devil-elec)


Angehängte Dateien:

Lesenswert?

Hallo,

ich weiß nicht ob sich der Klone "Pro Micro" an das Original "Micro" 
Layout hält, wenn ja hilft das Pinout weiter. Ansonsten  kannst du 
erstmal jeden Timer außer T0 (delay, millis) frei verwenden. Musst ihn 
nur komplett selbst initialisieren und nicht nur halb.

von Karius (Gast)


Lesenswert?

Wolfgang schrieb:
> Ohne zu wissen, welche timerbasierenden Teile des Arduino Frameworks du
> nutzt, ist es schwierig, dir zielgerichtet zu helfen. Den Timer hinter
> millis() sollte man meist in Ruhe lassen.

Ich formuliere mal um: "Ich kann dir nicht helfen, einen Timer kannst du 
nicht benutzen."
Das hilft tatsächlich nicht weiter.
Hilfreich wäre gewesen: "Timer X,Y,Z" sind nicht frei, aber du kannst U, 
V, W benutzen, guck mal in Zeile i von source.c. Taktfrequenz musst du 
noch einstellen, z.B. sososososo."

c-hater schrieb:
> Nö.

Ach so. Doch!?

Veit D. schrieb:
> Ansonsten  kannst du
> erstmal jeden Timer außer T0 (delay, millis) frei verwenden. Musst ihn
> nur komplett selbst initialisieren und nicht nur halb.

Danke!
Man muss sich durch wiring_analog.c und wiring.c durcharbeiten und die 
halbe Initialisierung ggf. ergänzen.
Für Timer 1 reicht eine Änderung des Prescalers, der standardmäßig auf 
64 gesetzt wird. Die Timer werden unterschiedlich initialisiert, teils 
mit phase-correct PWM, teils ohne.
Schade, dass das offenbar nicht übersichtlich dokumentiert ist.

Viel wichtiger als diese bescheuerten Rangeleien im Forum: immer schön 
Zähne putzen.

von Wolfgang (Gast)


Lesenswert?

Karius schrieb:
> Hilfreich wäre gewesen: "Timer X,Y,Z" sind nicht frei, aber du kannst U,
> V, W benutzen, guck mal in Zeile i von source.c. Taktfrequenz musst du
> noch einstellen, z.B. sososososo."

Welche Timer frei sind, hängt von den benutzten Arduino Funktionen ab.
Timer0 wird für den 1ms-Takt verwendet, Timer1 z.B. für Servo-Steuerung.

Hier ein paar Dinge zu Timern mit und auf Arduino mit ATmega168/328, die 
sinngemäß auch für den ATmega32U4 gelten.
https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM

von Karius (Gast)


Lesenswert?

Danke dir!

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.