Cómo ajustar dinámicamente un temporizador con STM32

1

Tengo este temporizador (TIM4) que está en modo PWM. Estoy emitiendo un canal PWM y quiero esperar un poco y luego tomar las últimas muestras de ADC de una conversión DMA.

TIM4 - > ARR es 4096 TIM4 - > CCR1 es dinámico, pero comienza alrededor de 200

Quiero comenzar en el flanco ascendente del pulso TIM4, esperar la mitad de los pulsos a tiempo y luego tomar las últimas y mejores muestras de DMA ... Aquí hay un fragmento de lo que estoy pasando:

Donde las cosas parecen no estar pegadas es la línea: TIM5->ARR = TIM4->CCR1/2; . Lo que es extraño, es que si pongo una constante allí, como TIM5->ARR = 20; , funciona bien ... No se dispara en medio del pulso de TIM4, pero sí se dispara a las 20 / FCLK usted esperaría.

Leí DM00236305.pdf, pero no pude entender de qué estaban hablando con los registros de Shadow, que es lo que creo que es mi problema. También intenté seguir lo que se decía aquí , pero eso también era bastante elevado, y no estaba seguro de si se aplicaba, ya que estaba hablando de comparaciones de salida en lugar de registros de recarga automática.

¿Cómo ajusto TIM5- > ARR para rastrear a la mitad de lo que hay en TIM4- > CCR1?

void TIM5_IRQHandler(void)
{
  /* USER CODE BEGIN TIM5_IRQn 0 */

    HAL_GPIO_WritePin(GPIOA, TX_Pin, SET);
    HAL_TIM_Base_Stop(&htim5);
    while(!(DMA2->LISR & DMA_LISR_TCIF0));
    motorDummy_FOC.curr_a_sense = ADCValue[0];
    motorDummy_FOC.curr_b_sense = ADCValue[1];
    update_PWM(&motorDummy_FOC);
    HAL_GPIO_WritePin(GPIOA, TX_Pin, RESET);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
  if (htim == &htim4){
    HAL_GPIO_WritePin(GPIOA, RX_Pin, SET);
    GPIOC->ODR = 0b0000000000000110;
    //TIM4->CR1 &= ~(1<<0);
    MX_TIM5_Init();
    TIM5->ARR = (TIM4->CCR1/2);
    HAL_TIM_Base_Start_IT(&htim5);
    HAL_TIM_Base_Start(&htim5);
  }

}
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim){

  if (htim == &htim4){
    GPIOC->ODR = 0b0000000000000100;
    HAL_GPIO_WritePin(GPIOA, RX_Pin, RESET);

  }
}

void update_PWM(motorFOC *c){
  if(c->curr_b_sense < c->curr_b_commanded)
  {c->i_feedback++;}
  else if(c->curr_b_sense > c->curr_b_commanded)
  {c->i_feedback--;}
  TIM4->CCR1 = c->i_feedback;
}
    
pregunta testname123

1 respuesta

2

Creo que el error que está cometiendo es detener el reloj base del temporizador en IRQHandler () y desea actualizarlo en PeriodElapsedCallback (), que se ejecutará dentro de IRQHandler ().

Lo que estás buscando es la macro __HAL_TIM_SET_AUTORELOAD

Hay macros individuales definidas en los archivos * _hal_tim.h para actualizar los valores ARR, CCR, etc. Lo único que debe hacer es tomar el valor CCR dinámicamente y actualizar la macro, no necesita detener e iniciar el temporizador ..! El mismo problema se soluciona aquí .

    
respondido por el charansai

Lea otras preguntas en las etiquetas