Heyhey, also ich habe ein Problem mit den mehrkanaligen Timern der STMs. Ich möchte gerne mit 1 Timer 4 Takte ausgeben und dafür das Ereignis ToggleOnMatch nutzen. Nun zu meinem Verständnis des Timers: Also der Timer zählt über den durch Prescaler etc. bestimmten Takt hoch bis der Counter dem AutoReload-Register entspricht, danach erfolgt ein Reset. Die einzelnen Channel toggeln sobald der Counter dem CaptureCompare-Register entspricht. Das hieße ich kann in diesem Fall meinen Offset (Abstand der jeweiligen Flanken der einzelnen Pulse) über das CaptureCompare-Register einstellen, die Frequenz der Pulse allerdings nur global (für alle Channel) über den Eingangstakt bzw das AutoReload-Register?! Ist das soweit ok? Jetzt kommts nämlich... Und zwar habe ich in einer STM-Application-Note den angefügten Ausschnitt gefunden. Darin wird exakt über das CaptureCompare-Register der Takt des Ausgangssignals eingestellt. Wo ist meint Problem (Praktisch umgesetzt bestätigt sich meine o.g. Beschreibung meiner Vorstellung) :/ Kann mir jemand helfen??? Vielen Dank :)
Kannst du deine Quelle angeben? Was in dieser Application note geschrieben wird, ist mir nicht schlüssig. Fakt ist, dass ein Hardware Timer immer eine Frequenz für alle zugeordneten CC-Module generiert. Diese Frequenz mit dem CCR-Register zu halbieren ist mir neu. Vieleicht passiert hier was in software, z.B. mit interrupts?
Autor: Kathirn (Gast) schrieb: >die Frequenz der Pulse allerdings nur global (für alle Channel) über den >Eingangstakt bzw das AutoReload-Register?! Nee, die Aussage stimmt nicht. Ich habe vor ein paar Tagen so etwas ähnliches gemacht wie das, an dem du gerade dran sitzt. Je näher der Wert in dem CC Register am eigentlichen Timer-Register (bzw 0xFFFF -> 0x0000 Überlauf) ist (bei mir stand glaube ich 0x0000), umso schneller wird die Gleichheit erreicht und der Ausgang schaltet um. Hat mit dem Eingangstakt erstmal nix zu tun.
1 | Tim2Handle.Init.Prescaler = 0; |
2 | Tim2Handle.Init.CounterMode = TIM_COUNTERMODE_UP; |
3 | |
4 | // FREQUENCY
|
5 | // 0x20E0 = 9.980kHz
|
6 | // 0xA400 = 2.000kHz
|
7 | Tim2Handle.Init.Period = FREQUENCY_2000HZ; |
8 | |
9 | Tim2Handle.Init.RepetitionCounter = 0x10000;// todo: test necessary? |
10 | HAL_TIM_Base_Init(&Tim2Handle); |
Little B. schrieb: > Kannst du deine Quelle angeben? Was in dieser Application note > geschrieben wird, ist mir nicht schlüssig. Hier natürlich auch die Quelle als Anhang. Little B. schrieb: > Fakt ist, dass ein Hardware Timer immer eine Frequenz für alle > zugeordneten CC-Module generiert. Diese Frequenz mit dem CCR-Register zu > halbieren ist mir neu. Vieleicht passiert hier was in software, z.B. mit > interrupts? Ich kann dem AN leider nicht viel mehr als das Gepostete entnehmen und die angesprochende STM32F10xxx firmware library ist obsolete bzw konnte ich nicht mehr finden. timertick_t schrieb: > Je näher der Wert in dem CC Register am eigentlichen Timer-Register (bzw > 0xFFFF -> 0x0000 Überlauf) ist (bei mir stand glaube ich 0x0000), umso > schneller wird die Gleichheit erreicht und der Ausgang schaltet um. Hat > mit dem Eingangstakt erstmal nix zu tun. Ich verstehe leider nicht exakt was du meinst, aber ich meine das Erzeugen MEHRERER verschiedener Takte mit EINEM Timer.
>Weiß keiner mehr dazu was sagen?
Das was du suchst findest du in dem Beispiel OcToggle
in der StandardPeripheral Library.
Das arbeitet mit Interrupts. Wenn der Comparewert
erreicht ist toggelt der Pin, er springt in den Interrupt und addiert
einen Offset zum zuletzt eingestellten Comparewert.
So werden die Frequenzen erzeugt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.