STM32 – Taktsignalgenerator mit Timer – STM32CubeMX generierter Code

Ich versuche, mit dem STM32F103C8Tx mit STM32CubeMX einen Takt von 1,4 MHz zu erzeugen.

Zunächst einmal habe ich in meinem Code Pin PB13 als Ausgang und hauptsächlich schalte ich ihn alle zwei Sekunden um. Das funktioniert.

Jetzt der wichtigere Teil. Dinge, die ich in CubeMX eingerichtet habe:

  • Den Basistakt des Gerätes habe ich auf 28 MHz eingestellt.
  • TIM3 Channel2: Ausgangsvergleich CH2 PWM Generation CH2
  • Innere Uhr
  • Timer3:Geben Sie hier die Bildbeschreibung ein

Den generierten Code habe ich in der IDE von OpenSTM32 kompiliert und hochgeladen. Die LED blinkt im eingestellten Intervall, aber ich habe keine Ausgabe an Pin B5 A7 (Timer3 Kanal 2). Dies wird am Oszilloskop überprüft.

Code (Haupt):

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_TIM3_Init();

  //These two lines were manually added
  HAL_TIM_Base_Start(&htim3);
  HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);

  while (1)
  {
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
        HAL_Delay(5000);
  }
}

Den Rest finden Sie hier .

Ich denke, der Ausgangsvergleich eines Timer-Kanals bedeutet keine physische Ausgabe an einen Pin. Es vergleicht nur den (Ausgangs-)Wert des Timers mit einem voreingestellten Wert und generiert einen Interrupt oder irgendetwas, wenn er übereinstimmt.
Ich verwende jetzt den PWM-Ausgang in Modus 1.
In meinem Fall stellte ich fest, dass die HAL_TIM_Base_Start(&htim3);Linie nicht benötigt wurde (ich glaube auch nicht, dass es weh tat).
Das generierte Taktsignal sollte genau 1,4 MHz betragen oder sind andere Werte zulässig?
@Bence Kaulics: Ja, du hast Recht. Das Teilen durch 20 statt durch 19 ist näher (tatsächlich sind es genau 1,4 MHz, wenn die 28 MHz genau sind). Ich habe meine Antwort angepasst.

Antworten (1)

Im Feld "Counter Period (AutoReload Register - 16 bit value)" (dritte Zeile) müssen Sie eine Periode für den Timer einstellen . Dies bestimmt zusammen mit dem Prescaler (erste Zeile) und der APB1-Frequenz die Timer-Frequenz.

Die Einstellung „Pulse“ für die PWM-Ausgänge bestimmt das Tastverhältnis . Alle PWM-Ausgänge für Timer 3 haben die gleiche Frequenz (die Timer-Frequenz), aber unabhängige Arbeitszykluseinstellungen (eine pro PWM-Ausgang).

Screenshot von STM32CubeMx für das STM32 Nucleo-Board STM32F042K6, Timer 3

Beachten Sie, dass es leicht ist, einzelne Fehler zu machen. Dies gilt sowohl für den Prescaler (z. B. 0 bedeutet geteilt durch 1) als auch für die Timer-Periode. Beispielsweise ist in diesem Beispiel, wo die APB1-Frequenz 48 MHz beträgt, die Frequenz 48 MHz/3/51 = 313,725 kHz (und nicht beispielsweise 48 MHz/3/50 = 320 kHz). Bei der PWM-Einstellung hingegen ist die Einstellung der tatsächliche Effektivwert (nicht +1). Die Arbeitszyklen betragen 45,1 %, 64,7 %, 13,7 % bzw. 5,9 %.

(Ich habe ein ähnliches Setup für einen anderen STM32-Prozessor, aber auch mit STM32CubeMX eingerichtet und unter OpenSTM32 kompiliert / ausgeführt. Ich habe die Frequenz und alle vier Arbeitszyklen auf einem Oszilloskop überprüft (innerhalb der Messgenauigkeit).)

Unter der Annahme, dass die APB1-Frequenz tatsächlich 28 MHz beträgt, würde in Ihrem Fall eine Zählerperiode von 19 genau 1,4000000 MHz (28 MHz / 1 / 20) ergeben - wenn Sie jedoch den internen Oszillator verwenden, sind nicht mehr als drei signifikante Stellen garantiert (I festgestellt, dass meins um etwa 0,37 % abweicht, innerhalb der Spezifikation von 1 %). Wenn Sie den PWM-Impuls auf 10 einstellen, sollte das Tastverhältnis 50,0 % betragen.

Vielen Dank für Ihre Hilfe. Das Problem ist, dass der Ausgang derzeit auf "HIGH" hängt. Ich werde Ihnen einige Screenshots des Cube-Projekts verlinken, vielleicht können Sie meinen Fehler erkennen. imgur.com/a/HI9fI Ich habe auch vor "while(1)" im Wesentlichen diese folgenden Zeilen hinzugefügt: HAL_TIM_Base_MspInit(&htim2); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
Ich habe vergessen zu erwähnen, dass ich dieses Mal TIM2 auf Kanal 2 verwendet habe, was Pin PA1 ist, falls es darauf ankommt.
Ich habe gerade einen Umbau gemacht und jetzt funktioniert es. Danke
@Cezar Chirila: Sie sollten "Counter Period" (dritte Zeile), nicht den Prescaler, auf 18 setzen. Der Prescaler (erste Zeile) sollte auf 0 bleiben.
@Cezar Chirila: Hat es für "Counter Period" gleich 0 funktioniert, aber der Prescaler ist von Null verschieden?
Ja. Es funktionierte für einen "Prescaler" gleich 0 und eine "Zählerperiode" von 18.
Ich muss fragen, warum ich die "Zählerperiode" ändern muss. Ist 28MHz / 1/19 nicht gleich 28MHz / 19/1.
@Cezar Chirila: Wenn Sie das Tastverhältnis (feinkörnig) variieren möchten, muss "Prescaler" gleich 0 und eine "Zählerperiode" von 18 sein. Andernfalls ist nur etwa ein PWM-Tastverhältnis möglich (50%?) - wenn es überhaupt funktioniert.
Ich habe etwas Interessantes gefunden. Ich kann das Signal nicht auf TIM3 oder TIM4 erzeugen. Nur auf TIM2. Alles andere ist gleich, außer Clocksource Internal ist ein Kontrollkästchen (das ich aktiviert habe). Alles andere ist gleich. Ich habe die Zeilen hinzugefügt: HAL_TIM_Base_MspInit(&htim3); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); HAL_TIM_Base_MspInit(&htim4); HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);
Egal, ich musste es zweimal umbauen, seltsam. Ich muss meine Workbench besser einrichten, im Moment baue ich sie nur dort und lade die Bin über das ST-Link-Dienstprogramm hoch.