Hallo,
ich habe ein Projekt mit einem STM32F411 gemacht und stehe nun vor einem
Problem.
Ich habe an dem Externen Timer (TIM2 ETR Pin) Eingang einen Takt von ca.
3MHz anliegen, aus dem generiere ich 3 Signale. Jetzt ist mir aber
aufgefallen (leider recht spät) das ich übersehen habe das ich um den
Facktor 8 zu langsam bin.
Jetzt meine Frage an die Spezialisten, da ich es nicht sehe oder einfach
übersehe:
Kann man den eingangs Takt noch hoch drehen über eine interne PLL?
Alternativ hatte ich mir schon überlegt den Takt einfach als Systemtakt
einzuspeisen anstatt meinem Quarz. Aber der Externe Takt liegt nicht
immer an! Und somit würde ich teilweise mit Takt = 0Hz arbeiten, wie ich
das erkännen könnte und dann auf die interne PLL umschalten könnte
wüsste ich auch nicht.
Viele Grüsse, Peter
Peter schrieb:> ich habe ein Projekt mit einem STM32F411 gemacht und stehe nun vor einem> Problem.
Alle anderen stehen, wenn sie etwas tatsächlich "gemacht" haben,
irgendwie an dem Punkt, dass sie fertig sind mit dem Projekt, also genau
kein Problem mehr verblieben ist...
Sprich: du hast dein Projekt nicht gemacht, sondern schlicht in den
Sand gesetzt. -> Redo from start, diesmal mit einem besseren Konzept.
Hi
Wenn der µC die ganz Zeit im Timer-Interrupt Zeug berechnet, hat Er eh
keine Zeit, auf den externen Interrupt zu reagieren.
Was spricht dagegen, den 'neuen' Wert in der Haupt-Schleife zu berechnen
und durch den Timer-Interrupt 'freizuschalten'?
So hat der (nahezu dauernd) laufende Timer-Interrupt fast Nichts zu tun
(ok, ein Flag setzen) - und hast massig Zeit um auf den externen Befehl
zu reagieren.
MfG
Der Prozessor hat damit rein gar nichts zu tun.
Einmal eingestellt läuft das im Hintergrund.
Ich trigger mit den Timer Ausgängen 2 SPI Schnittstellen und da habe ich
so ca. alle 40ms mal was zu tun (DMA). Das ganze ist eine Signal
Ausgabe.
Nun leider habe ich übersehen das das Ausgangssignal 8 mal schneller ist
wie das Eingangssignal.
Ja das nennt mal Designfehler, aber vielleicht kann man das noch retten.
Nach nochmaligen ansehen der ganzen Doku kann ich nun Ausschließen das
man dem Timer Eingang hoch drehen kann, leider.
Bleibt nur noch der Umweg über den Systemtakt.
Aber wie ich dem Prozessor beibringen kann das der bei Taktausfall auf
was internes umschalten soll finde ich nicht.
Vielleicht hat ja von Euch eine Idee / Beispiel?
Viele Grüsse, Peter
Peter schrieb:> Aber wie ich dem Prozessor beibringen kann das der bei Taktausfall auf> was internes umschalten soll finde ich nicht.
Meine Glaskugel sagt:
RCC->CR |= (1 << CSSON); // CSSON aktivieren
und per ISR darauf reagieren, wenn CSSC im Register RCC_CIR gesetzt
wird.
Bitte versetz dich einmal in die Lage der Leute, die dir versuchen hier
zu helfen.
Was wir nicht wissen:
-) Welchen Takt du als Systemtakt nutzt.
-) Was du überhaupt vor hast.
-) Was in welcher Form wofür zu langsam sein soll.
Was du in 2 ganzen Absätzen geschafft hast zu erklären ist:
-) Du hast ein Problem.
-) An TIM2 ETR liegt irgendwas mit 3MHz an.
-) Damit erzeugst du irgendwas.
Peter schrieb:> Ich habe an dem Externen Timer (TIM2 ETR Pin) Eingang einen Takt von ca.> 3MHz anliegen
Ein MC arbeitet synchron, d.h. er muß alle externen Signale mit dem
CPU-Takt latchen.
Bei 100MHz CPU-Takt kann er somit bis zu 50MHz Signale abtasten, 3MHz
sollten daher kein Problem sein.
Du mußt also irgendwas falsch konfiguriert haben.
So nochmal für Alle die es nicht verstanden haben:
Ich habe einen Takt von ca. 3MHz den wollte ich eigentlich als Timer
Takt nehmen um damit einige Signale zu erzeugen. Diese Signale müssen
aus dem Takt abgeleitet werden, sonst passt meine Weiterverarbeitung
nicht.
Der Prozessor läuft mit einem 8MHz Quarz, über die interne PLL dann mit
100MHz.
Das geht ja auch, aber mir ist der Fehler unterlaufen das ich übersehen
habe das der 3MHz Takt am Timer nicht reicht (Faktor 8 zu klein).
Da ich den Timer Takteingang nicht hoch drehen kann, brauche ich eine
Andere Lösung.
Also 2. Versuch, den Takt anstatt dem Quarz einzuspeisen und intern die
PLL auf vernünftige Werte so im Bereich 90-100MHz einzustellen.
Haupsache der Prozessor hat noch genug Rechenpower und der Timer kann
daraus seine Signale ableiten.
Da gibt es aber eine kleine unangeneme Sache, der Takt liegt nicht immer
an.
In diesem Fall müsste ich auf die internen 16MHz umschalten können und
bei wieder anliegenden Takt auf den schalten.
Jetzt meine Frage wie kan man das machen?
Viele Grüsse, Peter
Peter schrieb:> Nun leider habe ich übersehen das das Ausgangssignal 8 mal schneller ist> wie das Eingangssignal.
Also, du hast 3MHz als Eingangssignal (sporadisch anliegend) und
möchtest konstant 24MHz Signale generieren?
Was ist das Ausgangssignal? Konstant 24MHz Rechteck oder PWM?
Wieso nutzt du das Eingangssignal nicht als "Reset" für einen internen,
unabhängigen Timer, mit dem du die 24MHz generierst? Kommt eine Flanke,
wird der Timer wieder synchronisiert. Fehlt diese, läuft das Signal halt
asynchron weiter, bis wieder eine Synchronisation statt findet. Oder du
kannst mit einem Timeout den Timer und deine Ausgabe deaktivieren.
Eine unabhängige PLL-Schaltung wirst du nicht finden. Dazu ist der uC
auch nicht gemacht. Ansonsten auf ein FPGA/CPLD wechseln...
Falls die ISR zu langsam sind, kannst du ja noch auf ASM wechseln...
aber bei lächerlichen 3MHz sollte das kein Problem sein.
Mein Takt wechselt zwischen 44100 * 64, 48000*64, 32000*64 und 0.
Da ist nichts mit selber machen, da ich Takt treu bleiben muss.
Die internen Überwachungs Systeme sind da schon die beste Lösung.
Wäre auch nur ein Draht.
Aber ich finde kein Beispiel für so was.
VG, Peter
@Peter Dannegger
>Warum schreibst Du nicht gleich...
Spielverderber!
Jetzt können die Beteiligten nicht mehr wild drauf los spekulieren,
palavern und und auch nicht rumrätseln;) Mancher hat jetzt sogar eine
Ahnung davon, worum es überhaupt geht.
I²S rein und 2 * Mono mit 8-fach Oversampling raus.
Ist aber für die Aufgabe mit den Timern unwichtig.
@Peter Dannegger
Das spielt beim Takt keine Rolle, die Probleme bleiben.
VG, Peter
Peter schrieb:> I²S rein
Welche Sample-Frequenz hast du da? Wieviel Bit?
*edit*: Ah, 3MHz Input hattest du geschrieben ... Dann werden es wohl so
hmm rechenrechenschwitzschwitch 96kHz Sample-Rate sein^^
Was machst du nochmal mit den Timern?
Nein Stereo mit max 48KHz.
Ich bastel mir mit dem Timer meine Signale (Bit Clock & SPI Clock / SPI
Enable / DAC Enable) für 2 SPI Schnittstellen mit denen ich dann die
Daten zu den 2 MONO DACs sende.
Eine einfache und effektive Art so was zu machen.
Braucht kaum Prozessor last da das senden komplett DMA und Timer
gesteuert abläuft. Nur gelegentlich (ca. 40ms) muss ich die Daten vom
Eingang zum Ausgang kopieren und ein wenig was vorher damit machen.
Der Eingang läuft auch komplett über den DMA.
Was ich mit den Signalen machen werde ist noch offen!
Jetzt ist erst einmal wichtig das ich die Taktquellen vernünftig
bearbeiten kann.
Da habe ich auch nach einigen Stunden nichts gefunden.
VG, Peter
Uli schrieb:> Ich bastel mir mit dem Timer meine Signale (Bit Clock & SPI Clock / SPI> Enable / DAC Enable) für 2 SPI Schnittstellen mit denen ich dann die> Daten zu den 2 MONO DACs sende.
Wieso verwendest du nicht 2 weitere I2S? Die können laut STM bis 50MBit
...
Sogar der kleinste F411 hat 5 mal I2S ...
Uli schrieb:> Uli (Gast)
Ist das der TE? Sonst hiess er doch Peter.
Mit ist nicht ganz klar, wofür du die 3MHz aka 24MHz benötigst, ausser
um die Ausgangs Samplerate zu konfigurieren. Im I2S Slave Modus ist eine
externe Masterclock nicht nötig - es reichen die 3 Signale des I2S
Protokolls, WS, BCLK und Data. (Abschnitt 20.4.6 in der STM32F11
Reference).
Du musst, wenn du die gleiche Samplerate am Ausgang benötigst, lediglich
deine 3Mhz oder was auch immer messen und danach, wenn du einen
Masterclock am Ausgang benötigst, I2SDIV für den Masteroutput
konfigurieren.
Also einen SPI als Slave I2S konfigurieren und den anderen als Master,
wenn deine DACs I2S verstehen.
Anderer Rechner falscher Name! Ist mir auch 5 Sekunden später
aufgefallen.
3 * I²S geht nicht da der Ausgang 8 mal schneller arbeitet.
Meine Lösung ist schon das beste was man mit einem STM32F411 machen
kann.
Bleibt halt nur das Problem mit dem umschalten zwischen internen und
externen Takt, bei Taktausfall und wieder anliegen.
VG, Peter
>2 SPI Schnittstellen mit denen ich dann die>Daten zu den 2 MONO DACs sende.
Aha, welche hast Du? Ich verzweifle gerade mit dem hier
Beitrag "Re: I2S Verstärker"
und einem STM32F103.
Peter schrieb:> Bleibt halt nur das Problem mit dem umschalten zwischen internen und> externen Takt, bei Taktausfall und wieder anliegen.
Auf den internen HSI-Takt wird automatisch umbeschaltet, wenn HSE
ausfällt. Die Behandlung des Interrupts erfolgt im NMI_Handler.
Ob HSE wieder anliegt, kann man testen und anschließend wieder HSE als
Taktquelle benutzen.
Wie das geht, wird in der Datei system_stm32f4xx.c gezeigt.