Forum: Mikrocontroller und Digitale Elektronik Stm32F103 Soft Pwm


von maik (Gast)


Lesenswert?

Hallo,
Ich versuche nun schon eine ganze Weile eine SoftPwm hinzubekommen auf 
einen veliebigen Portbin vom Stm32f103.
Dazu hab ich den Timer1 Initialisiert der läuft auch,
nur ist mein Problem die ganzen Hardware Pwm Pins sind schon anderweitig 
benutzt.
Vielleicht könnte mir einer von ihnen weiterhelfen
wie ich das nun mit der SoftPwm zum laufen bekomme.
mfg

von Verweis auf anderen (Gast)


Lesenswert?

GPIO im Timer Interrupt schalten ist zu einfach?

von Falk B. (falk)


Lesenswert?

Siehe Soft-PWM

von maik (Gast)


Lesenswert?

void TIM1_IRQHandler(void)
{


  if ( TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET )
  {
    TIM_ClearITPendingBit(TIM1 , TIM_FLAG_Update);



      if(PWMcnt < led)
         GPIO_ResetBits(GPIO_LED, LED5)

      else
         GPIO_SetBits(GPIO_LED, LED5)

      if(PWMcnt =255)
        {
         PWMcnt = 0
        }
      else
        {
          PWMcnt++;
        }






  }
}

von maik (Gast)


Lesenswert?

Falk B. schrieb:
> Siehe Soft-PWM

Das ist ja für AVR  ich nutze ja den Stm32

kann mir jemand helfen was ich da verkehrt mache

von holger (Gast)


Lesenswert?

In der Zeile ist ein Fehler

      if(PWMcnt =255)

von maik (Gast)


Lesenswert?

Müsste so sein

if(PWMcnt <=255)

von Falk B. (falk)


Lesenswert?

1
      if(PWMcnt == 255)
2
        {
3
         PWMcnt = 0
4
        }
5
      else
6
        {
7
          PWMcnt++;
8
        }

von maik (Gast)


Lesenswert?

Hier sind meine Einstellungen für die SoftPWM.
Es Funktioniert soweit, aber wenn ich zb Daten über Uart(mit eigener 
isr) bekomme Flackert die Led.
Kann mir da einer Weiterhelfen was ich hbier Falsch mache.

1
 vu8 PWM_cnt = 0;
2
 vu8  Red = 50;
3
4
  NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;    
5
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
6
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
7
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
8
  NVIC_Init(&NVIC_InitStructure);
9
10
void TIM5_Configuration(void)
11
{
12
  uint16_t TimerPeriod = 0;
13
14
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
15
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5 , ENABLE);
16
17
  TimerPeriod = (uint16_t) (SystemCoreClock / 1000000) - 1;
18
  TIM_DeInit(TIM5);
19
  TIM_TimeBaseStructure.TIM_Period=1000;
20
  TIM_TimeBaseStructure.TIM_Prescaler= 0;
21
  TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;   
22
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;   
23
  TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
24
  TIM_ClearFlag(TIM5, TIM_FLAG_Update);                 
25
  TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);
26
  TIM_Cmd(TIM5, ENABLE);                      
27
}
28
29
30
void TIM5_IRQHandler(void)
31
{   
32
  if ( TIM_GetITStatus(TIM5 , TIM_IT_Update) != RESET ) 
33
   {
34
    TIM_ClearITPendingBit(TIM5 , TIM_FLAG_Update);
35
 
36
    if ((PWM_cnt <=Red) && (Red!=0))
37
     {
38
       GPIO_ResetBits(GPIO_LED, LED_5);
39
     }
40
    else
41
     {
42
       GPIO_SetBits(GPIO_LED, LED_5);
43
     }  
44
   
45
   if(PWM_cnt==255)                  {
46
          PWM_cnt=0; 
47
  }
48
       else
49
        {
50
   PWM_cnt++;
51
  }              
52
   }   
53
}

von holger (Gast)


Lesenswert?

>  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;

Setze die mal auf 0 und die vom UART auf größer 0.
Kleinerer Wert bedeutet höhere Priorität.

von Little B. (lil-b)


Lesenswert?

Wenn die UART ISR die LED zum Flackern bringt, sind vermutlich nicht nur 
die Prioritäten falsch, sondern auch deine UART ISR zu lang.

Magst du deine UART ISR mal posten?

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.