Forum: Mikrocontroller und Digitale Elektronik Stm32f103 TIM1 Register, Verständnisfrage PWM


von HD_Blast (Gast)


Lesenswert?

Hallo zusammen,

ich habe da mal eine Frage zum stm32f103. Und zwar habe ich mittels 
Interrupts eine 3 phasige Pwm in T1M1 erzeugt. Das hat alles geklappt. 
Ich konnte hierbei die Pulsweiten der einzelnen Ausgänge (TIM1-CCR) auch 
variieren. Nun musste ich aber die Ausgänge mittels dem CCER Register 
invertieren. Nun klappt das leider nicht mehr mit dem einstellen der 
Pulsweite. Blockiert das CCER Register irgendwo diese Funktion? Ich habe 
in der Manuel unter dem CCER Register nichts in der Art gefunden.
Vielen Dank schonmal für eure Antworten.

Viele Grüße

von Nico W. (nico_w)


Lesenswert?

Zeig doch mal den entsprechenden Code?!?

von HD_Blast (Gast)


Lesenswert?

void Init(void){
     TIM1->ARR= 0x04B0;
     TIM1->CCMR1 = 0x7878;
     TIM1->CCMR2 = 0x7878;
     TIM1->CCER =  0x0FFF;

     TIM1->CCR1=0x4650;// Pulsweite einstellen
     TIM1->CCR2=0x4650;// Pulsweite einstellen
     TIM1->CCR3=0x4650;// Pulsweite einstellen

     TIM1->BDTR = TIM_BDTR_MOE|TT_WERT;//  break and dead-time register
     TIM1->CR1 = TIM_CR1_CEN|((uint32_t)0x0000);//Timer
}

void FU_PWM_Isr(void)
{

  static int aktiver_kanal = 0;
  static int wert = 18000;  // 0-36000

  switch(aktiver_kanal)
  {
    case 0:
    {
      TIM1->CCR1=wert;// Pulsweite einstellen
      TIM1->CCR2=0;// Pulsweite einstellen
      TIM1->CCR3=0;// Pulsweite einstellen
    }break;
    case 1:
    {
      TIM1->CCR1=0;// Pulsweite einstellen
      TIM1->CCR2=wert;// Pulsweite einstellen
      TIM1->CCR3=0;// Pulsweite einstellen
    }break;
    case 2:
    {
      TIM1->CCR1=0;// Pulsweite einstellen
      TIM1->CCR2=0;// Pulsweite einstellen
      TIM1->CCR3=wert;// Pulsweite einstellen
    }break;
  }


  aktiver_kanal++;
  if(aktiver_kanal >= 3)
    aktiver_kanal = 0;
}

Danke schonmal für deine Hilfe

von Nico W. (nico_w)


Lesenswert?

HD_Blast schrieb:
> TIM1->ARR= 0x04B0;

Passt der Wert? Wenn ich das mit dem ARR richtig verstehe wird dort doch 
allgemein der Reload-Wert eingestellt? Bei dir 0d1200. Wenn du aber am 
Anfang da mit 1800 rein gehst, kommst du doch nie an?

Bin aber auch nur ein Trial'n'Error-Amateur :D

von HD_Blast (Gast)


Lesenswert?

Ja, der Wert passt!

Die Ursache des Problems liegt bei: static int wert = 18000;  // 0-36000
Hier darf der maximale Wert nur 1200 sein bei ARR= 0x04B0;

Es läuft jetzt wie geschmiert! ;-) Danke trotzdem!!

von HD_Blast (Gast)


Lesenswert?

Nico W. schrieb:
> Bei dir 0d1200. Wenn du aber am
> Anfang da mit 1800 rein gehst, kommst du doch nie an?

Hast natürlich vollkommen Recht!

Nico W. schrieb:
> Bin aber auch nur ein Trial'n'Error-Amateur

Bist du nicht :D

von Nico W. (nico_w)


Lesenswert?

\o/
Schön das ich helfen konnte.

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
Noch kein Account? Hier anmelden.