mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ARM STM32 PWM


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Timo (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin beim ARM programmieren ziemlich neu und habe versucht ein 
einfaches PWM Signal an T1C1 zum laufen zu bringen. Leider habe ich 
nicht sehr viele Tutorials gefunden. Das Programm, dass ich bisher 
geschrieben habe funktioniert leider nicht. Könnt ihr mir sagen, wo mein 
Fehler liegt?
P.S.: Ich schreibe mit der IDE von CooCox

Code:


#include <stm32f10x.h>
#include <stm32f10x_conf.h>

int main(void)
{
  RCC -> APB2ENR |= RCC_APB2ENR_TIM1EN;
  TIM1 -> CR1 |= TIM_CR1_CEN;

  RCC ->APB2ENR |= RCC_APB2ENR_IOPAEN;
  GPIOA ->CRH |= GPIO_CRH_CNF8_0 | GPIO_CRH_CNF8_1 | GPIO_CRH_MODE8_0 | 
GPIO_CRH_MODE8_1;

  TIM1 ->PSC = 0;
  TIM1 ->ARR = 60000;

  TIM1 ->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1CE;
  TIM1 ->CCER |= TIM_CCER_CC1E;
  TIM1 ->BDTR |= TIM_BDTR_MOE;
  TIM1 ->EGR |= TIM_EGR_UG;

  RCC ->APB2ENR |= (1<<4);
  GPIOC ->CRH |= ((1<<20) | (1<<21));

    while(1)
    {
    TIM1 ->CCR1 = 30000;
    }
}

Autor: Timo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe noch vergessen:
Ich verwende den STM32F103C8T6

Autor: Walter Tarpan (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert

Autor: Stefanus F. (Firma: Äppel) (stefanus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das Programm, dass ich bisher geschrieben habe funktioniert leider nicht.

Was funktioniert nicht? Was hast du erwartet, und was hast du 
stattdessen festgestellt?

Das Tutorial von Diller verwendest die StdPeriphLib. Ich nehme an, du 
suchst ein kommentiertes Beispiel ohne Hardware Abstraktion: 
http://stefanfrings.de/stm32/index.html#pwm

Was mir bei deinem Code direkt ins Auge sticht ist, dass du überall "|=" 
verwendest. Du scheinst davon auszugehen, das alle Register initial auf 
0 stehen. Hast du dich dessen vergewissert?

> GPIOA ->CRH |= GPIO_CRH_CNF8_0 | GPIO_CRH_CNF8_1 | GPIO_CRH_MODE8_0 |
GPIO_CRH_MODE8_1;

Damit ist der Ausgang als Open-Drain für 50MHz (viel hilft viel, was?) 
konfiguriert. War das beabsichtigt und passt das zu deiner Beschltung?

> TIM_CCMR1_OC1CE

ich glaube, du wolltest TIM_CCMR1_OC1PE benutzen.

> BDTR
> EGR

Ich denke nicht, dass diese Register für deinen Anwendungsfall relevant 
sind. Die würde ich für's Erste nicht anrühren.

: Bearbeitet durch User
Autor: podom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau Dir mit dem Debugger mal das Timer Register an. Läuft das?

Autor: Andreas S. (igel1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

: Bearbeitet durch User
Autor: Christopher J. (christopher_j23)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas S. schrieb:
> Schau mal ins "General purpose Timer Cookbook" von ST (Kapitel 1.3.1
> ff.):
> 
http://www.st.com/content/ccc/resource/technical/document/application_note/group0/91/01/84/3f/7c/67/41/3f/DM00236305/files/DM00236305.pdf/jcr:content/translations/en.DM00236305.pdf

Das würde ich auf jeden Fall auch empfehlen.

Ansonsten hast du hier ein funktionierendes Beispiel für PWM mit einem 
General Purpose Timer ohne irgendwelche Libraries:
https://github.com/ChristianRinn/bare_metal_stm32f103c8/blob/master/src/example03_gpio-timer-pwm/main.c

Hier ist noch ein Beispiel mit einem Advanced Timer:
https://github.com/ChristianRinn/bare_metal_stm32f103c8/blob/master/src/example04_timer-complementary-pwm/main.c

Grundsätzlich kann man aber den Advanced Timer wie einen GP-Timer 
verwenden. Das einzige was man zwingend benötigt ist das MOE-Bit im 
BDTR, also
  TIM1 ->BDTR |= TIM_BDTR_MOE;

Autor: Andreas S. (igel1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob Timo noch lebt?

Wenn ja, so würden sich all diejenigen, die hier Rat und Tat abgeliefert 
haben, sicherlich über ein kleines Feedback freuen ...

Viele Grüße

Igel1

Autor: W.S. (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Andreas S. schrieb:
> Ob Timo noch lebt?

Sieht nicht danach aus.

Timo schrieb:
> habe versucht ein
> einfaches PWM Signal an T1C1 zum laufen zu bringen. Leider habe ich
> nicht sehr viele Tutorials gefunden. Das Programm, dass ich bisher
> geschrieben habe funktioniert leider nicht. Könnt ihr mir sagen, wo mein
> Fehler liegt?

Bei einer solchen Disposition wäre erstmal ne Frage fällig: Möchte er 
eine nette Antwort oder eine ehrliche Antwort haben?

W.S.

Autor: Johnny B. (johnnyb)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Timo schrieb:
> Leider habe ich nicht sehr viele Tutorials gefunden.

Es gibt von ST ganz viele Codebeispiele zu allen Peripheriemodulen und 
mit CubeMX kriegt man PWM im nu zum laufen.
Ich würde daher mal mit CubeMX die gewünschten Einstellungen für PWM 
machen und den automatisch erzeugten Code dann mit Deinem Code 
vergleichen.

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.