es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Luchando contra el sobreflujo-subflujo del temporizador de interfaz del codificador STM32 (Nucleof303RE)

Estoy escribiendo código para un codificador rotativo, y estoy tratando de usar la función de encoder en los temporizadores de propósito general. Esto funciona, hasta cierto punto. El registro CNT se reinicia al valor de ARR cuando se activa el contador descendente cuando CNT == 0.

En otras palabras: El contador no deja de contar hacia abajo en cero, en su lugar salta al valor de ARR. Quiero que el contador permanezca en cero, incluso si el codificador rotativo se gira en sentido contrario a las agujas del reloj (lo que normalmente disminuiría el valor). En última instancia, me gustaría que el contador no se recargue cuando se alcanza el valor ARR también, sino que permanezca allí. Pero eso será el siguiente paso.

Siento que hay ajustes en la hoja de datos que me permitirían lograr esto, sin embargo después de horas no puedo encontrarlos. A continuación se muestra mi código para inicializar el codificador rotativo. Su pin de reloj está conectado a pa0 y su pin dt a pa1. El valor de CNT se imprime en el bucle principal.

Editar: Manual de referencia: https://www.st.com/resource/en/reference_manual/dm00043574-stm32f303xb-c-d-e-stm32f303x6-8-stm32f328x8-stm32f358xc-stm32f398xe-advanced-arm-based-mcus-stmicroelectronics.pdf

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para que el contador se mantenga en cero en lugar de volver a cargar el valor ARR cuando se gira el encoder en sentido contrario a las agujas del reloj, se necesita cambiar la dirección del contador. Esto se puede lograr estableciendo el bit DIR en el registro TIMx_CR1 en “1”. Esto hará que el contador cuente hacia arriba en lugar de contar hacia abajo y volver a cargar el valor ARR cuando alcanza cero.

    Para lograr el siguiente paso de hacer que el contador se mantenga en el valor ARR en lugar de volver a cargar, se debe establecer el bit UDIS en el registro TIMx_CR1 en “1”. Esto desactivará el evento de actualización y el contador no volverá a cargar el valor ARR cuando lo alcance.

    Además, también se puede establecer el bit URS en el registro TIMx_CR1 en “1” para permitir que el contador se actualice solo mediante el evento de desbordamiento o subdesbordamiento, y no por ningún otro evento como un evento de captura o comparación.

    Aquí está el código actualizado para inicializar el encoder rotativo:

    c++
    void encoder_init(uint32_t max_value)
    {
    RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
    GPIOA->MODER |= (1 << 1) | (1 << 3);
    GPIOA->AFR[0] |= (1 << 0) | (1 << 4);
    TIM2->ARR = max_value;
    TIM2->CCMR1 |= (TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0);
    TIM2->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC2P);
    TIM2->SMCR |= TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1;
    TIM2->CR1 |= TIM_CR1_CEN | TIM_CR1_DIR | TIM_CR1_UDIS | TIM_CR1_URS;
    }

Comments are closed.