Regarding timer delay & Interrupt
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2018-10-25 8:44 PM
void MX_TIM5_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
htim5.Instance = TIM5;
htim5.Init.Prescaler = 84;
htim5.Init.CounterMode = TIM_COUNTERMODE_UP;
htim5.Init.Period = 99; //interrupt in 100 micro sec
// htim5.Init.Period = 50; //interrupt in 50 micro sec
htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim5) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM5)
{
/* USER CODE BEGIN TIM5_MspInit 0 */
/* USER CODE END TIM5_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_TIM5_CLK_ENABLE();
/* Peripheral interrupt init */
HAL_NVIC_SetPriority(TIM5_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(TIM5_IRQn);
/* USER CODE BEGIN TIM5_MspInit 1 */
/* USER CODE END TIM5_MspInit 1 */
}
}
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM5)
{
/* USER CODE BEGIN TIM5_MspDeInit 0 */
/* USER CODE END TIM5_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM5_CLK_DISABLE();
/* Peripheral interrupt Deinit*/
HAL_NVIC_DisableIRQ(TIM5_IRQn);
}
/* USER CODE BEGIN TIM5_MspDeInit 1 */
/* USER CODE END TIM5_MspDeInit 1 */
}
This is how i have initialised the timer now i am looking to put delay between
SetPWM(x,dutycycle);
SetPWM(y,dutycycle);
SetPWM(z,dutycycle);
delay();
SetPWM(x,0);
SetPWM(y,0);
SetPWM(z,0);
when iam using timer delay or normal delay the system is hanging as i am changing the PWM during delay is there any solution for this.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2018-10-25 9:09 PM
please explain a little better .. you are using blocking code.
You have 3 PWM channels
You want to wait some time and update the channels...
how much time ? call it, reload time
You could initialise another timer to interrupt you at the reload rate..
under that timer interrupt, you can reset the PWM and exit.
next interrupt update again and exit.
its non-blocking code.
99.999% cpu time free..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2018-10-26 12:16 AM
i Have 3 PWM channels i want to take the present dutycycle and after some delay i want to make it zero nothing but i want to blink. dutycycle may be changed continuously but not constant change in interval time that depends on user. delay is also different depends on user selection it should be between 25 to 250 ms. during blinking if change in PWM it has to take that PWM and continue blinking.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2018-10-26 12:21 AM
PWM pins iam using are PB0,PC6,PC7 in STM32F407VG Controller
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2018-10-26 12:22 AM
SetPWM(x,dutycycle);
SetPWM(y,dutycycle);
SetPWM(z,dutycycle);
delay();
SetPWM(x,0);
SetPWM(y,0);
SetPWM(z,0);
delay();
initialisation everthing is OK but i stuck at this point
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2018-10-26 12:23 AM
if iam giving contant PWM and if i write the above code it is working fine if there is a change in PWM then it is hanging
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2018-10-26 1:19 PM
can you show this routine ?
SetPWM
I would be adjusting the PWM by registers directly, not updating with HAL.
are you running multi-tasking like RTOS ?
Can you show where you are calling this routine ? SetPWM
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2018-10-26 8:36 PM
void SetPWM(uint8_t pwmID, uint16_t dutyCycle)
{
uint32_t for_var, for_var_2;
/* Helper variable to compare with last set pulse value */
uint32_t previous_pulse_value_temp = 0;
/* For local calculations */
TIM_OC_InitTypeDef sConfigOC_temporary;
sConfigOC_temporary.OCMode = TIM_OCMODE_PWM1;
sConfigOC_temporary.Pulse = 0;
sConfigOC_temporary.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC_temporary.OCFastMode = TIM_OCFAST_DISABLE;
//Setting the duty cycle here for pwm channel_1
switch(pwmID)
{
case 1:
sConfigOC.Pulse = (uint32_t)round((PERIOD_VALUE * (float)dutyCycle / 255));
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
if(HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
break;
case 2:
sConfigOC.Pulse = (uint32_t)round((PERIOD_VALUE * (float)dutyCycle / 255));
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
if(HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
/* Also effect the higher frequency test pin for green color */
sConfigOC.Pulse = (uint32_t)round((PERIOD_VALUE_NEWCONFIG * (float)dutyCycle / 255));
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
if(HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2) != HAL_OK)
{
Error_Handler();
}
break;
case 3:
// sConfigOC.Pulse = (uint32_t)(PERIOD_VALUE * dutyCycle / 255);
sConfigOC.Pulse = (uint32_t)round((PERIOD_VALUE * (float)dutyCycle / 255));
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
if(HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
/* Also effect the higher frequency test pin for blue color */
sConfigOC.Pulse = (uint32_t)round((PERIOD_VALUE_NEWCONFIG * (float)dutyCycle / 255));
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
if(HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3) != HAL_OK)
{
Error_Handler();
}
break;
default :
break;
}
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2018-10-26 8:37 PM
no iam not running the RTOS
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2019-12-27 11:08 PM
If i want to configure timer of 5 sec how can i do it
what are configuration to do ?
