Forum: Mikrocontroller und Digitale Elektronik STM32F2 Timer1 & 8


von Stulle (Gast)


Lesenswert?

Hallo, ich habe mir ein STM32F2 Board und ein Oszilloskop angelegt und 
zum experimentieren mich einmal an einer PWM-Steuerung heran gewagt, die 
nur eine gewisse Anzahl an Perioden ausgeben soll.
Dabei erzeugt der Timer 2 das PWM-Signal und Timer 8 zählt die Perioden 
und löst nach erreichen eines Wertes einen Interrupt aus, mit dem der 
Timer 2 beendet wird.

Dabei ist mir aufgefallen das der Timer 8 eine halbe Periode zuviel 
durchlässt. Denn meiner Meinung nach müsste wenn beim PWM mit einem 
High-Signal gestartet wird, das letzte Signal ein Low-Signal sein. Ich 
habe das dann auch noch mit dem Timer9 versucht, der die Perioden 
gezählt hat, und siehe da, bei dem wurde derPWM erzeugende Timer2 bei 
einem High-Signal zu Beginn zum Ende mit einem Low-Signal beendet.

Hat das irgendwas mit zusätzlichen Einstellungen für die 
Advanced-Control Timer zutun?


TIM2 --__--__--__--__--__
TIM8 __________________--   (und 1)
TIM9 ________________----


/*Count the PWM-Signals: TIM8 CH2 PI6 - CN4-3 */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_Init(GPIOI, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOI, GPIO_PinSource6, GPIO_AF_TIM8);
  TIM_TIxExternalClockConfig(TIM8, TIM_TIxExternalCLK1Source_TI1, 
TIM_ICPolarity_Falling, 0);
  TIM_SelectInputTrigger(TIM8, TIM_TS_TI2FP2);

  /*Zur Darstellung am Oszilloskop: TIM8 CH1 PI5 - CN4-4*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_Init(GPIOI, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOI, GPIO_PinSource5, GPIO_AF_TIM8);


/*Count the PWM-Signals: TIM9 CH2 PA3 - CN2-3 */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_TIM9);
  TIM_TIxExternalClockConfig(TIM9, TIM_TIxExternalCLK1Source_TI1, 
TIM_ICPolarity_Falling, 0);
  TIM_SelectInputTrigger(TIM9, TIM_TS_TI2FP2);

  /*Zur Darstellung am Oszilloskop: TIM9 CH1 PA2 - CN1-37*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_TIM9);

void TIM8_Configuration(void)
{
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  TIM_OCInitTypeDef TIM_OCInitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_Period = 2000;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

  /* TIM PWM1 Mode configuration */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = arr_channel_config[1].Number_Of_Shots; 
//Number of Shots
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  TIM_OC1Init(TIM8, &TIM_OCInitStructure);

  TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);

  // Configure interrupt source as timer update
  TIM_ITConfig(TIM8, TIM_IT_CC1, ENABLE);


  TIM_ClearFlag(TIM8, TIM_FLAG_Update);

  // Configure only overflow and underflow as update source
  TIM_UpdateRequestConfig(TIM8, TIM_UpdateSource_Regular);

  // Clear update pending flag
  TIM_ClearITPendingBit(TIM8, TIM_IT_CC1);

  /* TIM8 enable counter */
  NVIC_InitStructure.NVIC_IRQChannel = TIM8_CC_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
  NVIC_Init(&NVIC_InitStructure);

  NVIC_EnableIRQ(TIM8_CC_IRQn);


}




void TIM9_Configuration(void)
{
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  TIM_OCInitTypeDef TIM_OCInitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_Period = 2000;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM9, &TIM_TimeBaseStructure);

  /* TIM PWM1 Mode configuration */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
  TIM_OCInitStructure.TIM_Pulse = arr_channel_config[2].Number_Of_Shots; 
//Number of Shots
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  TIM_OC1Init(TIM9, &TIM_OCInitStructure);

  TIM_OC1PreloadConfig(TIM9, TIM_OCPreload_Enable);

  // Configure interrupt source as timer update
  TIM_ITConfig(TIM9, TIM_IT_CC1, ENABLE);


  TIM_ClearFlag(TIM9, TIM_FLAG_Update);

  // Configure only overflow and underflow as update source
  TIM_UpdateRequestConfig(TIM9, TIM_UpdateSource_Regular);

  // Clear update pending flag
  TIM_ClearITPendingBit(TIM9, TIM_IT_CC1);

  /* TIM9 enable counter */
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_BRK_TIM9_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
  NVIC_Init(&NVIC_InitStructure);

  NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn);

}

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.