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