Forum: Mikrocontroller und Digitale Elektronik STM32 CubeMX SoftPWM


von Sady (Gast)


Lesenswert?

Hallo Zusammen,

ich möchte gerne ein Software PWM Signal mit einem STM32F303 
(ST-Nucleo-32) Board generieren.
Ich verwende CubeMX und deren HAL_Library.

Das gewünschte PWM habe ich damit auch generieren können, allerdings mit 
einem Problem. Das PWM Signal "flackert":
|||__|||__||__|||__|||_|||__|||__|||__|||__|||__|||__
1
int main(void)
2
{  
3
  HAL_Init();
4
  SystemClock_Config();
5
  MX_GPIO_Init();
6
  MX_TIM2_Init();
7
8
  HAL_TIM_OC_Start_IT(&htim2,TIM_CHANNEL_1);                       
9
      __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1, 0x100);
10
11
}
1
void SystemClock_Config(void)
2
{
3
4
  RCC_OscInitTypeDef RCC_OscInitStruct;
5
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
6
7
    /**Initializes the CPU, AHB and APB busses clocks 
8
    */
9
10
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
11
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
12
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;  
13
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_NONE;
14
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
15
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
16
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
17
  
18
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
19
  {
20
    _Error_Handler(__FILE__, __LINE__);
21
  }
22
23
    /**Initializes the CPU, AHB and APB busses clocks 
24
    */
25
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
26
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
27
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
28
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;  
29
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
30
31
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
32
  {
33
    _Error_Handler(__FILE__, __LINE__);
34
  }
35
36
    /**Configure the Systick interrupt time 
37
    */
38
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
39
40
    /**Configure the Systick 
41
    */
42
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
43
44
  /* SysTick_IRQn interrupt configuration */
45
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
46
}

1
static void MX_TIM2_Init(void)
2
{
3
4
  TIM_ClockConfigTypeDef sClockSourceConfig;
5
  TIM_MasterConfigTypeDef sMasterConfig;
6
7
  htim2.Instance = TIM2;
8
  htim2.Init.Prescaler = 8;
9
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
10
  htim2.Init.Period = 0xFFFE;
11
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
12
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
13
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
14
  {
15
    _Error_Handler(__FILE__, __LINE__);
16
  }
17
18
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
19
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
20
  {
21
    _Error_Handler(__FILE__, __LINE__);
22
  }
23
24
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF;
25
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
26
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
27
  {
28
    _Error_Handler(__FILE__, __LINE__);
29
  }
30
31
}
1
void TIM2_IRQHandler(void)
2
{
3
  
4
switch(c){
5
    
6
  case 1:  //+0xBB8
7
  
8
    
9
    
10
11
        CNT_Current= __HAL_TIM_GET_COUNTER(&htim2);    
12
       __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, CNT_Current+0xBB8);
13
       GPIOB -> ODR |= GPIO_PIN_3; 
14
15
  c=3;
16
    
17
  break;
18
    
19
    
20
  case 2:            
21
  //kommt später...            
22
  break;
23
            
24
            
25
  case 3: //+0x1F4
26
27
  CNT_Current=__HAL_TIM_GET_COUNTER(&htim2);
28
  __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, CNT_Current+ 0x1F4);
29
        GPIOB -> ODR &= ~GPIO_PIN_3; 
30
        c = 1;
31
     
32
        break;
33
34
      }
35
36
  
37
  HAL_TIM_IRQHandler(&htim2);
38
  
39
}



Ich wäre für eine Lösung bzw. Erklärung sehr dankbar!

von Daten Experte (Gast)


Lesenswert?

Sady schrieb:
> switch(c){
>
>   case 1:  //+0xBB8

... und wo ist <c> definiert, und wo wird es verändert?

von Sady (Gast)


Lesenswert?

am Anfang von stm32f3xx_it.c

bool test=false;
int count=0;
int c=1;
uint32_t CNT_Current=0;
uint32_t New_Compare;
...


geändert wird c im IQR.

von Daten Experte (Gast)


Lesenswert?

Sady schrieb:
> am Anfang von stm32f3xx_it.c

Warum die Salamitaktik? Packe alles (wirklich alle Sourcen
die du selbst erzeugt hast) in eine Zip-Datei und poste es hier.

Alles andere ist Chaos.

Sady schrieb:
> HAL_TIM_IRQHandler(&htim2);

Einen IRQHandler ruft man nicht selbst "händisch" auf. Nicht
im Interrupt Kontext und nur dann wenn man wirklich weiss
was man tut ....

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.