2024-07-15 08:37 AM
Hello
I am working with an STM32G474RET6, using Timer 3 in one-pulse mode with an external trigger.
Below is my Timer 3 initialization code:
static void MX_TIM3_Init(void)
{
/* USER CODE BEGIN TIM3_Init 0 */
/* USER CODE END TIM3_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_SlaveConfigTypeDef sSlaveConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* USER CODE BEGIN TIM3_Init 1 */
/* USER CODE END TIM3_Init 1 */
htim3.Instance = TIM3;
htim3.Init.Prescaler = 0;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 4097;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
{
Error_Handler();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_OnePulse_Init(&htim3, TIM_OPMODE_SINGLE) != HAL_OK)
{
Error_Handler();
}
sSlaveConfig.SlaveMode = TIM_SLAVEMODE_COMBINED_RESETTRIGGER;
sSlaveConfig.InputTrigger = TIM_TS_ETRF;
sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_NONINVERTED;
sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;
sSlaveConfig.TriggerFilter = 0xf;
if (HAL_TIM_SlaveConfigSynchro(&htim3, &sSlaveConfig) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM2;
sConfigOC.Pulse = 1;
sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM3_Init 2 */
/* USER CODE END TIM3_Init 2 */
HAL_TIM_MspPostInit(&htim3);
}
I am facing an issue in one of our systems where I suspect a very noisy trigger signal. The MCU receives a 1500 µs width positive trigger, and Timer 3 should be triggered on the rising edge.
Timer 3 clock is 64 MHz, and I have set the filter value: ETF = 0xF, which corresponds to a debounce filter value of 14µs-16µs. However, I discovered that the trigger is not detected with this setting and had to reduce the filter value below ETF = 5 to get it working.
Unfortunately, I cannot observe the actual trigger behavior with an oscilloscope because this system is installed thousands of kilometers away in Australia.
I would like to understand the trigger detection behavior of the MCU in this scenario. Specifically:
Here is some additional context:
Any insights or suggestions on how to handle this situation better would be greatly appreciated.
Thank you.
Alex
Solved! Go to Solution.
2024-07-15 03:05 PM
First, when posting code please use the "code tags" (look like "</>" in the tool bar). It makes it easier to read.
AN4776 shows an example of the filter response. It basically looks for N consecutive samples before changing the filter output state, where "N" is determined by the EFT value. If the filter output is 0, then it requires N consecutive "1" samples before outputting a 1. If the the filter output is 1, then it requires N consecutive samples of 0 before outputting a zero.
If your 1500us pulse doesn't get through the 16us filter then you have serious noise issues. Do you have external filters on the trigger signal? Shielding? Have you tested your product (in your lab) in a similar kind of environment? Industrial environments are notoriously noisy - both conducted noise through any and all cables, and radiated from motors and/or drive electronics.
If you have the luxury or loading a test program into that device, you can re-configure the timer to measure the "high" time of every pulse that it sees. Save that data to memory somewhere that you can retrieve.
2024-07-15 03:05 PM
First, when posting code please use the "code tags" (look like "</>" in the tool bar). It makes it easier to read.
AN4776 shows an example of the filter response. It basically looks for N consecutive samples before changing the filter output state, where "N" is determined by the EFT value. If the filter output is 0, then it requires N consecutive "1" samples before outputting a 1. If the the filter output is 1, then it requires N consecutive samples of 0 before outputting a zero.
If your 1500us pulse doesn't get through the 16us filter then you have serious noise issues. Do you have external filters on the trigger signal? Shielding? Have you tested your product (in your lab) in a similar kind of environment? Industrial environments are notoriously noisy - both conducted noise through any and all cables, and radiated from motors and/or drive electronics.
If you have the luxury or loading a test program into that device, you can re-configure the timer to measure the "high" time of every pulse that it sees. Save that data to memory somewhere that you can retrieve.
2024-07-16 01:23 AM
Hello
Thank you for the detailed explanation regarding the filter mechanism in AN4776 and Bob S's response.
Based on my understanding, the STM32 filter mechanism indeed counts 'N' consecutive '1's or '0's to change the filter's output state, and it does not specifically look for the input trigger edge. If this understanding is correct, it suggests that the noise characteristics we are experiencing are forcing the input signal to ground (GND) rather than to VCC. This is because our 1500 µs pulse is not recognized by the 14-16 µs filter, indicating that there are not 8 consecutive '1's within the pulse duration.
This issue appears to be unique to a specific site and has not been reproduced in our lab or at other customer sites. We have ensured that the setup and environment are consistent across different sites, which leads us to believe that the noise interference at the problematic site might be significantly different or more severe.
Thank you very much
Alex