Stm32F103 Soft Pwm

Gast #4314700
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
Gast #4314739
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++;
        }






  }
}
Gast #4327288
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren