mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik mC mit 2 x Timer1?


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Mittag!
Ich such einen Mikrocontroller mit zwei Timer1? Denn ich muss ein PWM 
signal erzeugen und auch noch was messen mit einer 16bit auflösung

Ralf

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss es ein AVR sein? Für solche Timer-Sachen bietet sich der MSP430 an, 
das ist ein riesiger Timer mit µC Kern dran :)
Da hättest du je nach Größe einen Timer A mit 3 CCR und einen Timer B 
mit 7 CCR Blöcken....also jede Menge PWM und Messung...

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zweimal Timer?

also die 1 ist ja die Bezeichnung des Timers. Dann suchst du also einen 
mC mit zwei Timern die beide die selbe Bezeichnung haben?

Ich denke du solltest deine Frage neu Formulieren. Suchst du einen mC 
mit zwei 16 Bit Timern? Da gibt es hunderte. ZB haben das alle größeren 
ATMegas.

Mfg

Autor: Master Snowman (snowman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie denkst du, dass es möglich ist, zwei timer, die gleich heissen, 
anzusteuern? was es gibt: uC mehreren timern (die aber unterschiedlich 
heissen: Timer1, Timer2,..). und wozu brauchst du zwei timer um eine 
PWM zu gegnerieren?

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
sry hab meine Frage falsch formuliert, ich brauche ein mC mit zwei 16Bit 
Timern...

@Snowman:
Liess meinen Beitrag zu Ende und dann weisst du das ich nicht zwei Timer 
um ein PWM zu erzeugen brauche sondern EIN Timer fürs PWM und EIN Timer 
um etwas zu messen bzw. eine bestimmte Zeit vorzugeben, welcher auch mit 
16Bit betrieben werden muss

Gruss

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Liess meinen Beitrag zu Ende und dann weisst du das ich nicht zwei Timer
> um ein PWM zu erzeugen brauche sondern EIN Timer fürs PWM und EIN Timer
> um etwas zu messen bzw. eine bestimmte Zeit vorzugeben, welcher auch mit
> 16Bit betrieben werden muss
und warum sollte das nicht mit einem Timer gehen? Der PWM-Timer macht ja 
eh alles in Hardware, da kann er auch noch etwas in software machen.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also kann ich mit dem Timer1 ein PWM erzeugen und gleichzeitig noch bis 
zu einem überlauf zählen lassen (ganz unabhängig vom PWM)

Gruss

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die PWM 16bit hat, und du z.B. mittels Input Capture noch etwas 
messen möchtest, dann geht das wunderbar. Ansonsten muss man beim Input 
Capture den reduzierten Wertebereich des Timers halt beachten und 
mittels einer Hilfsvariable die im Timer Overflow Interrupt erhöht wird, 
kompensieren.

Machbar ist alles. Beschreib doch mal genau, was du vorhast. Es gibt mit 
Sicherheit eine Lösung.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha:
Muss ich will einen Motor in bestimmer Drehzahl drehen lassen können 
(mittels PWM) und das ganze auch noch überwachen. Dann muss der Timer1 
nämlich pro Sekunde einmal die abspeichern können wie viele Impulse es 
in der einen Sekunde hat diese mal 60 rechnen und schon hab ich die 
U/promin

Das mit dem messen geht schon alles (Habs mit einem optischen Drehgeber 
gemacht (schwarz,weiss))
Jetzt will ich noch dem Motor sagen können z.B. 1000 Umdrehungen die 
Minute und dann macht er das dann auch. mittels PWM...

Ich werde das Projecktchen dann auch mal noch vorstellen (Im 
Roboternetz)

Grüsse!

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat er doch geschrieben ...


1x 16 bit PWM
1x timer für andere sachen

sowas hat fast jeder AVR ... und kann das auch

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Brauchst du für die Drehzahlregelung wirklich eine 16bit PWM? 8bit 
sollte normalerweise auch reichen.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Ich stellte mein Projekt nur kurz vor weil Benedikt fragte was ich 
vorhatte. Das machbar ist weiss ich jetzt schon.

Den laut Peter, kann ich den 16bit Timer einsetzten für die PWM 
erzeugung und für das messen.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Benedikt:
Ich könnte natürlich auch den 8bit Timer verwenden und eine Variable 
hochzählen lassen so das nur bei einem bestimmten überlauf gespeichert 
wird. Aber es wurde ja gesagt es ginge auch, wenn ich beides mit dem 
Timer1 mache, also wieso denn nicht...

Grüsse!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf schrieb:

> Den laut Peter, kann ich den 16bit Timer einsetzten für die PWM
> erzeugung und für das messen.

Vorsicht.
Die Frage ist, was du genau unter 'messen' verstehst.

Das da oben klingt so, als ob du den Timer als Zähler einsetzt. Das wird 
so nicht gehen. Der Timer muss schon frei durchlaufen können.

Also: Wie genau funktioniert deine Drehzahlmessung?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Sekunde lang die Impulse zählen ist für eine Regelung sowieso 
suboptimal, denn erst nach 1 Sekunde kann eine Abweichung korrigiert 
werden. Das ist sehr langsam. Besser ist, den Abstand 2er Impulse 
messen. Dann kann der Timer auch konstant mit einer festen Frequenz 
laufen.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du musst ja auch nicht die Umdehungen pro minute messen, einfacher 
könnte es sein Umdehungen pro TimerOverflow.
Du hängst also dein Drehgeber an einen Externen Interupt (oder in der 
main abfragen) und erhöhst immer eine Variable.
Bei einem Overflow vom PWM-Timer braucht kannst du die Variable mit dem 
soll vergleichen und entsprechend die PWM anpassen.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten!
Ich werde mir das ganze nochmal durch den Kopf gehen lassen!

Liebe Grüsse!

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter
aber das Problem bei deiner Methode ist, wenn der Motor nur langsam 
dreht, dann wird es sehr oft sein, dass er misst und es noch gar keinen 
Impuls gegeben hat. Denn wenn ich den 8bit Timer verwende, dann und er 
immer bei 255 überläuft, dann ist das ja super viel mal pro sec...

@Benedikt:
Deine Idee ist auch ganz gut, aber ich würde schon gerne Umdrehungen pro 
min ausgeben...

Wie wärs hiermit:
Ich lasse den Timer immer alle 100ms überlaufen? reicht das um es mit 
dem Sollwert zu vergleichen und anzupassen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf schrieb:
> @Peter
> aber das Problem bei deiner Methode ist, wenn der Motor nur langsam
> dreht, dann wird es sehr oft sein, dass er misst und es noch gar keinen
> Impuls gegeben hat. Denn wenn ich den 8bit Timer verwende, dann und er
> immer bei 255 überläuft, dann ist das ja super viel mal pro sec...

Du kannst ja auch nur bei jedem 10.ten Timer Overflow die bisher 
aufgelaufenen Impulse auswerten :-)
Niemand sagt, dass man bei jedem Overflow eine Aktion machen muss.

> @Benedikt:
> Deine Idee ist auch ganz gut, aber ich würde schon gerne Umdrehungen pro
> min ausgeben...

Der Rest ist einfache Mathematik.
Wenn der Abstand zwischen 2 Impulsen (hausnummer) 0.5 Sekunden war, dann 
hast du 2 Impulse in der Sekunde bzw. 120 Pulse in der Minute und der 
Motor drehte mit 120 U/min (wenn 1 Impuls einer Umrehung entspricht)

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja stimmt eigentlich...

Und wie wärs mit meiner Idee?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf schrieb:

> Deine Idee ist auch ganz gut, aber ich würde schon gerne Umdrehungen pro
> min ausgeben...

Ist kein Problem:
Sagen wir mal der Timer misst mit 16MHz und dein Motor macht 1000Upm, 
also 16,667Ups, dann dauert eine Umdrehung 0,06s bzw. 960000 Prozessor 
Takte. Du müsstest den 16bit Timer per Software mit einer zusätzlichen 
Variable z.B. auf 24bit erweitern.
Nun hast du also diesen Wert. Um daraus Upm zu bekommen, muss du 
16MHz*60s=960 Millionen durch den gemessen Wert teilen:
960000000/960000=1000Upm.
Ist halt etwas mehr Rechenaufwand mit solch großen Zahlen, aber das 
sollte ein AVR problemlos schaffen.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wir können leider nicht eraten wie langsam/schnell der Motor dreht, aber 
es ist sinnvoller einen schnellen rückmeldung zu erhalten als eine 
Langsame. Sonst wird das ganze regelsystem zu langsam. Wenn du immer 
1Minute lang wartest bist du die umdrehung hast dann muss es schon ein 
sehr grosser Motor sein damit das System sich überhaup einregelt.

Mache doch zur not 10 Schwarz/Weiss makierungen an deine Sensor dann hat 
der µC wenigsten etwas zu tun.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Ich hab mich jetzt trotzdem mal für die Methode von Benedikt um 
entschieden und hab mal ein Beispiel gemacht und das ganze ausgerechnet 
(mit Taschenrechner) kann sich einer vielleicht meine Rechnungen mal 
ganz kurz ansehen? Ob ich da keinen Schritt ausgelassen habe (Bin erst 
14, da passiert mir sowas öfters mal!;)):
16Mz Quarz
Prescale 1024
Timer0
Beispiel:
Int wird zum ersten mal ausgelöst, der Timer beginnt zu zählen, 
Interrupts wird wieder ausgelöst, der Timer gibt die Zahl 124 aus.

Nun:
16000000/1024 = 15625Hz

15625/124 = 126

360/126 = 2.8

Wären das dann 2.8 Umdrehungen pro Minute? Oder hab ich da was falsch 
gemacht?

Grüsse!

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Neee... stimmt nicht! Wartet noch einbisschen...

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Jetzt hab ichs!
Das wären dann 126 x 60 Umdrehungen pro Minute...
Stimmt das?

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf schrieb:

> Nun:
> 16000000/1024 = 15625Hz
>
> 15625/124 = 126
>
> 360/126 = 2.8

Wie kommst du auf 360?
Pro Minute hast du 15625Hz*60s=937500 Impulse

937500 / 126 = 7440 Umdrehungen pro Minute

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
126 x 60 = 7560 sollte doch auch gehen? ABer irgendwie ist das nicht 
dasselbe wie du bekommst, woran kann das liegen?

Grüsse!

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, stimmt, du hast recht.
Ich hatte die 126 genommen, aber die sind ja schon geteilt. 
937500/124=7560,48387 ist also der korrekte Wert.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Ich habs!
Du Hast durch 126 geteilt anstatt durch 124. Das war meine Schuld denn 
ich hab da einen falschen Schritt gemacht!
Danke euch für die Hilfe!

Liebe Grüsse!

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da war ich zu langsam!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.