2010-04-27 03:10 AM
fastest way to generate output waveform
2011-05-17 04:48 AM
Do some efforts its not that hard just take help from STM32 library code
If still not get sucess ''ll put some code fot fast PWM with period 50 usec(yes usec not msec...) and with variable duty cycle output.2011-05-17 04:48 AM
''''I''ll put some code for fast PWM''
But he didn't want PWM; just a fixed-period, fixed duty cycle - and not very fast at that!2011-05-17 04:48 AM
I got it working using TIMx as Toggle, here is my init and interrupt routine. I choosed a prescaler value and parametrized CC1 register to have different freq/duty cycle. In the service routine I select the counter toggle value in order to have the right duty cycle. Is that the better way to do this?
Would you explain to me what is the PWM? I'm just learning and I really get lost. Thanks and best regards. Filippovoid Waveform_On(void)
{ NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; /* TIM3 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);/* GPIOA clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB| RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); /* Enable the TIM3 global Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);// timer out GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);
// timer init /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 65535; TIM_TimeBaseStructure.TIM_Prescaler = TIM3_PRESCALER; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/* Output Compare Toggle Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = TIM3_CCR1_ON; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OC1Init(TIM3, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);
/* TIM enable counter */
TIM_Cmd(TIM3, ENABLE);/* TIM IT enable */
TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);}
#define TV0ON 5 // ms
#define TV0_DUTYCYCLE 10 // in %#if defined(CORE_CLOCK_36MHZ)
#define TIM3_PRESCALER 72 #define TIM3_CCR1_ON (36000000 / 2000 / TIM3_PRESCALER * TV0ON) #define TIM3_CCR1_OFF (TIM3_CCR1_ON * ((100-TV0_DUTYCYCLE)/TV0_DUTYCYCLE)) #elif defined(CORE_CLOCK_8MHZ) #define TIM3_PRESCALER 16 #define TIM3_CCR1_ON (8000000 / 2000 / TIM3_PRESCALER * TV0ON) #define TIM3_CCR1_OFF (TIM3_CCR1_ON * ((100-TV0_DUTYCYCLE)/TV0_DUTYCYCLE)) #endifvoid TIM3_IRQHandler(void)
{ if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET) { TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 ); capture = TIM_GetCapture1(TIM3);if (V0STATUS)
{ V0STATUS = 0; TIM_SetCompare1(TIM3, capture + TIM3_CCR1_ON ); } else { V0STATUS = 1; TIM_SetCompare1(TIM3, capture + TIM3_CCR1_OFF ); }}
}
2011-05-17 04:48 AM
PWM, in this context, is
P
ulseW
idthM
odulation