¿Cómo usar el temporizador 3 de un STM32F030F4 en el modo de captura de entrada para medir el ancho del pulso?

4

Actualizar

Revisé el diagrama de bloques del temporizador 3 nuevamente

Parecequenohayconexiónentrechannel4ylaentradadeactivaciónTRGI.¿Estoescorrecto?

¿Puedousarelcanal4paraelmodocerrado?

preguntaoriginal

Tengolasiguienteseñalconanchodepulsovariable.(alto)

Quiero medir el ancho del pulso con un STM32F030F4 (enlace eliminado debido al límite de reputación).

La señal está conectada al Pin 14, PB1. Verifiqué que la señal se puede controlar directamente en el pin del µC, por lo que debería estar allí. Quiero usar el temporizador 3 porque su canal 4 está conectado a ese pin.

El

Capítulo 13.3.19 TIMx y la sincronización del disparador externo del manual de referencia describe un modo que es exactamente lo que estoy buscando.

  

Modo esclavo: Modo cerrado

     

El contador se puede habilitar según el nivel de una entrada seleccionada.

También hay un ejemplo para eso:

  

A.8.13 Ejemplo de código de modo cerrado

/* (1) Configure channel 1 to detect low level on the TI1 input       
by writing CC1S = ‘01’,       
and configure the input filter duration by writing the IC1F[3:0]       
bits in the TIMx_CCMR1 register (if no filter is needed,       
keep IC1F=0000). */ 

/* (2) Select polarity by writing CC1P=1 in the TIMx_CCER register */ 

/* (3) Configure the timer in gated mode by writing SMS=101       
Select TI1 as the trigger input source by writing TS=101       
in the TIMx_SMCR register. */ 

/* (4) Set prescaler to 12000-1 in order to get an increment each 250us */ 

/* (5) Enable the counter by writing CEN=1 in the TIMx_CR1 register. */ 

TIMx->CCMR1 |= TIM_CCMR1_CC1S_0; /* (1)*/ 
TIMx->CCER |= TIM_CCER_CC1P; /* (2) */ 
TIMx->SMCR |= TIM_SMCR_SMS_2 | TIM_SMCR_SMS_0 | TIM_SMCR_TS_2 | TIM_SMCR_TS_0; /* (3) */ 
TIMx->PSC = 11999; /* (4) */ 
TIMx->CR1 |= TIM_CR1_CEN; /* (5) */

Intenté modificar el ejemplo según mis necesidades y parece que:

// based on example A.8.13

/* (1) Configure channel 4 to detect low level on the TI4 input
 * by writing CC4S = ‘01’,
 * and configure the input filter duration by writing the IC1F[3:0]
 * bits in the TIMx_CCMR1 register (if no filter is needed,
 * keep IC1F=0000). */

/* (2) Select polarity by writing CC4P=1 in the TIMx_CCER register */

/* (3) Configure the timer in gated mode by writing SMS=101
 * Select TI1 as the trigger input source by writing TS=101
 * in the TIMx_SMCR register. */

/* (4) Set prescaler to 12000-1 in order to get an increment each 250us */

/* (5) Enable the counter by writing CEN=1 in the TIMx_CR1 register. */

TIM3->CCMR2 |= TIM_CCMR2_CC4S_0; /* (1) */
TIM3->CCER |= TIM_CCER_CC4P; /* (2) */
TIM3->SMCR |= TIM_SMCR_SMS_2 | TIM_SMCR_SMS_0 | TIM_SMCR_TS_2 | TIM_SMCR_TS_0; /* (3) */
TIM3->PSC = 11999; /* (4) */
TIM3->CR1 |= TIM_CR1_CEN; /* (5) */

Espero que el registro de contador del temporizador 3 TIM3->CNT cambie con el tiempo a medida que los pulsos se activan.

Sin embargo, TIM3->CNT no cambia en absoluto.

Aquí está la configuración que sospecho que es errónea

GPIO

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(tim_baseHandle->Instance==TIM3)
  {
  /* USER CODE BEGIN TIM3_MspInit 0 */

  /* USER CODE END TIM3_MspInit 0 */
    /* Peripheral clock enable */
      __TIM3_CLK_ENABLE();

    /**TIM3 GPIO Configuration
    PB1     ------> TIM3_CH4
    */
    GPIO_InitStruct.Pin = GPIO_PIN_1;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* USER CODE BEGIN TIM3_MspInit 1 */

  /* USER CODE END TIM3_MspInit 1 */
  }
}

temporizador

/* TIM3 init function */
void MX_TIM3_Init(void)
{

  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_SlaveConfigTypeDef sSlaveConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
  TIM_IC_InitTypeDef sConfigIC;

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 0;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 0;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  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_IC_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }

  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_GATED;
  sSlaveConfig.InputTrigger = TIM_TS_ITR0;
  if (HAL_TIM_SlaveConfigSynchronization(&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();
  }

  sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
  sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
  sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
  sConfigIC.ICFilter = 0;
  if (HAL_TIM_IC_ConfigChannel(&htim3, &sConfigIC, TIM_CHANNEL_4) != HAL_OK)
  {
    Error_Handler();
  }

}

Al depurar, puedo ver los cambios de configuración y los valores de lectura / escritura, pero el registro del contador no está aumentando.

    
pregunta cross

1 respuesta

1

Parece que no es posible usar el modo de captura de entrada, porque el canal 4 no se puede usar como activador.

Me rindo. Hay demasiados ejemplos diferentes en la web que utilizan demasiadas herramientas de configuración, cadenas de herramientas, etc.

    
respondido por el cross

Lea otras preguntas en las etiquetas